Xode 11.4の「Testing」から「テストの実行時間の制限」と「テストのスキップ」の紹介
Xcode 11.4がリリースされました。
今回は「Testing」の項目がある程度あるので、その情報をまとめたいと思います。
事前資料
Betaの段階で次の記事をnoteに書きました。
一部についてはこの記事を参考にしてもらえればと思います。
この記事では、Betaの関係で掲載してなかったスクリーンショットやコードを特に掲載していません。
それらがあったほうがわかりやすい内容もあったので、本稿では次について追加で説明をしていこうと思います。
- テストの実行時間の制限
- テストのスキップ
テストの実行時間の制限
テストの実行時間に制限をかけることができるようになりました。
xcodebuildのオプションまたはXcode11から追加された「Test Plans」でも「Test Timeouts」オプションで設定することができます。
参照:https://note.com/tarappo/n/na357aeefabe9
Test Plansの「Test Execution」の項目で「Test Timeouts」という設定が追加されています。
これを「On」にするとテストの実行時間に制限をかけることができます。
テストの実行時間のデフォルト時間は10分になります。
* The default value is 10 minutes.
open var executionTimeAllowance: TimeInterval
また、指定した値は最も近い分の値に切り上げられます。
そのため、たとえば121を指定したら3分指定となります。
Note that the value you supply will be rounded up to the nearest minute value. Also note that a test
「Test Timeouts」をOnにし、次のようなテストコードを用意したとします。
// サンプルコード
func testExample() throws {
executionTimeAllowance = 120 // タイムアウト値は2分
sleep(121) // 2分1秒待機
XCTAssert(true)
}
この場合、テストの実行時間が2分以上であればテストが失敗するはずです。
テストを実行したときの結果は次のとおりです。
このように実行時間を過ぎている場合はテストが失敗します。
今回は特定のテストケース内でタイムアウト値を指定していますが、そのテストクラス全体に対してsetUp時に設定するのもいいでしょう。
テストのスキップ
テストのスキップができるAPIが追加されました。
自動テストが「特定条件のとき」「特定条件のとき以外」にスキップするAPIが追加されました。
スキップしたテストは「成功」「失敗」とは別に記録されます。
参照:https://note.com/tarappo/n/na357aeefabe9
サンプルコードとして次を用意しました。
func testExample() throws {
// ここに何かしらあれば実行されます
try XCTSkipIf(AuthManager.canAccessServer == false, "アクセス不可")
// 処理
}
なお、このスキップするAPIが呼び出されるまではテストがスキップ扱いにはなりません。
そのため、このサンプルコードでXCTSkipIfより前の箇所は実行されます。
Xcodeでのテストの実行結果は次のようになります。
スキップのアイコンが表示され、指定したメッセージが表示されます。
レポート結果は次のような感じです。
xcodebiuldで実行したときのログは次のように表示されます。
このようにskippedと表示されるようになりました。
Test Case '-[sampleTests.sampleGyouza testExample]' skipped (0.006 seconds).
Test Suite 'sampleGyouza' passed at 2020-03-28 11:25:51.921.
Executed 1 test, with 1 test skipped and 0 failures (0 unexpected) in 0.006 (0.007) seconds
fastlaneのscan(内部的にxcprettyを使っています)でテストを実行している人も多いかと思いますが、現時点ではこの出力形式には対応してないようなので、JUnit.xml形式でテスト結果を出力してもスキップとしてレポートは出力されないようです。
おまけ
UIテストの高速化
今までは各テストのたびにテスト対象のターゲットが再度インストールされていましたが、Xcode11.4からテスト対象のターゲットが1回だけインストールされることにより、UIテストが高速化します。
参照:https://note.com/tarappo/n/na357aeefabe9
実際にXcode11.4でUIテストを試してみました。
let app = XCUIApplication()
override func setUpWithError() throws {
app.launch()
continueAfterFailure = false
}
// (1)
func testExample1() {
//省略
}
// (2)
func testExample2() {
//省略
}
テストを実行すると次のようになります。
- アプリのインストール
- アプリの起動
- (1)のテストの実行
- アプリの起動
- (2)のテストの実行
この流れがXcode11.4未満の場合だと、(2)のテストの実行の前にアプリを再インストールをおこないます。
このように再インストールがなくなったことにより特にテストケースが多い場合にテストの実行時間の削減につながります。
この記事が気に入ったらサポートをしてみませんか?