{"meta":{"title":"Diagnóstico de falhas em testes de CI","intro":"Use Copilot CLI para obter os logs de CI, correlacionar falhas com o código local e corrigir problemas sem sair do terminal.","product":"GitHub Copilot","breadcrumbs":[{"href":"/pt/copilot","title":"GitHub Copilot"},{"href":"/pt/copilot/tutorials","title":"Tutoriais"},{"href":"/pt/copilot/tutorials/copilot-cookbook","title":"Livro de receitas do GitHub Copilot"},{"href":"/pt/copilot/tutorials/copilot-cookbook/debug-errors","title":"Depurar erros"},{"href":"/pt/copilot/tutorials/copilot-cookbook/debug-errors/diagnose-ci-test-failures","title":"Diagnosticar falhas em testes de CI"}],"documentType":"article"},"body":"# Diagnóstico de falhas em testes de CI\n\nUse Copilot CLI para obter os logs de CI, correlacionar falhas com o código local e corrigir problemas sem sair do terminal.\n\nCopilot CLI 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.\n\n## Cenário de exemplo 1: testes são aprovados localmente, mas falham na CI\n\nVocê tem um teste que passa no computador local, mas falha na CI. Você pode pedir Copilot CLI para investigar essa falha de teste diretamente.\n\nNeste 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`).\n\n### Prompt de exemplo\n\n```copilot copy\nMy CI is failing on this branch. Can you pull the latest workflow run \nlogs, figure out what is failing, and help me fix it? The relevant files \nare @order.py and @test_order_service.py\n```\n\n### Resposta de exemplo\n\n> \\[!NOTE] A resposta a seguir é um exemplo. Respostas do Copilot Chat são não determinísticas, portanto, você pode obter uma resposta diferente da mostrada aqui.\n\nCopilot CLI 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:\n\n```text\n___ TestOrderService.test_order_created_today ___\n>       assert order[\"created_date\"] == date.today()\nE       AssertionError: assert datetime.date(2024, 1, 15) == datetime.date(2024, 1, 16)\n\ntest_order_service.py:45: AssertionError\n```\n\nDepois de ler os dois arquivos locais, Copilot CLI 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.\n\nCopilot CLI sugere padronizar como `today` é calculado injetando uma dependência de relógio ou fixando o fuso horário:\n\n```python\nfrom datetime import timezone, datetime\n\ndef get_today():\n    return datetime.now(timezone.utc).date()\n```\n\nEle aplica a correção a `order.py` e `test_order_service.py`, atualizando todas as referências para usar o novo auxiliar `get_today()`.\n\nApós a correção, você pode verificar as alterações e executar os testes localmente:\n\n1. Execute `/diff` para examinar exatamente o que Copilot CLI mudou.\n2. Execute `!pytest test_order_service.py` para confirmar que os testes são aprovados localmente.\n3. Faça o push da correção e deixe a CI rodar novamente.\n\n## Cenário de exemplo 2: falhas de teste intermitentes com condições de corrida\n\nÀs vezes, um teste é aprovado e às vezes falha no mesmo computador. Você quer Copilot CLI comparar logs de execuções bem-sucedidas e com falha para identificar a causa.\n\nNeste 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\"`.\n\n### Exemplo de prompt para condições de corrida\n\n```copilot copy\nThis test passes sometimes and fails sometimes. Can you pull the logs \nfrom the last passing and failing CI runs for test_order_processed \non this branch, compare them, and figure out what is going wrong? \nRelevant files: @order_service.py @test_order_service.py\n```\n\n### Resposta de exemplo para condições de corrida\n\n> \\[!NOTE] A resposta a seguir é um exemplo. Respostas do Copilot Chat são não determinísticas, portanto, você pode obter uma resposta diferente da mostrada aqui.\n\nCopilot CLI 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:\n\n**Execução bem-sucedida:**\n\n```text\n[DEBUG] Created order #1234\n[DEBUG] Background job started for order #1234\n[DEBUG] Background job completed (52ms)\n[DEBUG] Checking order status\n[DEBUG] Order #1234 status: processed\n```\n\n**Falha na execução:**\n\n```text\n[DEBUG] Created order #1234\n[DEBUG] Background job started for order #1234\n[DEBUG] Checking order status\n[DEBUG] Order #1234 status: pending\n```\n\nCopilot CLI 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.\n\nCopilot CLI sugere adicionar um mecanismo de espera explícito antes de afirmar e propor uma correção usando um auxiliar de sondagem:\n\n```python\nimport time\n\ndef wait_for_status(order_id, expected, timeout=5):\n    start = time.time()\n    while time.time() - start < timeout:\n        order = get_order(order_id)\n        if order.status == expected:\n            return order\n        time.sleep(0.1)\n    raise TimeoutError(\n        f\"Order {order_id} did not reach '{expected}' within {timeout}s\"\n    )\n```\n\n## Leitura adicional\n\n* *\n\n[GitHub Copilot CLI](/pt/copilot/how-tos/copilot-cli)"}