Meet YOLO26: next-gen vision AI.

Link to this sectionFlujo de trabajo de CI/pruebas 🧪#

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

Link to this sectionAcciones de CI 🔄#

Todos los PR deben superar las comprobaciones automáticas de CI antes de fusionarse. Nuestro pipeline de CI incluye:

Link to this sectionPruebas de CI#

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

Link to this sectionDespliegue de Docker#

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

Link to this sectionEnlaces rotos#

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

Link to this sectionAnálisis de CodeQL#

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

Link to this sectionPublicación en PyPI#

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

Link to this sectionPruebas de plataforma 🖥️#

Las pruebas se ejecutan en múltiples entornos:

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

Link to this sectionCobertura de código 📊#

Usamos Codecov para medir y visualizar la cobertura de código, proporcionando información sobre qué tan bien cubren las pruebas el código base.

Link to this sectionIntegración de cobertura#

La integración de Codecov proporciona:

  • Información detallada sobre la 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 todos los detalles de cobertura en codecov.io/github/ultralytics/ultralytics.

Link to this sectionEntendiendo la cobertura#

La cobertura de código muestra qué porcentaje del código se ejecuta durante las pruebas. Una cobertura alta 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 errores.

Link to this sectionEjecutar pruebas localmente 🖥️#

Link to this sectionInstalar dependencias de desarrollo#

pip install -e ".[dev]"

Link to this sectionEjecutar todas las pruebas#

pytest tests/

Link to this sectionEjecutar 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

Link to this sectionEjecutar con cobertura#

pytest --cov=ultralytics tests/

Link to this sectionPruebas en paralelo#

# Install pytest-xdist
pip install pytest-xdist

# Run tests in parallel
pytest -n auto

Link to this sectionEscribir pruebas ✍️#

Link to this sectionEstructura 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()

Link to this sectionBuenas prácticas#

  • Nombres descriptivos: test_export_onnx_format() no test_1()
  • Aserción única: Prueba una sola cosa por función
  • Pruebas rápidas: Usa modelos/datasets pequeños
  • Fixtures: Usa fixtures de pytest para setup/teardown
  • Markers: @pytest.mark.slow para pruebas de larga duración

Link to this sectionOrganizació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

Link to this sectionMarcadores 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)

Link to this sectionComprobaciones de calidad del código 🎯#

Link to this sectionFormateo con Ruff#

# Check formatting
ruff check ultralytics/

# Auto-fix issues
ruff check --fix ultralytics/

# Format code
ruff format ultralytics/

Aprende más sobre los estándares de código en nuestro flujo de trabajo de desarrollo.

Link to this sectionComprobación de tipos#

# Run mypy (where configured)
mypy ultralytics/

Link to this sectionFormateo de docstrings#

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

Link to this sectionSolución de problemas de CI 🔧#

Link to this sectionLas 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/concurrencia: Añade reintentos o aumenta los tiempos de espera (timeouts)

Link to this sectionEjecuciones de CI lentas#

Soluciones:

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

Link to this sectionPruebas inestables (Flaky tests)#

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
  • Usa semillas aleatorias deterministas

Link to this sectionBenchmarks de rendimiento 📈#

El 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 significativas bloquean la fusión. Si las métricas cambian:

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

Link to this sectionEstado de CI 📋#

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

Link to this sectionInsignias del repositorio principal#

CI Docker Links PyPI codecov

Link to this sectionSaltar comprobaciones de CI ⚠️#

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

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

Solo para:

  • Cambios exclusivos en la documentación
  • Actualizaciones de archivos que no son código
  • Revisiones de emergencia (hotfixes) (con aprobación)

Link to this sectionRecursos 📚#