Automation QA (Quality Assurance)QA Automation / SDET

自動テストの再実行(リトライ)をどのように正しく実装するか:適用すべき場合とそうでない場合は?

Hintsage AIアシスタントで面接を突破

回答。

テストの再実行メカニズム(リトライ)は、テストパイプラインの安定性を高め、フレークな自動テストに対処するために導入されますが、合理的なアプローチが必要です。

問題の背景 一時的なインフラやフレークエラーに対するワークアラウンドとして登場し、アプリケーションのエラーに関連しない(不安定な環境、ネットワークの問題、APIのタイムアウト)エラーを対象とします。現在、多くのCI/CDシステムが組み込みのretryをサポートしています。

問題点 過剰または制御されていないretryは、実際のバグを隠すか、失敗を「単なる一時的な現象」に変えてしまいます。偽陽性の結果が発生します:テストが通過したように見えても、バグは依然として存在します。

解決策 不安定なテストまたは外部依存型テストにのみリトライを有効にし、タグやマーカーを使用してください。再試行の固定制限(1-2回)を設けます。すべての失敗と再試行の成功をログに記録し、失敗の原因を分析します。

import pytest @pytest.mark.flaky(reruns=2, reruns_delay=5) def test_external_api(): # APIの不安定さのために失敗する可能性のあるテスト ...

主な特徴:

  • 適切かつ意識的に適用
  • リトライの原因を常に分析
  • アプリのバグを隠さず、インフラ/フレークの問題だけに対処

トリッキーな質問。

パイプライン内のすべての自動テストを再実行してもよいですか?

これは悪い実践です:実際のバグやテストのアーキテクチャの問題が隠れてしまいます。リトライは一部のテストのための最終手段です。

3回リトライしてもテストが通らない場合はどうすればいいですか?

実行を中止し、不安定性/調査に関するバグをオープンする必要があります。これにより、リファクタリングが必要なトリッキーなエラーが明らかになります。

テストが2回目に通過する場合は、すべてが良好だということですか?

いいえ、唯一の正しい状態は最初の実行での安定した通過です。2回目の通過は問題の指標です(フレークまたはインフラ)。

一般的なミスとアンチパターン

  • リトライを過剰に適用し、バグを隠す
  • 失敗の原因を分析しない
  • 実際の問題の修正の代わりにリトライを使用する

実生活の例

ネガティブケース

Jenkinsの全パイプラインに2回のグローバルリトライを設定しました。1ヶ月後、コードのレースコンディションによるバグが蔓延し、チームは「品質が良い」と考えていました。製品は突然、同じバグのために本番環境でクラッシュしました。

利点:

  • グリーンのパイプラインがありました

欠点:

  • アプリのバグが適時に見つからなかった
  • 信頼性の問題の出所を理解するのが難しい

ポジティブケース

外部APIを持つテストカテゴリーにのみリトライを設定しました(タグによって)。他のすべてのテストは一度の実行で厳格に通過します。チームはログを使って再発する失敗を調査し、修正します。

利点:

  • 実際のバグがすぐに見える
  • リトライは外部システムの偶発的なエラーから救います
  • 問題の根本を分析し修正できます

欠点:

  • テストのタグとリトライの理由を維持する必要があります
  • パイプラインの管理が少し難しくなります