Xcode 11.4 Betaのリリースノートの「Testing」の項目をいくつかピックアップして紹介

Xcode 11.4 Betaがリリースされて、この記事を公開したタイミングではBeta3までリリースされています。
次がリリースノートですが「Testing」の項目を見るとある程度あります。
なお、このリリースノートはBeta3なため、そのうちリンク切れになると思うのでリリースノート全体のリンクも貼っておきます。


このXcode11.4 Betaの「Testing」の内容と追加されたAPIドキュメントを読んでみました。
その中からいくつかをピックアップしつつ紹介します。

注意点としては次のとおりです。
 - Betaですので、内容が変更される可能性はあります。
 - Betaですので、Xcodeのキャプチャなどは公開せず公開されている情報のみを扱っています。

Xcode11.4が正式リリースされたらXcodeのキャプチャ付きで紹介したいと思います。

次に書いてある内容はすべて「Testing」の項目にあるものです。

テストの実行時間の制限

テストの実行時間のタイムアウト値を設定することができるようになりました。
テストの実行時間の制限をオンにするには、xcodebuildのオプションまたはXcode11から追加された「Test Plans」でも「Test Timeouts」オプションで設定することができます。

テストの実行時間の制限がオンになっている場合、実行時間のタイムアウト値としてはデフォルトの値が設定されています。
この値を変更する場合は、上記のリンク先にあるexecutionTimeAllowanceを使用します。

設定されている実行時間以上になった場合はテストが失敗します。
(Test Plans単位で実行時間の上限が設定できたら良かった気がしますが、設定できなそうな気配がしますね)


ユーザーデータ(保護されたリソース)への認可のリセット

写真やBluetoothなどへアクセスする機能を利用しようとしたらに、ユーザーへ確認ダイアログが表示されます。このダイアログは、初回アクセス時にOKとすると次からは表示されません。

このダイアログが表示されるようなリソースとしてはどのようなものがあるかは次からわかります。

この認可のステータスをリセットをすることができるAPI(resetAuthorizationStatus(for:))が追加されました。
これによりため、初回アクセス時におけるフローをテストしやすくなります(しかしresetはあるものの現時点ではgrantのAPIはないみたいです。私としてはそのAPIのほうが先に欲しいところではありました)。

なお、simctlコマンド(シュミレーター)でも今回から同様の機能が追加されています。
こちらでは、次のようにgrantとresetの両方が用意されています。

xcrun simctl privacy <device> grant photos com.example.app
xcrun simctl privacy <device> reset all com.example.app

エラーのThrow

Xcode11.4からXCTestの新しいテンプレートファイルは、すべてのテストケースにthrowキーワードが含まれるようになりました。
テストケースでエラーがThrowされた場合はテストの失敗とすることができます。

他にテストケースの前に実行されるsetUp()やテストケースの後に実行されるtearDown()のかわりに利用出来る2つのAPIが追加されました。

setUp()のかわりにsetUpWithError()、tearDown()のかわりにtearDownWithError()でoverrideすることによりエラーがThrowされた場合はテストを失敗とすることが出来ます。

テストのスキップ

RSpecではskipがあり、JUnitやSpockではIgnoreがあります。
今回、XCTestでも同様にテストのスキップができるようになりました。

自動テストが「特定条件のとき」「特定条件のとき以外」にスキップするAPIが追加されました。
スキップしたテストは「成功」「失敗」とは別に記録されます。

なお、リリースノートに載っているサンプルコードは次のような感じです。

func test_canAuthenticate() throws {
   XCTSkipIf(AuthManager.canAccessServer == false, "Can't access server")
   // Perform test…
}

このように特定条件のときにテストをスキップさせることが出来ます。

これによってサンプルコードにあるような、特定環境で実行している場合はあるテストをスキップさせるとかといったことができます。
サンプルコードを見るとテストコード内で呼び出すのでsetUp()は呼び出されそうですね。

よく分からなかったこと

The XCTAssertEqualWithAccuracy and XCTAssertNotEqualWithAccuracy APIs now support all FloatingPoint types. (57523034)

この2つのAPIはすでにheaderファイルを見るとXcode9ぐらいからdeprecatedになっていて「renamed: "XCTAssertEqual(_:_:accuracy:file:line:)"」となっているように思うのですが、この対応はなぜ入ったのでしょう。

おまけ - UIテストの高速化

今までは各テストのたびにテスト対象のターゲットが再度インストールされていましたが、Xcode11.4からテスト対象のターゲットが1回だけインストールされることにより、UIテストが高速化します。

最近、Testing周りは年に1度のバージョンアップのタイミングだけでなくこのようなタイミングでもいろいろと追加・改善されています。

今回のリリースノートにあるような機能が使えるXcode11.4のリリースも楽しみですね。

Xcode11.4がリリースされたら今回紹介したものの実挙動含めて紹介できればと思います。

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