Targeted Auto Retryは、テストの不安定さに対処するためのEbayのアプローチである。これは、継続的インテグレーションパイプラインを不安定なテストステップに対してより回復力のあるものにすることを目的としたものである。このアプローチを簡単に使用できるようにするために、Ebayは、Xcodeユニットテストフレームワークで使用できる、Swift言語用の軽量フレームワークをオープンソース化した。
不安定なテストとは、アプリコードのバグに直接関係しない何らかの理由で失敗する可能性のあるテストである。不安定さの典型的な原因は、たとえば、アプリの起動時のタイミングの問題、データキャッシュ、不適切なテストセットアップ、ネットワークリクエストの失敗、テスト実装の微妙なバグなどである。
不安定なテストは、発見されて解決されるまで開発をブロック/遅延させる可能性があります。問題は、テストが失敗したのか、それとも不安定なのかがわからないことです。不安定なテストに対処する簡単な方法はありません。
不安定なテストに対処する2つの一般的な方法は、失敗したすべてのテストを再度実行することと、疑わしいテストを隔離することである。テストを再度実行することで、毎回失敗するテストを特定し、コードのバグを指摘し、どのテストが不安定でさらに分析が必要かを特定できる。不安定であると疑われるすべてのテストは隔離された領域に配置されるため、調査されるまでCIパイプラインが停止することはない。
EbayのエンジニアであるEvan Pierce氏が説明するように、失敗したすべてのテストを再実行することには、いくつかの欠点がある。それは、断続的に発生するバグを見逃す可能性、このステップを自動化するための特定のツールの必要性、速度の低下などである。Targeted Auto Retryは、テスト全体を実行するのではなく、アプリの起動など、失敗する可能性が高いステップにフォーカスする。
実際には、Targeted Auto Retryでは、setUp/tearDown単体テストのあるステップにフォーカスし、そのステップが失敗した場合には、合格するか最大再試行制限に達するまで再実行する。これを下の画像に示す。
Targeted Auto Retryは、テストコードをインストルメント化できるツールによってすべての単体テストに適用されるわけではないことに注意することが重要である。むしろ、不安定であることが疑われるテストの特定のステップへの追加をあなた自身が選択する。このようにして、失敗したステップをさらに調査するための便利な方法を提供する。
このアプローチには、失敗したテストを最初から実行するよりも多くの利点があるとPierceは述べている。それは、断続的に発生するバグを見逃すリスクが少ない、実行が速い、実装が簡単などである。
それを採用したeBayのモバイルチームは、不安定なテストの問題が一晩で事実上解消され、回帰テストスイート全体から最大99%の不安定さが解消されました。
オープンソースのTargetedAutoRetryパッケージは、特にXcodeとSwift言語を対象としている。依存関係としてプロジェクトに追加した後、XCTestCase
にTargeted Auto Retryを使用する場合には、autoRetry
メソッドを実装してTargetedAutoRetry
プロトコルに準拠させる必要がある。例を以下に示す。
autoRetry(
mainAction: { XCUIApplication().launch() },
successCondition: { XCUIApplication().buttons["Foo"].exists },
actionDescription: "Launch"
)
こちらで、Xcode単体テストでTargeted Auto Retryを使用する他の例を確認できる。