2016-04-12 10 views
4

私はXcode 7.3でUIテストを作成していますが、最近は起動引数を追加してアプリ内でテストコードを有効にしたいと考えていました。私は最初にいくつかの人々が様々な投稿で行ったようにXCUIApplication().launchArgumentsを設定しようとしましたが、うまくいきませんでした。Xcode 7.3でUITestingのlaunchArgumentsが動作しない

APIドキュメントに記載されていても、UIテストでlaunchArgumentslaunchEnvironmentの両方を設定できないようです。

さらに、UIテストのスキームで起動引数と環境変数を設定しようとしたとき、ユニットテストやアプリケーションの実行時のように、アプリケーションに渡されなかった場所もあります。

ここに私がこれを証明した簡単なテストのコピーがあります。これらのテストはすべて失敗します。

import XCTest 

class LaunchDebugUITests: XCTestCase { 

    func testLaunchArgumentsSetting() { 
     XCUIApplication().launchArguments = ["abc"] 
     print("Arguments \(XCUIApplication().launchArguments)") 
     XCTAssertTrue(XCUIApplication().launchArguments.contains("abc")) 
    } 

    func testLaunchArgumentsAppending() { 
     XCUIApplication().launchArguments.append("abc") 
     print("Arguments \(XCUIApplication().launchArguments)") 
     XCTAssertTrue(XCUIApplication().launchArguments.contains("abc")) 
    } 

    func testLaunchEnvironmentSetting() { 
     XCUIApplication().launchEnvironment = ["abc":"def"] 
     print("Environment \(XCUIApplication().launchEnvironment)") 
     XCTAssertEqual("def", XCUIApplication().launchEnvironment["abc"]) 
    } 

    func testLaunchEnvironmentAppending() { 
     XCUIApplication().launchEnvironment["abc"] = "def" 
     print("Environment \(XCUIApplication().launchEnvironment)") 
     XCTAssertEqual("def", XCUIApplication().launchEnvironment["abc"]) 
    } 

} 

他に誰かがこれに遭遇しましたか?あなたは仕事をしていますか?

答えて

2

あなたもアプリを起動し、アプリを引数にチェックインする必要があります。ここでは、あなたの使用にどこかに、より適切な(そしておそらくもそれを出荷避けるために#ifdef DEBUG ... #endifに包まれた引数のチェックをお勧めします

int main(int argc, char *argv[]) { 
    NSArray *arguments = [[NSProcessInfo processInfo] arguments]; 

    if ([arguments containsObject:@"shouldDoBar"]) { 
     doBar(); 
    } 

    if ([arguments containsObject:@"shouldDoFoo"]) { 
     doFoo(); 
    } 
    ... 
} 

あなたのアプリで次に

func testFooBar() { 
    // given 
    app.launchArguments = ["shouldDoBar", "shouldDoFoo"] 

    // when 
    app.launch() 

    // then 
} 

...私はそれを行う方法です)。

+0

うん。すべてのことを、引数が合格していない場合は実行しました。これが最初にこのバグに入ったのです。私はテストでargを設定し、アプリがそれを検出して応答させたいと思っていました。私の場合、ユーザーのデフォルトをクリアする。 – drekka

+0

アップルが私に連絡を取り、あなたの答えは正しい。私が最初に読んだとき、それがうまくいく理由は明らかではなかったので、以下でより詳細な説明をしました。 – drekka

11

アップルが私に連絡して、私にXCUIApplication()を間違って使っていると言った。

あなたはXCUIApplication()複数回を呼び出すべきではありません。

私が読んだブログの多くは、この電話を何回も繰り返し、ほとんどの場合それは問題ではありません。実際、多くのブログ記事では、シングルトンにアクセスしているような機能が扱われています。私は間違って見えたとしてこれが間違っていたと感じましたが、私は他の人が正しいと思ったでしょう。

しかし、そうではありません。シングルトンにアクセスするのではなく、呼び出されるたびに実際に新しいXCUIApplicationインスタンスを作成します。したがって、私は1つのインスタンスで起動引数を設定していたので、もう1つを起動してを起動していたので、私のコードは失敗していました。

だから私のテストでは、実際にこのように見ている必要があります。

func testLaunchArgumentsSetting() { 
    let app = XCUIApplication() 
    app.launchArguments = ["abc"] 
    print("Arguments \(app.launchArguments)") 
    XCTAssertTrue(app.launchArguments.contains("abc")) 
    app.launch() 
} 
+0

救い主!同じミスをしていた!ありがとう! – JoriDor

+1

重要なことは、launchArgumentsが設定されているローカル変数をlaunch()することです。これは私に何時間もの歯を痛めさせた。このブログは今日を救った:http://drekka.ghost.io/xcuiapplication-youre-probably-doing-it-wrong/ –

+0

ああ私の神は、この問題で最後の時間を過ごすありがとう – schirrmacher

関連する問題