Ir al contenido

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.

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 ultralytics paquete

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

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 paralelas

# Install pytest-xdist
pip install pytest-xdist

# Run tests in parallel
pytest -n auto

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() no test_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.slow para 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

# Run mypy (where configured)
mypy ultralytics/

Formateo de docstrings

pip install ultralytics-actions
# Auto-fix
ultralytics-actions-format-python-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.slow para 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:

  1. Verificar el cambio previsto
  2. Razón documental en PR
  3. 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

CI Docker Enlaces PyPI codecov

Omisión de comprobaciones CI ⚠️

Añadir [skip ci] para confirmar el mensaje y omitir CI (utilícelo con moderación):

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

Sólo para:

  • Cambios sólo en la documentación
  • Actualizaciones de archivos no codificados
  • Revisiones de emergencia (con aprobación)

Recursos 📚



Creado hace 6 días ✏️ Actualizado hace 6 días