Flujo de trabajo de CI/pruebas 🧪#
La integración continua (CI) es esencial para mantener un código de alta calidad, ya que permite detectar problemas de forma temprana. Esta guía aborda las pruebas de CI y las comprobaciones de calidad de los proyectos de Ultralytics.
Acciones de CI 🔄#
Todas las PR deben superar las comprobaciones automatizadas de CI antes de fusionarse. Nuestro pipeline 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 mediante Docker y garantiza que el Dockerfile y los scripts relacionados funcionen correctamente.
Enlaces rotos#
Analiza el código en busca de 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 se pueda empaquetar y publicar en PyPI sin errores.
Pruebas en distintas plataformas 🖥️#
Las pruebas se ejecutan en varios entornos:
- SO: Ubuntu, Windows, macOS
- Python: 3.13 para la matriz principal, además de trabajos de compatibilidad para 3.8-3.12
Cobertura de código 📊#
Usamos Codecov para medir y visualizar la cobertura de código, proporcionando información sobre hasta qué punto las pruebas ejercitan el código.
Integración de la cobertura#
La integración con 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 del paquete
ultralytics
Consulta todos los detalles 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 cobertura alta indica que el código se ha probado bien, 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/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 slowEjecutar con cobertura#
pytest --cov=ultralytics tests/Pruebas en paralelo#
# Install pytest-xdist
pip install pytest-xdist
# Run tests in parallel
pytest -n autoEscribir 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(), notest_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 configuración y la limpieza
- Marcadores:
@pytest.mark.slowpara pruebas de larga duración
Organización de las pruebas#
Consulta el directorio de pruebas ascendente para ver la organización actual de las pruebas.
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 los estándares de código en nuestro flujo de trabajo de desarrollo.
Comprobación de tipos#
# Run mypy (where configured)
mypy ultralytics/Formateo 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 habituales:
- Problemas específicos de la plataforma: prueba en el SO de destino
- Diferencias entre versiones de Python: comprueba la compatibilidad de versiones
- Faltan dependencias: verifica 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.slowpara las 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 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 comparativas 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 significativas bloquean la fusión. Si cambian las métricas:
- Verifica que el cambio sea esperado
- Documenta el motivo en la PR
- Obtén la aprobación de los mantenedores
Estado de CI 📋#
Consulta el estado de CI de todos los repositorios de Ultralytics en docs.ultralytics.com/help/CI.
Insignias del repositorio principal#
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 exclusivamente de documentación
- Actualizaciones de archivos que no sean de código
- Correcciones urgentes (con aprobación)
Recursos 📚#
- Guía oficial de CI - Documentación completa de CI
- Flujo de trabajo de desarrollo - Proceso de PR y estándares de código
- Documentación de GitHub Actions - Configuración de CI
- Documentación de pytest - Framework de pruebas
- Codecov - Informes de cobertura