web-dev-qa-db-ja.com

XCUIApplicationで設定されたlaunchEnvironmentとlaunchArgumentsにアクセスし、XCodeでUIテストを実行する方法

UIテストsetUp()で、XCUIApplicationインスタンスに属性を設定しようとしました

let app = XCUIApplication()
app.launchEnvironment = ["testenv" : "testenvValue"]
app.launchArguments = ["anArgument"]
app.launch()

didFinishLaunchでUITestを実行するときにこれらを画面に表示しようとしました

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    if launchOptions != nil {
        for (key, value) in launchOptions! {  
            let alertView = UIAlertView(title: key.description, message: value.description, delegate: nil, cancelButtonTitle: "ok")
            alertView.show()
        }
    }

しかし、設定した引数と環境を見つけることができないようです。誰でもそれらを手に入れる方法を知っていますか?

41
bogen

UIテスト(Swift)でlaunchArgumentsを設定した場合:

_let app = XCUIApplication()
app.launchArguments.append("SNAPSHOT")
app.launch()
_

次に、以下を使用してアプリでそれらを読み取ります。

Swift 2.x

_if NSProcessInfo.processInfo().arguments.contains("SNAPSHOT") {
   // Do snapshot setup
}
_

Swift 3.

_if ProcessInfo.processInfo.arguments.contains("SNAPSHOT") {
}
_

環境変数を設定するには、代わりにそれぞれlaunchEnvironmentNSProcessInfo.processInfo().environmentを使用します。

56
Joey C.

Joey C.の答えに基づいて、アプリで生の文字列を使用しないようにするための小さな拡張機能を作成しました。これにより、タイプミスの問題を回避し、オートコンプリートを取得できます。

extension NSProcessInfo {
    /**
     Used to recognized that UITestings are running and modify the app behavior accordingly

     Set with: XCUIApplication().launchArguments = [ "isUITesting" ]
     */
    var isUITesting: Bool {
        return arguments.contains("isUITesting")
    }

    /**
     Used to recognized that UITestings are taking snapshots and modify the app behavior accordingly

     Set with: XCUIApplication().launchArguments = [ "isTakingSnapshots" ]
     */
    var isTakingSnapshots: Bool {
        return arguments.contains("isTakingSnapshots")
    }
}

この方法で使用できます

if NSProcessInfo.processInfo().isUITesting {
   // UITesting specific behavior,
   // like setting up CoreData with in memory store
}

さらに進むと、おそらくlaunchArgumentsを設定するときにUITestで再利用できる列挙にさまざまな引数を入れる必要があります。

16
Nycen

LaunchArgumentsとObjective-Cの例を次に示します。

if ([[NSProcessInfo processInfo].arguments containsObject:@"SNAPSHOT"]) {
        //do snapshot;
}

迅速:

    let arguments = ProcessInfo.processInfo.arguments
    if arguments.contains("SNAPSHOT") {
        //do snapshot
    }
8

XCUIApplication.launchArgumentsに渡される引数はUserDefaultsからも利用できることに注意することも興味深いです。

XCTestCaseで

let app = XCUIApplication()
app.launchArguments.append("-ToggleFeatureOne")
app.launchArguments.append("true")
app.launch()

テスト対象のターゲットで

UserDefaults.standard.bool(forKey: "ToggleFeatureOne") // returns true

ここから、UserDefaultsに拡張機能を作成して、実行時の便利な切り替えを提供できます。

これは、Xcodeスキームの「起動時に渡される引数」が使用するメカニズムと同じです。起動引数とUserDefaultsへの影響は、 設定と設定プログラミングガイド で説明されています。

7
Jessedc

起動引数には、2つの別個の引数として渡します。

let app = XCUIApplication()  
app.launchArguments.append("-arg")  
app.launchArguments.append("val")  
app.launch()

here から取得。

6
Avi Cohen

いくつかの詳細に留意してください。まず、XCUIApplictionはシングルトンではないため、XCUIApplication().arguments.append("myargument")を呼び出してからXCUIApplication().launch()を呼び出すと、引数は送信されません。 ここで確認してください

第二に、アプリを起動した後に引数を変更しても機能しない場合、新しい引数が次の実行に送信されます。

私はこれがObjective-Cでどのように機能するかを知っています

NSDictionary *environment = [[NSProcessInfo processInfo] environment];
3
Ceetn

スキーマからXCUITesに環境変数を渡す必要がある場合、XCTestCase-> app.launchEnvironmentオブジェクトを、この方法の各テストクラスで変更します。

Swift

override func setUp(){
    app.launchEnvironment = ProcessInfo.processInfo.environment
}
1
Maetschl