Chat Copilot 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 CI. Chat Copilot 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.
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
Resposta de exemplo
Observação
A resposta a seguir é um exemplo. Respostas do Chat Copilot são não determinísticas, portanto, você pode obter uma resposta diferente da mostrada aqui.
Chat Copilot 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.
Chat Copilot 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. Chat Copilot 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:).
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
Resposta de exemplo
Observação
A resposta a seguir é um exemplo. Respostas do Chat Copilot são não determinísticas, portanto, você pode obter uma resposta diferente da mostrada aqui.
Chat Copilot 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. Chat Copilot observa que essa é uma condição de corrida, pois o teste não aguarda a conclusão do trabalho em segundo plano.
Chat Copilot 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.