{"meta":{"title":"Diagnóstico de fallos en las pruebas de CI","intro":"Use Copilot CLI para extraer registros de CI, correlacionar los errores con el código local y corregir problemas sin salir del terminal.","product":"GitHub Copilot","breadcrumbs":[{"href":"/es/copilot","title":"GitHub Copilot"},{"href":"/es/copilot/tutorials","title":"Tutoriales"},{"href":"/es/copilot/tutorials/copilot-cookbook","title":"Recetario de GitHub Copilot"},{"href":"/es/copilot/tutorials/copilot-cookbook/debug-errors","title":"Depuración de errores"},{"href":"/es/copilot/tutorials/copilot-cookbook/debug-errors/diagnose-ci-test-failures","title":"Diagnosticar fallos en las pruebas de CI"}],"documentType":"article"},"body":"# Diagnóstico de fallos en las pruebas de CI\n\nUse Copilot CLI para extraer registros de CI, correlacionar los errores con el código local y corregir problemas sin salir del terminal.\n\nCopilot CLI incluye el servidor MCP de GitHub, lo que le da acceso directo a las ejecuciones de flujos de trabajo de Acciones de GitHub, los registros de los trabajos y los estados de las comprobaciones. Junto con el acceso a los archivos locales, puede capturar los detalles del error de CI, correlacionarlos con el código y proponer correcciones desde el terminal.\n\n## Ejemplo de escenario 1: Las pruebas pasan localmente, pero fallan en CI\n\nTienes una prueba que pasa en tu equipo local, pero falla en CI. Puede pedir que Copilot CLI investigue este error de prueba directamente.\n\nEn 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`).\n\n### Mensaje de ejemplo\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### Respuesta de ejemplo\n\n> \\[!NOTE] La respuesta siguiente es un ejemplo. Las respuestas de Copilot Chat no son deterministas, por lo que puedes obtener una respuesta diferente a la aquí mostrada.\n\nCopilot CLI usa el servidor MCP de GitHub para capturar las ejecuciones de flujo de trabajo más recientes en la rama actual, identifica el trabajo con errores y recupera sus registros. Encuentra el siguiente error:\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\nDespués de leer ambos archivos locales, Copilot CLI observa que las fechas están exactamente separadas un día e identifica esto como un **problema de límite de zona horaria**. El ejecutor de CI usa UTC mientras la máquina local usa una zona horaria diferente. Cuando la prueba se ejecuta cerca de medianoche, `date.today()` devuelve fechas diferentes en cada entorno.\n\nCopilot CLI sugiere la estandarización de cómo `today` se calcula insertando una dependencia de reloj o anclando la zona horaria:\n\n```python\nfrom datetime import timezone, datetime\n\ndef get_today():\n    return datetime.now(timezone.utc).date()\n```\n\nAplica la corrección a `order.py` y `test_order_service.py`, actualizando todas las referencias para que usen el nuevo asistente `get_today()`.\n\nDespués de la corrección, puede comprobar los cambios y ejecutar las pruebas localmente:\n\n1. Ejecute `/diff` para revisar exactamente lo que Copilot CLI cambió.\n2. Ejecute `!pytest test_order_service.py` para confirmar que las pruebas se superan localmente.\n3. Inserte la corrección y deje que ci vuelva a ejecutarse.\n\n## Escenario de ejemplo 2: Errores de prueba intermitentes con condiciones de carrera\n\nA veces se supera una prueba y, a veces, se produce un error en la misma máquina. Le conviene Copilot CLI comparar los registros de las ejecuciones correctas y fallidas para identificar la causa.\n\nEn 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\"`.\n\n### Ejemplo de indicador para condiciones de carrera\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### Respuesta de ejemplo para condiciones de carrera\n\n> \\[!NOTE] La respuesta siguiente es un ejemplo. Las respuestas de Copilot Chat no son deterministas, por lo que puedes obtener una respuesta diferente a la aquí mostrada.\n\nCopilot CLI usa el servidor MCP de GitHub para enumerar las ejecuciones recientes del flujo de trabajo en la rama actual, identifica una ejecución correcta y otra fallida, y recupera los registros de ambas. Los compara:\n\n**Paso de ejecución:**\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**Ejecución con errores:**\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 observa que, en la ejecución correcta, el trabajo en segundo plano se completó antes de la verificación del estado, mientras que en la ejecución fallida, el estado se comprobó mientras el trabajo aún estaba en ejecución. Identifica esto como **una condición de carrera** porque la prueba no espera a que finalice el trabajo en segundo plano.\n\nCopilot CLI sugiere agregar un mecanismo de espera explícito antes de la aserción y propone una corrección mediante un asistente de sondeo:\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## Lectura adicional\n\n* *\n\n[GitHub Copilot CLI](/es/copilot/how-tos/copilot-cli)"}