UIテスト時はアニメーションをオフにしたり、アプリ初回起動時のダイアログを非表示にするなどの制御をしたいとき、UIテストコード側で以下のように起動時引数を与え、アプリコード側でその引数を参照して制御を行うことができます。
// UIテストコード let app = XCUIApplication() app.launchArguments.append("disableAnimations") // アプリコード if ProcessInfo.processInfo.arguments.contains("disableAnimations") { UIView.setAnimationsEnabled(false); // アニメーションを無効化 }
また、XcodeのSchemeにも起動時引数の設定項目があります。
この2つの関係性がいまいちわかっていなかったので調べてみました。
RunアクションのArguments Passed On Launchを指定する
Scheme設定画面の左側でRunを選択し、Arguments Passed On LaunchにrunAction
という引数を追加します。
そして、⌘+Rでアプリを起動します。
アプリコード内でProcessInfo.processInfo.arguments
を参照すると、runAction
が含まれています。
// アプリコード ProcessInfo.processInfo.arguments.contains("runAction") // true
Runアクションなので、ここではUIテストコードは関係ないですね。
TestアクションのArguments Passed On Launchを指定する
Scheme設定画面の左側でTestを選択し、Arguments Passed On Launchでは「Use the Run action's arguments and environment variables」にチェックを入れておきます。
そして、⌘+UでUIテストを実行します。
アプリコード内でProcessInfo.processInfo.arguments
を参照すると、runAction
は含まれていません。
一方、UIテストコード内でProcessInfo.processInfo.arguments
を参照すると、runAction
が含まれています。
// アプリコード ProcessInfo.processInfo.arguments.contains("runAction") // false // UIテストコード ProcessInfo.processInfo.arguments.contains("runAction") // true
TestアクションでのArguments Passed On Launchの指定は、UIテストコード側に反映されるんですね。
今度は、「Use the Run action's arguments and environment variables」のチェックを外し、testAction
という引数を追加してみます。
そして、⌘+UでUIテストを実行します。
アプリコード内でProcessInfo.processInfo.arguments
を参照すると、testAction
は含まれていません。
一方、UIテストコード内でProcessInfo.processInfo.arguments
を参照すると、testAction
が含まれています。
なお、Runアクションで設定しているrunAction
は含まれていません。
// アプリコード ProcessInfo.processInfo.arguments.contains("testAction") // false ProcessInfo.processInfo.arguments.contains("runAction") // false // UIテストコード ProcessInfo.processInfo.arguments.contains("testAction") // true ProcessInfo.processInfo.arguments.contains("runAction") // false
XCUIApplication.launchArgumentsはどうなっているか?
TestアクションでArguments Passed On LaunchにtestAction
を指定した状態で、UIテストコード側でXCUIApplication.launchArguments
を参照するとどうなっているでしょうか?
見てみたところ、中身は空でした。
// UIテストコード XCUIApplication().launchArguments // []
まとめ
XCUIApplication.launchArgumentsとSchemeで設定するArguments Passed On Launchは直接の関係はないことがわかりました。
UIテスト時のこれらの設定については以下のようにまとめることができます。
- UIテストコードに起動時引数を与える: Arguments Passed On Launch
- アプリコードに起動時引数を与える: XCUIApplication.launchArguments
UIテストのコードが増えてくると、特定のSchemeのときだけ引数を与えて、UIテストコードの制御を行いたいことがあります。
そのようなときにはArguments Passed On Launchを使えば良いことがわかりました。