Skip to main content

Diagnosticando falhas de teste

Bate-papo do Copiloto pode ajudá-lo a entender por que um teste está falhando e sugerir como corrigi-lo.

Bate-papo do Copiloto pode analisar falhas de teste e ajudar a identificar possíveis causas.

Cenário de exemplo: testes passando localmente, mas falhando na CI

Considere um cenário em que você tem um teste que passa no computador local, mas às vezes falha na Integração Contínua. Bate-papo do Copiloto pode ajudar a identificar o motivo da falha.

Neste exemplo, o código que está sendo testado define um serviço de ordem simples (order.py) e há um teste correspondente que verifica se um pedido foi criado hoje (test_order_service.py).

Exemplo de solicitação

O prompt a seguir fornece Copilot com os arquivos de teste e código relevantes (usando #file:) e inclui uma cópia/colagem do trecho relevante da falha 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

Resposta de exemplo

Resposta: Esta é um exemplo.

Bate-papo do Copiloto observa que as datas têm exatamente um dia de diferença e identifica que isso pode ser um problema de fuso horário ou limite de tempo .

O computador local e o executor de CI podem estar usando configurações de fuso horário diferentes ou derivando today de relógios diferentes (UTC versus hora local), portanto, quando o teste é executado perto da meia-noite, date.today() pode retornar datas diferentes em cada ambiente.

Bate-papo do Copiloto sugere tratar a falha como intermitência de teste causada por suposições de ambiente/tempo (e não um bug lógico), e corrigi-la padronizando o modo de computação de today em todos os ambientes.

Cenário de exemplo 2: falhas de teste intermitentes

Considere um cenário em que um teste às vezes é aprovado e, às vezes, falha no mesmo computador. Bate-papo do Copiloto pode comparar logs de execuções bem-sucedidas e com falhas para ajudar a identificar a causa.

Neste exemplo, o código em teste usa um trabalho em segundo plano em order_service.py para atualizar o status de uma ordem assíncronamente, e um teste em test_order_service.py afirma que o status final é "processed".

Exemplo de solicitação

O prompt a seguir fornece Copilot com a mensagem de falha, os trechos de log de uma execução bem-sucedida e uma falha, e os arquivos 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

Resposta de exemplo

Resposta: Esta é um exemplo.

Bate-papo do Copiloto compara os dois logs e observa que, na execução bem-sucedida, o trabalho em segundo plano foi concluído antes da verificação de status, enquanto na execução com erro, o status foi verificado enquanto o trabalho ainda estava em execução. Bate-papo do Copiloto observa que essa é uma condição de corrida, pois o teste não aguarda a conclusão do trabalho em segundo plano.

Bate-papo do Copiloto sugere adicionar um mecanismo para garantir que o trabalho seja concluído antes de se fazer uma afirmação, como executar o trabalho de forma síncrona, aguardar a conclusão (por exemplo, por meio de um callback) ou por sondagem.

Leitura adicional