XCTestでUITestを実行した時に、一つのテストケースしか定義していないのに、何回かアプリが起動したりしていて気になったので、その無効方法を調べてみました。
前提
Xcode16.3
事象の内容
問題のテスト結果を確認してみると、一つのテストケースで、画面の向きや画面の明暗(Appearance)の設定毎のテストを全て実行していました。
実際のテストコードは以下の様な感じです。
final class SampleTest: XCTestCase {
override class var runsForEachTargetApplicationUIConfiguration: Bool {
true
}
override func setUpWithError() throws {
continueAfterFailure = false
}
func testExample() throws {
// UI tests must launch the application that they test.
let app = XCUIApplication()
app.launch()
}
}
結論
この事象の無効方法をサクッと説明すると、以下コードのreturnの値をfalse
にするだけで良さそうです。
override class var runsForEachTargetApplicationUIConfiguration: Bool {
true
}
公式のドキュメントによると、runsForEachTargetApplicationUIConfiguration
は、プロジェクトの設定を読み取り、以下設定毎にlaunch()
時に反復的にテストを実行する様です。
- 外観(例:ライトモードまたはダークモード)
- 向き(縦向き、横向きなど)
- ローカリゼーション(例、または)en_USzh_CN
デフォルトではfalse
になっている様なので、この挙動を無効にしたい場合は、runsForEachTargetApplicationUIConfiguration
のoverrideメソッド定義を削除するだけでも良いです。
一つのテストケースで複数のUI設定を検証できること自体は、非常に強力な機能と思ったので、テストの実行時間が膨らむことが許容できれば使うのはアリと思いましたが、
それでもlaunch()
毎に複数実行されるので、この機能をONにする場合はlaunch()
は不必要に行わない方が良さそうですね。
とはいえ、UITestターゲットを作成時にデフォルトで存在するUITestケースは上記のテストコードの様になっていて、私はそのまま使用してしまっていたのでこの挙動を知らずに変にハマってしまいました。
今回の知見がどなたかの参考になれば幸いです。