Ultralytics YOLO27:
Get Started

Flujo de trabajo de CI y pruebas 🧪#

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

Acciones de CI 🔄#

Todas las PR deben superar las comprobaciones automatizadas de CI antes de fusionarse. Nuestra canalización de CI incluye:

Pruebas de CI#

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

Despliegue con Docker#

Valida el despliegue con Docker y comprueba que el Dockerfile y los scripts relacionados funcionen correctamente.

Analiza el código para encontrar enlaces rotos o inactivos en archivos Markdown y HTML.

Análisis de CodeQL#

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

Publicación en PyPI#

Valida que el proyecto pueda empaquetarse y publicarse en PyPI sin errores.

Pruebas en distintas plataformas 🖥️#

Las pruebas se ejecutan en varios entornos:

  • Sistemas operativos: Ubuntu, Windows, macOS
  • Python: 3.13 para la matriz principal, además de tareas de compatibilidad con las versiones 3.8-3.12

Cobertura de código 📊#

Usamos Codecov para medir y visualizar la cobertura del código, lo que permite saber hasta qué punto las pruebas ejercitan el código.

Integración de la cobertura#

La integración de Codecov ofrece:

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

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

Entender la cobertura#

La cobertura de código indica qué porcentaje del código se ejecuta durante las pruebas. Una cobertura alta indica que el código está bien probado, pero no garantiza que no haya errores. La cobertura ayuda a identificar las áreas sin probar que podrían ser propensas a errores.

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_export

# Tests matching pattern
pytest -k "export"

# Slow tests only
pytest --slow -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()

Buenas prácticas#

  • Nombres descriptivos: test_export_onnx_format(), no test_1()
  • Una sola aserción: prueba una cosa por función
  • Pruebas rápidas: usa modelos o conjuntos de datos pequeños
  • Fixtures: usa fixtures de pytest para la preparación y la limpieza
  • Marcadores: @pytest.mark.slow para pruebas de larga duración

Organización de las pruebas#

Consulta el directorio de pruebas del repositorio original para ver la organización actual de las pruebas.

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/

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 los docstrings#

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

Solución de problemas de CI 🔧#

Las pruebas se superan localmente, pero fallan en CI#

Causas habituales:

  • Problemas específicos de la plataforma: prueba en el sistema operativo de destino
  • Diferencias entre versiones de Python: comprueba la compatibilidad de las versiones
  • Dependencias que faltan: revisa la configuración de CI
  • Problemas de temporización o concurrencia: añade reintentos o aumenta los tiempos de espera

Ejecuciones de CI lentas#

Soluciones:

  • Usa @pytest.mark.slow para las pruebas que requieren muchos recursos
  • Simula las dependencias externas
  • Reduce el tamaño de los conjuntos de datos de prueba
  • Ejecuta en paralelo con pytest-xdist

Pruebas inestables#

Soluciones:

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

Pruebas de rendimiento 📈#

CI realiza un seguimiento de métricas clave:

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

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

  1. Comprueba que el cambio sea esperado
  2. Documenta el motivo en la PR
  3. Obtén la aprobación de las personas responsables del mantenimiento

Estado de CI 📋#

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

Insignias del repositorio principal#

CI Docker Enlaces PyPI codecov

Omitir 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 exclusivamente en la documentación
  • Actualizaciones de archivos que no sean de código
  • Correcciones urgentes (con aprobación)

Recursos 📚#