BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース EbayオープンソースパッケージがSwiftとXcodeを使ってテストの不安定さを軽減

EbayオープンソースパッケージがSwiftとXcodeを使ってテストの不安定さを軽減

ブックマーク

原文(投稿日:2021/04/12)へのリンク

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を使用する他の例を確認できる。

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

BT