Flujo de trabajo CI/pruebas 🧪
La integración continua (IC) es esencial para mantener un código de alta calidad mediante la detección temprana de problemas. Esta guía cubre las pruebas de CI y los controles de calidad para Ultralytics de Ultralytics.
Acciones CI 🔄
Todos los PR deben pasar las comprobaciones automatizadas de CI antes de fusionarse. Nuestro proceso CI incluye:
Pruebas CI
Prueba principal de CI que ejecuta pruebas unitarias, comprobaciones de linting y pruebas exhaustivas.
Despliegue de Docker
Valida el despliegue mediante Docker, asegurándose de que Dockerfile y los scripts relacionados funcionan correctamente.
Enlaces rotos
Escanea el código base en busca de enlaces rotos o muertos en archivos markdown y HTML.
Análisis CodeQL
Herramienta de análisis semántico de GitHub para encontrar posibles vulnerabilidades de seguridad y mantener la calidad del código.
Publicación en PyPI
Valida que el proyecto puede ser empaquetado y publicado en PyPI sin errores.
Plataforma de pruebas 🖥️
Pruebas realizadas en varios entornos:
- SO: Ubuntu, Windows, macOS
- Python: 3.8, 3.9, 3.10, 3.11, 3.12
Cobertura del código 📊
Utilizamos Codecov para medir y visualizar la cobertura del código, lo que nos permite saber en qué medida las pruebas ejercitan el código base.
Integración de la cobertura
La integración de Codecov proporciona:
- Cobertura detallada
- Comparaciones de cobertura entre commits
- Superposiciones visuales en el código que muestran las líneas cubiertas
- Porcentaje de cobertura del
ultralyticspaquete
Consulte todos los detalles de la cobertura en codecov.ultralytics.
Comprender la cobertura
La cobertura del código muestra qué porcentaje del código se ejecuta durante las pruebas. Una cobertura alta indica que el código está bien probado, pero no garantiza la ausencia de errores. La cobertura ayuda a identificar áreas no probadas que podrían ser propensas a errores.
Ejecución local de pruebas 🖥️
Instalar dependencias de desarrollo
Ejecutar todas las pruebas
Ejecutar pruebas específicas
# Single file
pytest tests/test_engine.py
# Single test function
pytest tests/test_engine.py::test_train
# Tests matching pattern
pytest -k "export"
# Slow tests only
pytest -m slow
Ejecutar con cobertura
Pruebas paralelas
Redacción de pruebas ✍️
Estructura de la prueba
from pathlib import Path
from ultralytics import YOLO
def test_model_export():
"""Test ONNX model export."""
model = YOLO("yolo11n.pt")
model.export(format="onnx")
assert Path("yolo11n.onnx").exists()
Buenas prácticas
- Nombres descriptivos:
test_export_onnx_format()notest_1() - Afirmación única: Prueba una cosa por función
- Pruebas rápidas: Utilizar modelos/conjuntos de datos pequeños
- Fixtures: Usar pytest fixtures para setup/teardown
- Marcadores:
@pytest.mark.slowpara pruebas de larga duración
Organización de pruebas
tests/
├── test_engine.py # Training, validation, prediction
├── test_nn.py # Model architecture
├── test_data.py # Dataset handling
├── test_utils.py # Utility functions
└── test_exports.py # Export formats
Marcadores de prueba
import pytest
@pytest.mark.slow
def test_full_training():
"""Test full training run (slow)."""
model = YOLO("yolo11n.pt")
model.train(data="coco128.yaml", epochs=1)
Controles de calidad del código 🎯
Formato con Ruff
# Check formatting
ruff check ultralytics/
# Auto-fix issues
ruff check --fix ultralytics/
# Format code
ruff format ultralytics/
Más información sobre normas de código en nuestro flujo de trabajo de desarrollo.
Tipo Comprobación
Formateo de docstrings
CI Solución de problemas 🔧
Las pruebas pasan localmente pero fallan en CI
Causas comunes:
- Problemas específicos de la plataforma: Pruebas en el sistema operativo de destino
- Diferencias de versión dePython : Compruebe la compatibilidad de versiones
- Faltan dependencias: Verificar configuración CI
- Problemas de tiempo/concurrencia: Añadir reintentos o aumentar los tiempos de espera
Ejecuciones lentas de CI
Soluciones:
- Utilice
@pytest.mark.slowpara pruebas costosas - Simulación de dependencias externas
- Reducir el tamaño de los conjuntos de datos de prueba
- Paralelizar con
pytest-xdist
Pruebas defectuosas
Arreglos:
- Añadir reintentos para pruebas dependientes de la red
- Aumentar los tiempos de espera para operaciones lentas
- Corrección de condiciones de carrera en código asíncrono
- Utilizar semillas aleatorias deterministas
Pruebas de rendimiento 📈
CI realiza un seguimiento de las métricas clave:
- Velocidad de inferencia (FPS)
- Uso de la memoria
- Tamaño del modelo
- Tiempos de exportación
Las regresiones significativas bloquean la fusión. Si las métricas cambian:
- Verificar el cambio previsto
- Razón documental en PR
- Obtener la aprobación de los mantenedores
CI Estado 📋
Compruebe el estado de CI de todos los repositorios Ultralytics en docs.ultralytics.com/help/CI.
Repositorio principal Insignias
Omisión de comprobaciones CI ⚠️
Añadir [skip ci] para confirmar el mensaje y omitir CI (utilícelo con moderación):
Sólo para:
- Cambios sólo en la documentación
- Actualizaciones de archivos no codificados
- Revisiones de emergencia (con aprobación)
Recursos 📚
- Guía oficial de CI - Documentación completa sobre CI
- Flujo de trabajo de desarrollo: proceso de relaciones públicas y normas de código
- GitHub Actions Docs - Configuración CI
- Documentación de pytest - Testing framework
- Codecov - Informes de cobertura