Chat de Copiloto puede analizar errores en las pruebas y ayudar a identificar las posibles causas.
Escenario de ejemplo: pruebas que pasan localmente pero fallan en CI
Considere un escenario en el que tiene una prueba que pasa en su máquina local, pero a veces falla en CI. Chat de Copiloto puede ayudar a identificar la causa del fallo.
En este ejemplo, el código que se está probando define un servicio de pedido simple (order.py) y hay una prueba correspondiente que comprueba si se creó un pedido hoy (test_order_service.py).
Ejemplo de sugerencia
El mensaje siguiente proporciona Copilot con el código y los archivos de prueba pertinentes (mediante #file:) e incluye una copia o pega del extracto correspondiente del error de 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
Respuesta de ejemplo
Nota:
La respuesta siguiente es un ejemplo. Las respuestas de Chat de Copiloto no son deterministas, por lo que puedes obtener una respuesta diferente a la aquí mostrada.
Chat de Copiloto observa que las fechas están exactamente separadas un día e identifica que esto podría ser un problema de zona horaria o límite horario .
La máquina local y el ejecutor de CI pueden usar diferentes configuraciones de zona horaria o derivar today de diferentes relojes (hora UTC frente a hora local), por lo que cuando la prueba se ejecuta cerca de medianoche, date.today() puede devolver fechas diferentes en cada entorno.
Chat de Copiloto sugiere tratar el fallo como una inconsistencia de prueba causada por suposiciones de entorno y tiempo (y no un error lógico) y corregirlo mediante la estandarización de cómo se calcula today en todos los entornos.
Escenario de ejemplo 2: Errores de prueba intermitentes
Considere un escenario en el que a veces se supera una prueba y a veces se produce un error en la misma máquina. Chat de Copiloto puede comparar los registros de ejecuciones exitosas y fallidas para ayudar a identificar la causa.
En este ejemplo, el código sometido a prueba usa un trabajo en segundo plano en order_service.py para actualizar el estado de un pedido de forma asincrónica y una prueba en test_order_service.py afirma que el estado final es "processed".
Ejemplo de sugerencia
El mensaje siguiente proporciona Copilot con el mensaje de fallo, los extractos de registro de una ejecución exitosa y una fallida, y los archivos de código pertinentes (mediante #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
Respuesta de ejemplo
Nota:
La respuesta siguiente es un ejemplo. Las respuestas de Chat de Copiloto no son deterministas, por lo que puedes obtener una respuesta diferente a la aquí mostrada.
Chat de Copiloto compara los dos registros y observa que en la ejecución de paso, el trabajo en segundo plano se completó antes de que se verificara el estado, mientras que en la ejecución fallida, el estado se verificó mientras el trabajo aún se estaba ejecutando. Chat de Copiloto señala que se trata de una condición de carrera, ya que la prueba no espera a que el trabajo en segundo plano termine.
Chat de Copiloto sugiere agregar un mecanismo para asegurarse de que el trabajo se completa antes de la aserción, como ejecutar el trabajo de forma sincrónica, esperar la finalización (por ejemplo, a través de una devolución de llamada) o sondear.