Skip to main content

Flujo de trabajo de CI/pruebas 🧪

La integración continua (CI) es fundamental para mantener un código de alta calidad, ya que permite detectar los problemas en una fase temprana. Esta guía aborda las pruebas de CI y los controles de calidad para los proyectos Ultralytics.

Acciones de CI 🔄

Todas las solicitudes de incorporación de cambios deben superar las comprobaciones automatizadas de integración continua antes de su fusión. Nuestro proceso de integración continua incluye:

Pruebas de CI

Prueba de integración primaria que ejecuta pruebas unitarias, comprobaciones de linting y pruebas exhaustivas.

Despliegue de Docker

Comprueba la implementación mediante Docker, asegurándose de que el archivo Dockerfile y los scripts relacionados funcionen correctamente.

Enlaces Rotos

Analiza el código fuente en busca de enlaces rotos o inactivos en archivos markdown HTML.

Análisis de CodeQL

La herramienta de análisis semántico de GitHub para detectar posibles vulnerabilidades de seguridad y garantizar la calidad del código.

PyPI

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

Pruebas de plataformas 🖥️

Pruebas realizadas en múltiples entornos:

  • Sistema operativo: 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 permite conocer en qué medida las pruebas cubren el código fuente.

Integración de la cobertura

La integración de Codecov ofrece:

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

Consulte todos los detalles de la cobertura en codecov.ultralytics.

Entender la cobertura

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

Ejecutar pruebas localmente 🖥️

Instalar las dependencias de desarrollo

pip install -e ".[dev]"

Ejecutar todas las pruebas

pytest tests/

Realizar 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

Correr con cobertura

pytest --cov=ultralytics tests/

Pruebas en paralelo

# Install pytest-xdist
pip install pytest-xdist

# Run tests in parallel
pytest -n auto

Redacción de exámenes ✍️

Estructura de la prueba

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() no están test_1()
  • Afirmación única: Prueba una cosa por función
  • Pruebas rápidas: Utiliza modelos o conjuntos de datos pequeños
  • Calendario: Utiliza los fixtures de pytest para la configuración y la limpieza
  • Marcadores: @pytest.mark.slow para pruebas de larga duración

Organización de la prueba

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("yolo26n.pt")
    model.train(data="coco128.yaml", epochs=1)

Comprobaciones de calidad del código 🎯

Formateo 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 las normas de código en nuestra flujo de trabajo de desarrollo.

Comprobación de tipos

# Run mypy (where configured)
mypy ultralytics/

Formato de las cadenas de documentación

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

Solución de problemas de CI 🔧

Las pruebas se superan en el entorno local, pero fallan en la integración continua

Causas comunes:

  • Problemas específicos de la plataforma: Prueba en el sistema operativo de destino
  • Diferencias entre Python: Comprueba la compatibilidad de versiones
  • Faltan dependencias: Comprobar la configuración de CI
  • Problemas de sincronización y concurrencia: Añadir reintentos o aumentar los tiempos de espera

Ejecuciones lentas de la integración continua

Soluciones:

  • Utilice @pytest.mark.slow para pruebas costosas
  • Simular dependencias externas
  • Reducir el tamaño de los conjuntos de datos de prueba
  • Paralelizar con pytest-xdist

Pruebas poco fiables

Correcciones:

  • Añadir reintentos para las pruebas que dependen de la red
  • Aumentar los tiempos de espera para las operaciones lentas
  • Corregir las condiciones de carrera en el código asíncrono
  • Utilizar semillas aleatorias determinísticas

Índices de rendimiento 📈

CI realiza un seguimiento de los indicadores clave:

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

Las regresiones significativas impiden la fusión de bloques. Si cambian las métricas:

  1. Comprueba si se espera un cambio
  2. Justificar el documento en la solicitud de incorporación de cambios
  3. Obtener la aprobación de los responsables del mantenimiento

Estado de CI 📋

Comprueba el estado de la integración continua de todos los repositorios Ultralytics en docs.ultralytics.com/ayuda/CI.

Insignias del repositorio principal

IC Docker Enlaces PyPI codecov

Omitir comprobaciones de integración continua ⚠️

Añadir [skip ci] Para que el mensaje de confirmación omita la integración continua (utilizar con moderación):

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

Solo para:

  • Cambios que solo afectan a la documentación
  • Actualizaciones de archivos que no son de código
  • Correcciones de emergencia (previa autorización)

Recursos 📚