跳至内容

CI/测试工作流程 🧪

持续集成(CI)对于通过及早发现问题来保持高质量代码至关重要。本指南涵盖以下方面的 CI 测试和质量检查 Ultralytics项目的 CI 测试和质量检查。

CI 行动 🔄

所有 PR 在合并前必须通过自动 CI 检查。我们的 CI 管道包括

CI 测试

主要 CI 测试运行单元测试、内衬检查和综合测试。

Docker 部署

使用 Docker 验证部署,确保 Dockerfile 和相关脚本正常运行。

扫描代码库,查找markdown 和 HTML 文件中的断开或死链接。

代码QL 分析

GitHub 用于查找潜在安全漏洞和维护代码质量的语义分析工具。

PyPI 发布

验证项目能否打包并无误地发布到PyPI 。

平台测试 🖥️

测试在多个环境中运行:

  • 操作系统:Ubuntu、Windows、macOS
  • Python:3.8, 3.9, 3.10, 3.11, 3.12

代码覆盖率 📊

我们使用Codecov对代码覆盖率进行测量和可视化,以便深入了解测试对代码库的影响。

覆盖范围整合

Codecov 集成提供

  • 详细的覆盖范围洞察
  • 提交之间的覆盖率比较
  • 代码上的可视化叠加显示覆盖行
  • 覆盖百分比 ultralytics 包装

查看完整报道详情,请访问codecov.io/github/ultralytics/ultralytics

了解保险范围

代码覆盖率显示测试期间执行代码的百分比。高覆盖率表明代码测试良好,但并不保证没有错误。覆盖率有助于识别可能容易出错的未测试区域。

在本地运行测试 🖥️

安装开发依赖项

pip install -e ".[dev]"

运行所有测试

pytest tests/

运行特定测试

# 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

覆盖运行

pytest --cov=ultralytics tests/

平行测试

# Install pytest-xdist
pip install pytest-xdist

# Run tests in parallel
pytest -n auto

写作测试 ✍️

测试结构

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()

最佳做法

  • 描述性名称: test_export_onnx_format()test_1()
  • 单一断言:每个函数测试一件事
  • 快速测试:使用小型模型/数据集
  • 固定装置:使用 pytest 固定装置进行设置/调试
  • 标记: @pytest.mark.slow 用于长期测试

测试组织

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

测试标记

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)

代码质量检查 🎯

使用 Ruff 格式

# Check formatting
ruff check ultralytics/

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

# Format code
ruff format ultralytics/

进一步了解我们开发工作流程中的代码标准。

类型检查

# Run mypy (where configured)
mypy ultralytics/

文档字符串格式化

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

CI 故障排除 🔧

测试在本地通过,但在 CI 中失败

常见原因

  • 特定平台问题:在目标操作系统上进行测试
  • Python 版本差异:检查版本兼容性
  • 缺少依赖项:验证 CI 配置
  • 定时/并发问题:添加重试或增加超时

慢速 CI 运行

解决方案

  • 使用 @pytest.mark.slow 昂贵的测试
  • 模拟外部依赖关系
  • 减少测试数据集的大小
  • 并行 pytest-xdist

缺陷测试

修复:

  • 为依赖网络的测试增加重试
  • 增加慢速操作的超时
  • 修复异步代码中的竞赛条件
  • 使用确定性随机种子

性能基准 📈

传播和信息部门跟踪关键指标:

  • 推理速度(每秒)
  • 内存使用情况
  • 模型尺寸
  • 出口时间

显著回归阻止合并。如果指标发生变化:

  1. 核实预期变化
  2. 公关中的文件理由
  3. 获得维护者的批准

CI 状态 📋

docs.ultralytics.com/help/CI 查看所有ultralytics 软件源的CI 状态。

主存储库徽章

CI Docker 链接 PyPI 编码解码器

跳过 CI 检查 ⚠️

添加 [skip ci] 来提交跳过 CI 的信息(少用):

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

只适用于

  • 仅更改文件
  • 非代码文件更新
  • 紧急修补程序(经批准)

资源 📚



📅创建于 6 天前 ✏️已更新 6 天前