Skip to main content

テストエラーの診断

Copilot チャット は、テストが失敗する理由を理解し、修正方法を提案してくれるために役立ちます。

Copilot チャット はテストの失敗を分析し、潜在的な原因を特定することを支援します。

シナリオ例: テストはローカルで成功しますが、CIでは失敗します。

ローカル コンピューターでテストに合格したが、CI で失敗する場合があるシナリオを考えてみましょう。 Copilot チャット は、障害の原因を特定するのに役立ちます。

この例では、テスト対象のコードは単純な注文サービス (order.py) を定義し、注文が今日作成されたかどうかを確認する対応するテスト (test_order_service.py) があります。

プロンプトの例

次のプロンプトには、Copilot に関連するコードファイルとテスト ファイル ( #file: を使用) が提供され、CI エラーからの関連する抜粋のコピー/貼り付けが含まれています。

Copilot prompt
Please take a look at this CI failure message. The test passes locally, but intermittently fails in CI. Can you help me figure out if this looks like a code bug, environment issue, or a flaky test?

Failure:

___ TestOrderService.test_order_created_today ___
>       assert order["created_date"] == date.today()
E       AssertionError: assert datetime.date(2024, 1, 15) == datetime.date(2024, 1, 16)

test_order_service.py:45: AssertionError

#file:order.py
#file:test_order_service.py

応答の例

メモ

次の応答は例です。 Copilot チャット の応答は非決定的であるため、ここで示したものとは異なる応答が返される可能性があります。

Copilot チャット は、日付が正確に 1 日離れていることに気付き、これが タイムゾーン または 時間境界の 問題である可能性があることを識別します。

ローカル コンピューターと CI ランナーは、異なるタイムゾーン設定を使用しているか、異なるクロック (UTC と現地時刻) から today を派生している可能性があるため、テストが午前 0 時近くに実行されると、 date.today() は環境ごとに異なる日付を返すことができます。

Copilot チャット は、障害を環境/時間の前提条件 (ロジックバグではなく) によって引き起こされるテストの失敗として扱い、環境全体で today の計算方法を標準化することによって修正することを提案します。

シナリオ例 2: 断続的なテストエラー

テストに合格し、同じコンピューターで失敗する場合があるシナリオを考えてみましょう。 Copilot チャット は実行の成功と失敗のログを比較し、原因を特定するのに役立ちます。

この例では、テスト対象のコードは order_service.py のバックグラウンド ジョブを使用して注文の状態を非同期的に更新し、 test_order_service.py のテストでは最終的な状態が "processed"であることをアサートします。

プロンプトの例

次のプロンプトでは、Copilot に失敗メッセージ、成功および失敗した実行のログ抜粋、関連するコードファイル(#file: を使用して)が記載されています。

Copilot prompt
This test passes sometimes and fails sometimes. Can you compare the logs and help me figure out why?

Failure message:

>       assert order.status == "processed"
E       AssertionError: assert "pending" == "processed"

test_order_service.py:62: AssertionError

Logs from a passing run:
[DEBUG] Created order #1234
[DEBUG] Background job started for order #1234
[DEBUG] Background job completed (52ms)
[DEBUG] Checking order status
[DEBUG] Order #1234 status: processed

Logs from the failing run:
[DEBUG] Created order #1234
[DEBUG] Background job started for order #1234
[DEBUG] Checking order status
[DEBUG] Order #1234 status: pending

#file:order_service.py
#file:test_order_service.py

応答の例

メモ

次の応答は例です。 Copilot チャット の応答は非決定的であるため、ここで示したものとは異なる応答が返される可能性があります。

Copilot チャット は、2つのログを比較し、合格した実行ではバックグラウンドジョブが状態チェックの前に完了していたことに気付きます。一方、失敗した実行では、ジョブが実行中に状態がチェックされていました。 テストがバックグラウンド ジョブの完了を待たないため、Copilot チャット は、これが競合状態であることを注記しています。

Copilot チャット は、ジョブの同期的な実行、完了の待機 (コールバック経由など)、ポーリングなど、アサートの前にジョブが完了することを保証するメカニズムを追加することを提案します。

詳細については、次を参照してください。