Skip to main content

Diagnóstico de falhas em testes de CI

Use CLI do Copilot para obter os logs de CI, correlacionar falhas com o código local e corrigir problemas sem sair do terminal.

CLI do Copilot vem com o servidor MCP do GitHub, que dá a ele acesso direto às execuções de fluxos de trabalho do GitHub Actions, aos logs de jobs e aos status das verificações. Combinado com o acesso aos seus arquivos locais, ele pode buscar detalhes de falha de CI, correlacionar-os ao seu código e propor correções do terminal.

Cenário de exemplo 1: testes são aprovados localmente, mas falham na CI

Você tem um teste que passa no computador local, mas falha na CI. Você pode pedir CLI do Copilot para investigar essa falha de teste diretamente.

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).

Prompt de exemplo

Copilot prompt
My CI is failing on this branch. Can you pull the latest workflow run 
logs, figure out what is failing, and help me fix it? The relevant files 
are @order.py and @test_order_service.py

Resposta de exemplo

Observação

A resposta a seguir é um exemplo. Respostas do Bate-papo do Copilot são não determinísticas, portanto, você pode obter uma resposta diferente da mostrada aqui.

CLI do Copilot usa o servidor MCP do GitHub para buscar as execuções de fluxo de trabalho mais recentes na ramificação atual, identifica a tarefa com falha e obtém os logs correspondentes. Ele encontra a seguinte falha:

___ 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

Depois de ler os dois arquivos locais, CLI do Copilot observe que as datas têm exatamente um dia de diferença e identificam isso como um problema de limite de fuso horário. O executor de CI usa UTC enquanto seu computador local usa um fuso horário diferente. Quando o teste é executado perto da meia-noite, date.today() retorna datas diferentes em cada ambiente.

CLI do Copilot sugere padronizar como today é calculado injetando uma dependência de relógio ou fixando o fuso horário:

from datetime import timezone, datetime

def get_today():
    return datetime.now(timezone.utc).date()

Ele aplica a correção a order.py e test_order_service.py, atualizando todas as referências para usar o novo auxiliar get_today().

Após a correção, você pode verificar as alterações e executar os testes localmente:

  1. Execute /diff para examinar exatamente o que CLI do Copilot mudou.
  2. Execute !pytest test_order_service.py para confirmar que os testes são aprovados localmente.
  3. Faça o push da correção e deixe a CI rodar novamente.

Cenário de exemplo 2: falhas de teste intermitentes com condições de corrida

Às vezes, um teste é aprovado e às vezes falha no mesmo computador. Você quer CLI do Copilot comparar logs de execuções bem-sucedidas e com falha para 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 prompt para condições de corrida

Copilot prompt
This test passes sometimes and fails sometimes. Can you pull the logs 
from the last passing and failing CI runs for test_order_processed 
on this branch, compare them, and figure out what is going wrong? 
Relevant files: @order_service.py @test_order_service.py

Resposta de exemplo para condições de corrida

Observação

A resposta a seguir é um exemplo. Respostas do Bate-papo do Copilot são não determinísticas, portanto, você pode obter uma resposta diferente da mostrada aqui.

CLI do Copilot usa o servidor MCP do GitHub para listar execuções recentes de workflow na branch atual, identifica uma execução bem-sucedida e uma com falha, e recupera os logs de ambas. Ele os compara:

Execução bem-sucedida:

[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

Falha na execução:

[DEBUG] Created order #1234
[DEBUG] Background job started for order #1234
[DEBUG] Checking order status
[DEBUG] Order #1234 status: pending

CLI do Copilot indica que, na execução bem-sucedida, o processo em segundo plano foi concluído antes da verificação de status, enquanto, na execução com falha, o status foi verificado enquanto o processo ainda estava em execução. Ele identifica isso como uma condição de corrida porque o teste não aguarda até a tarefa em segundo plano terminar.

CLI do Copilot sugere adicionar um mecanismo de espera explícito antes de afirmar e propor uma correção usando um auxiliar de sondagem:

import time

def wait_for_status(order_id, expected, timeout=5):
    start = time.time()
    while time.time() - start < timeout:
        order = get_order(order_id)
        if order.status == expected:
            return order
        time.sleep(0.1)
    raise TimeoutError(
        f"Order {order_id} did not reach '{expected}' within {timeout}s"
    )

Leitura adicional

CLI do GitHub Copilot