WWDC 2021のテスト関係のセッションまとめ2 - Diagnose unreliable code with test repetitions
テスト関係のセッションは次の2種類があります。
- Embrace Expected Failures in XCTest
- Diagnose unreliable code with test repetitions
本稿ではこれらのセッションのうち後者について次に紹介していきます。
前者については次の記事で紹介しています。
Diagnose unreliable code with test repetitions
Xcode 13からテストの繰り返し実行ができるようになりました。
本セッションでは、その機能について説明をしています。
WWDC2021のセッション動画は次です。
セッションの(軽い)内容
セッションの内容を軽くまとめつつ、多少補足すると次のような感じです。
(太字が私の注釈的なものです)
信頼性の低いコードを実行するとテストが失敗することがあります。
その原因の例としては、次のようなものがあります。
- 競合状態
- グローバルステート
- 環境起因
- 外部サービスとの通信
このようなテストは常に失敗するわけでもなく、再現が難しいこともあるため、調査が難しい問題と言えます。
flakyなテストは、原因の特定が大変なテストで、それらを放置していると自動テストの信頼性が下がってしまいます。
これらの調査をする方法の1つとしては、テストを繰り返し実行することです。
今までは繰り返し実行は出来ず、自分で何度も動かすとか、何かしら工夫をしてCI環境でずっと動かすといった行為が必要でした。
Xcode13で追加された「テストの繰り返し」で、止める際の条件を指定して、繰り返しテストを実行することができます。
テストがストップする条件としては次の3つがあります。
1. 結果に関係なく固定回数の実行
2. 失敗するまで実行
3. 成功するまで実行
上記の条件とは別に次を設定できます。
- 必須:最大試行数
- 任意:「失敗時に止める」「テストのたびに再launch」
これらはXcodeの画面から指定することができます。
Xcode13はまだβリリースなので、Xcodeの画面のスクリーンショットは正式リリース後におこないます。
セッションでは、サンプルアプリを元にこの機能の利用方法を説明しています。
Xcode Cloudでたびたび、このサンプルアプリのテストコードが失敗していることに気づき、さらなる情報を得るためにXcode13からの本機能を利用して問題が起きるかを再現させます。
そして、ローカルでテストの再実行をおこない実際に手元でも同等のエラーが起きていることを再現させます。
「失敗時に止める」を設定することで、デバッガでエラーをキャッチし問題を見つけることが出来ました。
本件の問題は、Swift5.5で追加されるasync/awaitを利用しての解決方法を説明しています。
こうして対応をおこない、再度テストの再実行をおこなうことで問題が解決していることを確認します。
という流れです。
実際、昨年から今年にかけての新機能では自動テストの失敗時の原因を特定するための機能が追加されています。
これらにより自動テストの運用がしやすくなってきているともいえます。
また、本機能は上記のようなXcodeからの実行だけでなくxcodebuildコマンドでもサポートしています。
xcodebuildコマンドにおいては-test-itreationsで実行回数を指定し、さらに追加オプションを指定することで同等のことが出来ます。
おわりに
機能としては、「自動テストの繰り返し実行ができるようになった」という点なので、そこまでセッションも長くはありません。
この機能は、自動テストを運用していく上では非常に助かる機能ともいえます。
上述してありますが、このような自動テストを使い続けるための機能が近年増えています。
これらを利用することで、より自動テストを活用していきたいですね!