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」にするとテストの実行時間に制限をかけることができます。

スクリーンショット 2020-03-28 7.29.46

テストの実行時間のデフォルト時間は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分以上であればテストが失敗するはずです。
テストを実行したときの結果は次のとおりです。

スクリーンショット 2020-03-28 10.58.05

このように実行時間を過ぎている場合はテストが失敗します。
今回は特定のテストケース内でタイムアウト値を指定していますが、そのテストクラス全体に対してsetUp時に設定するのもいいでしょう。


テストのスキップ

テストのスキップができるAPIが追加されました。

自動テストが「特定条件のとき」「特定条件のとき以外」にスキップするAPIが追加されました。
スキップしたテストは「成功」「失敗」とは別に記録されます。
参照:https://note.com/tarappo/n/na357aeefabe9

サンプルコードとして次を用意しました。

func testExample() throws {
    // ここに何かしらあれば実行されます

    try XCTSkipIf(AuthManager.canAccessServer == false, "アクセス不可")
    // 処理
}

なお、このスキップするAPIが呼び出されるまではテストがスキップ扱いにはなりません。
そのため、このサンプルコードでXCTSkipIfより前の箇所は実行されます。

Xcodeでのテストの実行結果は次のようになります。
スキップのアイコンが表示され、指定したメッセージが表示されます。

スクリーンショット 2020-03-27 7.34.38

レポート結果は次のような感じです。

スクリーンショット 2020-03-27 7.35.38

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)のテストの実行の前にアプリを再インストールをおこないます。

このように再インストールがなくなったことにより特にテストケースが多い場合にテストの実行時間の削減につながります。



この記事が気に入ったらサポートをしてみませんか?