Skip to main content

Diagnostic des échecs de test

Tchat Copilot peut vous aider à comprendre pourquoi un test échoue et suggère comment le corriger.

Tchat Copilot peut analyser les échecs de test et aider à identifier les causes potentielles.

Exemple de scénario : Tests passant localement mais défaillants dans CI

Imagine un scénario où vous avez un test qui réussit sur votre machine locale, mais échoue parfois en CI. Tchat Copilot peut vous aider à identifier la raison de la défaillance.

Dans cet exemple, le code testé définit un service d’ordre simple (order.py), et il existe un test correspondant qui vérifie si une commande a été créée aujourd’hui (test_order_service.py).

Exemple d’invite

Le prompt ci-dessous fournit à Copilot le code et les fichiers de test pertinents (en utilisant #file:) et inclut un copier-coller de l’extrait correspondant de l’échec 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

Exemple de réponse

Remarque

La réponse suivante est un exemple. Les réponses Tchat Copilot ne sont pas déterministes, vous pouvez donc obtenir une réponse différente de celle affichée ici.

Tchat Copilot remarque que les dates sont exactement séparées d’un jour et identifie qu’il peut s’agir d’un problème de fuseau horaire ou de limite horaire.

L’ordinateur local et l’exécuteur CI peuvent utiliser différents paramètres de fuseau horaire ou dériver today de différentes horloges (heure UTC ou heure locale), de sorte que lorsque le test s’exécute près de minuit, date.today() peut retourner des dates différentes dans chaque environnement.

Tchat Copilot suggère de traiter l'échec comme une instabilité de test causée par des hypothèses d'environnement/de temps (et non un bogue logique), et de corriger cela en standardisant la manière dont today est calculé dans différents environnements.

Exemple de scénario 2 : Échecs de test intermittents

Envisagez un scénario où un test réussit parfois et échoue parfois sur la même machine. Tchat Copilot peut comparer les journaux des exécutions ayant réussi et ayant échoué afin de vous aider à identifier la cause.

Dans cet exemple, le code testé utilise un travail en arrière-plan dans order_service.py pour mettre à jour l'état d'une commande de manière asynchrone, et un test dans test_order_service.py vérifie que l'état final est "processed".

Exemple d’invite

Le prompt ci-dessous fournit à Copilot le message d’échec, les extraits de journaux d’une exécution ayant réussi et d’une exécution ayant échoué, ainsi que les fichiers de code pertinents (en utilisant #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

Exemple de réponse

Remarque

La réponse suivante est un exemple. Les réponses Tchat Copilot ne sont pas déterministes, vous pouvez donc obtenir une réponse différente de celle affichée ici.

Tchat Copilot compare les deux journaux et constate que, dans l’exécution ayant réussi, le travail en arrière-plan s’est terminé avant la vérification de l’état, tandis que dans l’exécution ayant échoué, l’état a été vérifié pendant que le travail était encore en cours d’exécution. Tchat Copilot remarque qu’il s’agit d’une condition de concurrence, car le test n’attend pas que le travail en arrière-plan se termine.

Tchat Copilot suggère d’ajouter un mécanisme pour s’assurer de la fin du travail avant de procéder à l’assertion, par exemple en exécutant le travail de manière synchrone, en attendant la fin du travail (par exemple, via un rappel) ou en effectuant une interrogation.

Lectures complémentaires