Копилот Чат может анализировать сбои тестов и помогать выявлять возможные причины.
Пример сценария: тесты проходят локально, но проваливаются в CI
Рассмотрим ситуацию, когда тест проходит на вашем локальном компьютере, но иногда проваливается в CI. Копилот Чат может помочь определить причину отказа.
В этом примере тестируемый код определяет простой сервис заказа (order.py), и есть соответствующий тест, который проверяет, был ли заказ создан сегодня (test_order_service.py).
Пример запроса
Ниже приведено предложение Copilot с соответствующим кодом и тестовыми файлами (с #file:использованием ), а также включает копирование/вставку соответствующего фрагмента из ошибки CI.
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
Пример отклика
Примечание.
Следующий ответ является примером. Ответы Копилот Чат являются недетерминированными, поэтому вы можете получить другой ответ, показанный здесь.
Копилот Чат замечает, что даты ровно в один день и определяет, что это может быть проблемой часового пояса или временной границы .
Локальная машина и CI-раннер могут использовать разные настройки часового пояса или выводить today из разных часов (UTC и местное время), поэтому при тестировании около полуночи date.today() могут возвращать разные даты в каждой среде.
Копилот Чат предлагает рассматривать сбой как нестабильность тестов, вызванную предположениями окружающей среды/времени (а не логическую ошибку), и исправлять её стандартизацией способов today вычислений в разных средах.
Пример сценария 2: Периодические сбои испытаний
Рассмотрим ситуацию, когда тест иногда проходит, а иногда проваливается на одной и той же машине. Копилот Чат может сравнивать логи при проходящих и неудачных запусках, чтобы помочь выявить причину.
В этом примере тестируемый код использует фоновую задачу в order_service.py для асинхронного обновления статуса заказа, а тест в test_order_service.py утверждает, что итоговый статус — "processed".
Пример запроса
Ниже приведено сообщение Copilot с сообщением о сбое, выдержками журнала как проходящего, так и неудачного запуска, а также соответствующими кодовыми файлами (с использованием #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
Пример отклика
Примечание.
Следующий ответ является примером. Ответы Копилот Чат являются недетерминированными, поэтому вы можете получить другой ответ, показанный здесь.
Копилот Чат сравнивает два лога и замечает, что при проходном запуске фоновая задача, завершённая до проверки статуса, а в неудачном запуске статус проверяется, пока задание всё ещё работает. Копилот Чат отмечает, что это гоночное условие, так как тест не ждёт завершения фоновой работы.
Копилот Чат предлагает добавить механизм, гарантирующий завершение работы перед утверждением, например, синхронный запуск, ожидание завершения (например, через обратный вызов) или опрос.