Skip to main content

Diagnóstico de errores de prueba

chat de Copilot puede ayudarle a comprender por qué se produce un error en una prueba y sugerir cómo corregirlo.

chat de Copilot 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 una situación en la que tiene una prueba que pasa en su máquina local, pero que a veces falla en CI. chat de Copilot puede ayudar a identificar el motivo 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

La siguiente solicitud proporciona Copilot con el código y los archivos de prueba pertinentes (usando #file:) e incluye una copia/pegado del extracto pertinente del fallo de 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

Respuesta de ejemplo

Nota:

La respuesta siguiente es un ejemplo. Las respuestas de chat de Copilot no son deterministas, por lo que puedes obtener una respuesta diferente a la aquí mostrada.

chat de Copilot 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 Copilot 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 Copilot puede comparar los registros de las ejecuciones correctas e incorrectas 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

La solicitud siguiente proporciona Copilot con el mensaje de error, los extractos del registro tanto de una ejecución correcta como de una incorrecta, y los archivos de código relevantes (usando #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

Respuesta de ejemplo

Nota:

La respuesta siguiente es un ejemplo. Las respuestas de chat de Copilot no son deterministas, por lo que puedes obtener una respuesta diferente a la aquí mostrada.

chat de Copilot compara los dos registros y observa que, en la ejecución correcta, la tarea en segundo plano se completó antes de la comprobación de estado, mientras que en la ejecución incorrecta, el estado se comprobó mientras la tarea aún se estaba ejecutando. chat de Copilot señala que se trata de una condición de carrera, ya que la prueba no espera a que finalice la tarea en segundo plano.

chat de Copilot sugiere añadir un mecanismo para garantizar que el trabajo se complete antes de realizar la afirmación, como ejecutar el trabajo de forma sincrónica, esperar a que se complete (por ejemplo, mediante una devolución de llamada) o realizar sondeos.

Lectura adicional