Copilot-Chat kann Testfehler analysieren und potenzielle Ursachen identifizieren.
Beispielszenario: Tests, die lokal bestehen, aber in CI fehlschlagen
Betrachten Sie ein Szenario, in dem Sie einen Test haben, der auf Ihrem lokalen Computer bestanden wird, manchmal aber in CI fehlschlägt. Copilot-Chat kann Ihnen helfen, den Grund für den Fehler zu identifizieren.
In diesem Beispiel definiert der getestete Code einen einfachen Bestelldienst (order.py), und es gibt einen entsprechenden Test, der überprüft, ob heute eine Bestellung erstellt wurde (test_order_service.py).
Beispielaufforderung
Der folgende Prompt stellt Copilot mit dem relevanten Code und Testdateien bereit (unter Verwendung von #file:) und enthält einen Kopie-/Einfügevorgang des relevanten Auszugs aus dem CI-Fehler.
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
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
Beispielantwort
Hinweis
Die folgende Antwort ist ein Beispiel. Da die Copilot-Chat-Antworten nicht deterministisch sind, erhältst du möglicherweise eine andere Antwort als die hier beschriebene.
Copilot-Chat stellt fest, dass die Datumsangaben genau einen Tag auseinander liegen, und identifiziert ein Problem mit timezone oder time-boundary als mögliche Ursache.
Der lokale Computer und der CI-Runner verwenden möglicherweise unterschiedliche Zeitzoneneinstellungen oder leiten today von verschiedenen Uhren ab (UTC statt lokaler Zeit). Wenn der Test nahe Mitternacht ausgeführt wird, kann date.today() in jeder Umgebung unterschiedliche Datumsangaben zurückgeben.
Copilot-Chat schlägt vor, den Fehler als Testinstabilität zu betrachten, verursacht durch Annahmen hinsichtlich Umgebung oder Zeit (und nicht durch einen Logikfehler), und ihn mittels einer Standardisierung der Berechnung von today in allen Umgebungen zu beheben.
Beispielszenario 2: Zeitweilige Testfehler
Betrachten Sie ein Szenario, in dem ein Test manchmal bestanden und manchmal auf demselben Computer fehlschlägt. Copilot-Chat kann Protokolle für erfolgreiche und nicht erfolgreiche Ausführungen vergleichen, um die Ursache zu identifizieren.
In diesem Beispiel verwendet der zu testende Code einen Hintergrundauftrag in order_service.py, um den Status einer Bestellung asynchron zu aktualisieren, und eine Überprüfung in test_order_service.py bestätigt, dass der endgültige Status "processed" ist.
Beispielaufforderung
Der folgende Prompt enthält Copilot mit der Fehlermeldung, den Protokollauszügen aus einer erfolgreichen und einer nicht erfolgreichen Ausführung sowie den relevanten Codedateien (unter Verwendung von #file:).
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
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
Beispielantwort
Hinweis
Die folgende Antwort ist ein Beispiel. Da die Copilot-Chat-Antworten nicht deterministisch sind, erhältst du möglicherweise eine andere Antwort als die hier beschriebene.
Copilot-Chat vergleicht die beiden Protokolle und stellt fest, dass der Hintergrundvorgang in der erfolgreichen Ausführung vor der Statusüberprüfung abgeschlossen wurde. In der nicht erfolgreichen Ausführung wurde hingegen der Status überprüft, während der Vorgang noch ausgeführt wurde. Copilot-Chat stellt fest, dass es sich um eine Racebedingung handelt, da der Test nicht auf den Abschluss des Hintergrundvorgangs wartet.
Copilot-Chat schlägt das Hinzufügen eines Mechanismus vor, der den Abschluss des Vorgangs vor der Bestätigung sicherstellt, indem der Vorgang beispielsweise synchron ausgeführt wird, auf den Abschluss gewartet wird (z. B. durch einen Rückruf) oder eine Abfrage ausgeführt wird.