YOLO Vision 2026:

Flujo de trabajo de CI/pruebas 🧪#

La integración continua (CI) es esencial para mantener un código de alta calidad al detectar problemas de forma temprana. Esta guía abarca las pruebas de CI y las comprobaciones de calidad para los proyectos de Ultralytics.

Acciones de CI 🔄#

Todos los PR deben pasar las comprobaciones automatizadas de CI antes de fusionarse. Nuestra canalización de CI incluye:

Pruebas de CI#

Prueba de CI principal que ejecuta pruebas unitarias, comprobaciones de linter y pruebas exhaustivas.

Despliegue en Docker#

Valida el despliegue utilizando Docker, asegurando que el Dockerfile y los scripts relacionados funcionen correctamente.

Enlaces rotos#

Escanea la base de código en busca de enlaces rotos o muertos en archivos markdown y HTML.

Análisis de CodeQL#

Herramienta de análisis semántico de GitHub para encontrar vulnerabilidades de seguridad potenciales y mantener la calidad del código.

Publicación en PyPI#

Valida que el proyecto se pueda empaquetar y publicar en PyPI sin errores.

Pruebas de plataforma 🖥️#

Las pruebas se ejecutan en múltiples entornos:

  • OS: Ubuntu, Windows, macOS
  • Python: 3.8, 3.9, 3.10, 3.11, 3.12

Cobertura de código 📊#

Utilizamos Codecov para medir y visualizar la cobertura del código, proporcionando información sobre cómo las pruebas ejercitan la base de código.

Integración de cobertura#

La integración de Codecov proporciona:

  • Información detallada de cobertura
  • Comparaciones de cobertura entre commits
  • Superposiciones visuales en el código que muestran las líneas cubiertas
  • Porcentaje de cobertura para el paquete ultralytics

Consulta los detalles completos de cobertura en codecov.io/github/ultralytics/ultralytics.

Comprender la cobertura#

La cobertura de código muestra qué porcentaje del código se ejecuta durante las pruebas. Una alta cobertura indica un código bien probado, pero no garantiza la ausencia de errores. La cobertura ayuda a identificar áreas no probadas que podrían ser propensas a fallos.

Ejecutar pruebas localmente 🖥️#

Instalar dependencias de desarrollo#

pip install -e ".[dev]"

Ejecutar todas las pruebas#

pytest tests/

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#

pytest --cov=ultralytics tests/

Pruebas en paralelo#

# Install pytest-xdist
pip install pytest-xdist

# Run tests in parallel
pytest -n auto

Escribir pruebas ✍️#

Estructura de las pruebas#

from pathlib import Path

from ultralytics import YOLO

def test_model_export():
    """Test ONNX model export."""
    model = YOLO("yolo26n.pt")
    model.export(format="onnx")
    assert Path("yolo26n.onnx").exists()

Mejores prácticas#

  • Nombres descriptivos: test_export_onnx_format() en lugar de test_1()
  • Aserción única: Prueba una sola cosa por función
  • Pruebas rápidas: Utiliza modelos o conjuntos de datos pequeños
  • Fixtures: Utiliza fixtures de pytest para la configuración y limpieza
  • Marcadores: @pytest.mark.slow para pruebas de larga duración

Organización de las 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 pruebas#

import pytest

@pytest.mark.slow
def test_full_training():
    """Test full training run (slow)."""
    model = YOLO("yolo26n.pt")
    model.train(data="coco128.yaml", epochs=1)

Comprobaciones 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/

Obtén más información sobre los estándares de código en nuestro flujo de trabajo de desarrollo.

Comprobación de tipos#

# Run mypy (where configured)
mypy ultralytics/

Formato de docstrings#

pip install ultralytics-actions
# Auto-fix
ultralytics-actions-format-python-docstrings .

Solución de problemas de CI 🔧#

Las pruebas pasan localmente pero fallan en CI#

Causas comunes:

  • Problemas específicos de la plataforma: Prueba en el SO de destino
  • Diferencias en la versión de Python: Comprueba la compatibilidad de versiones
  • Dependencias faltantes: Verifica la configuración de CI
  • Problemas de tiempo o concurrencia: Añade reintentos o aumenta los tiempos de espera

Ejecuciones de CI lentas#

Soluciones:

  • Usa @pytest.mark.slow para pruebas costosas
  • Simula las dependencias externas
  • Reduce el tamaño de los conjuntos de datos de prueba
  • Paraleliza con pytest-xdist

Pruebas inestables#

Soluciones:

  • Añade reintentos para pruebas dependientes de la red
  • Aumenta los tiempos de espera para operaciones lentas
  • Corrige las condiciones de carrera en código asíncrono
  • Utiliza semillas aleatorias deterministas

Métricas de rendimiento 📈#

CI realiza un seguimiento de las métricas clave:

  • Velocidad de inferencia (FPS)
  • Uso de memoria
  • Tamaño del modelo
  • Tiempos de exportación

Las regresiones significativas bloquean la fusión. Si las métricas cambian:

  1. Verifica que el cambio sea esperado
  2. Documenta el motivo en el PR
  3. Obtén la aprobación de los mantenedores

Estado de CI 📋#

Consulta el estado de CI para todos los repositorios de Ultralytics en docs.ultralytics.com/help/CI.

Insignias del repositorio principal#

CI Docker Links PyPI codecov

Omitir las comprobaciones de CI ⚠️#

Añade [skip ci] al mensaje del commit para omitir CI (úsalo con moderación):

git commit -m "Update README [skip ci]"

Solo para:

  • Cambios exclusivos de documentación
  • Actualizaciones de archivos que no son código
  • Correcciones urgentes de emergencia (con aprobación)

Recursos 📚#