ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Anomalib 测试指南:使用 pytest 与 tox 构建异常检测库的完整质量保障体系

Anomalib 测试指南:使用 pytest 与 tox 构建异常检测库的完整质量保障体系 Anomalib 测试指南使用 pytest 与 tox 构建异常检测库的完整质量保障体系【免费下载链接】anomalibAn anomaly detection library comprising state-of-the-art algorithms and features such as experiment management, hyper-parameter optimization, and edge inference.项目地址: https://gitcode.com/GitHub_Trending/an/anomalib导读Anomalib 是一个覆盖数据加载、模型训练、指标评估与边缘推理全流程的异常检测库其代码质量由一整套自动化测试体系支撑。本文以 tests/README.md 为骨架系统讲解如何用pytest运行单元/集成测试、如何用pytest-cov度量代码覆盖率以及如何用tox在多 Python 版本与多任务环境下自动执行测试、代码规范检查和容器安全扫描。读完本文你将掌握 Anomalib 从环境搭建到 CI 级质量门禁的完整测试工作流并能结合仓库中的 tox.ini、pyproject.toml 与测试基座代码如 tests/conftest.py理解其底层实现。一、Anomalib 的测试体系概览Anomalib 的测试代码统一存放在仓库根目录的 tests 下从源码结构看主要分为三个层次tests/unit单元测试覆盖 CLI、数据模块datamodule、部署deploy、引擎engine、指标metrics、模型models、管线pipelines、后处理post_processing、预处理pre_processing、工具utils与可视化visualization等独立组件tests/integration集成测试验证组件之间的协同工作重点覆盖通过 API 与 CLI 完成模型的训练training、导出export与推理inference。其中 tests/integration/tools 下的test_torch_entrypoint.py、test_openvino_entrypoint.py、test_lightning_entrypoint.py等即是对tools/inference/下各推理入口脚本的端到端验证tests/helpers测试辅助工具如 data.py 中基于 Perlin 噪声扰动生成的 dummy 数据集生成器用于在不下载真实数据集的前提下快速构造训练/测试数据。二、环境准备与依赖安装2.1 前置条件运行 Anomalib 测试需要以下工具依赖用途Python 3.10 或更新版本运行测试的解释器注意README 中写的是 Python 3.8但当前仓库 pyproject.toml 中requires-python 3.10请以仓库实际要求为准pytest核心测试框架pytest-covpytest 覆盖率插件pytest-sugar带进度条与着色输出的 pytest 增强插件pytest-xdist测试并行分发插件coverage[toml]覆盖率测量工具支持从 pyproject.toml 读取配置tox多环境自动化测试工具prek提交前检查pre-commit 类工具的驱动这些依赖全部被声明在 pyproject.toml 的[project.optional-dependencies]中testextra 包含prek、pytest、pytest-cov、pytest-xdist、pytest-mock、pytest-sugar、pytest-timeout、pytest-json-report、coverage[toml]、tox、commitizen等devextra 则是full docs test的组合anomalib[full,docs,test]适合本地开发与测试场景。2.2 创建虚拟环境并安装官方推荐使用虚拟环境隔离依赖例如通过 conda 创建conda create -n anomalib_env python3.10 conda activate anomalib_env克隆仓库并进入目录安装时git clone使用当前仓库地址git clone https://gitcode.com/GitHub_Trending/an/anomalib.git cd anomalib pip install -e .[all].[all]会安装全部可选依赖。若只想安装测试所需的最小依赖集可以仅安装dev或testextrapip install -e .[dev] # 包含测试、文档与完整功能依赖 pip install -e .[test] # 仅测试相关依赖说明README 中提到的pip install -e requirements/dev.txt在当前仓库中已不存在依赖统一由 pyproject.toml 的 extras 管理请以上述命令为准。三、使用 pytest 运行测试3.1 运行全部测试在仓库根目录直接执行pytestpytest会依据 pyproject.toml 中的[tool.pytest.ini_options]自动发现并运行 tests 下的全部测试。该配置段的关键默认行为如下testpaths tests默认只扫描tests目录pythonpath src将src加入模块搜索路径使测试可以直接导入anomalib包addopts [--strict-markers, --strict-config, --showlocals, -ra]强制使用已注册的 marker、严格校验配置文件、断言失败时展示局部变量并在总结中报告所有结果markers注册了三个自定义标记gpu需要 GPU、cpu仅 CPU默认、network需要网络访问。3.2 运行指定测试文件pytest tests/path/to/test_file.py例如只运行推理入口点的集成测试pytest tests/integration/tools/test_torch_entrypoint.py3.3 详细输出pytest -v-vverbose会逐条列出每个测试用例的名称与结果PASSED/FAILED/SKIPPED便于在大量测试中快速定位失败项。四、使用 pytest-cov 检查测试覆盖率4.1 基础覆盖率报告pytest-cov是 pytest 的覆盖率插件可直接测量测试对代码的覆盖程度pytest --cov./该命令运行全部测试并报告项目整体覆盖率包括每个模块的语句/分支覆盖率与缺失行号。4.2 生成 HTML 覆盖率报告pytest --cov./ --cov-report html运行完成后会生成一个名为htmlcov的目录浏览器打开其中的index.html即可查看带源码标注的交互式覆盖率报告逐行高亮未覆盖代码便于针对性补测试。4.3 覆盖率配置与门槛覆盖率的排除规则与路径映射配置在 pyproject.toml 的[tool.coverage.report]中例如自动排除pragma: no cover、abstractmethod、raise NotImplementedError、if TYPE_CHECKING:等样板代码[tool.coverage.paths]的source [src, .tox/*/site-packages]则用于在 tox 环境下正确归一化源码路径。更值得注意的是tox 的pre-merge环境在运行覆盖率的同时还设置了硬性门槛--cov-fail-under75即整体覆盖率低于 75% 时测试视为失败详见下文。五、使用 tox 自动化多环境测试tox用于跨多个 Python 环境自动执行测试Anomalib 的 tox 配置全部集中在 tox.ini。先看全局配置[tox] isolated_build True skip_missing_interpreters true envlist prek pre-merge-py{38,39,310} snyk-scanenvlist声明了默认会执行的三个环境族。README 中描述了其中五个测试任务的定位prekpre-commit在每次提交前运行用于尽早发现问题、防止有问题的代码进入仓库通常包含风格检查、单元测试与静态分析unit单元测试在代码合入主干或发布分支前运行测试各个独立组件integration集成测试同样在合入前运行验证组件之间的协同重点覆盖通过 API 与 CLI 训练、导出和推理模型trivy-scanTrivy 是开源的容器/依赖漏洞扫描器用于检查项目依赖中已知的安全漏洞bandit-scanBandit 用于发现 Python 代码中的常见安全问题检查潜在的安全漏洞。5.1 运行提交前检查tox -e prektox -e prek对应 tox 环境[testenv:prek] basepython py310 deps prek commands prek run --all-files即使用 Python 3.10 安装prek并对全部文件执行提交前检查。5.2 运行单元与集成测试tox -e pre-mergetox -e pre-mergeREADME 中的写法是tox -e pre-merge但结合 tox.ini 的实际定义该环境被参数化为pre-merge-py{38,39,310}即pre-merge-py38、pre-merge-py39、pre-merge-py310因此本地执行时应写全环境名例如tox -e pre-merge-py310该环境做了三件事安装 Anomalib 本体pip install .[full]运行单元与集成测试并生成 XML 覆盖率报告且强制覆盖率不低于 75%pytest -v --tbauto tests/integration tests/unit \ --covanomalib \ --cov-reportxml:{toxworkdir}/coverage.xml \ --cov-fail-under75使用nbmake插件逐个执行examples/notebooks下的 Jupyter Notebook跳过依赖特殊环境的400_openvino与501_dobot确保文档示例代码可运行pytest -v --tbauto --nbmake examples/notebooks \ --ignoreexamples/notebooks/400_openvino \ --ignoreexamples/notebooks/500_use_cases/501_dobot此外该环境通过passenv透传CUDA_VISIBLE_DEVICES与ANOMALIB_DATASET_PATH等环境变量方便在有 GPU 或自备数据集的环境中运行。5.3 运行容器依赖漏洞扫描tox -e trivy-scantox -e trivy-scan该环境先安装 Anomalib再pip freeze导出依赖清单下载 Trivy 二进制对requirements.txt执行文件系统扫描并输出文本与 SPDX JSON 两种格式的结果最后清理临时文件。仓库的 CI 工作流如 .github/workflows/security-checks.yaml 与trivy-cve-guard.yaml同样在拉取合并请求前触发此类扫描。5.4 运行 Python 安全审计tox -e bandit-scantox -e bandit-scan该环境跳过安装本体skip_install true仅安装bandit并按 pyproject.toml 中[tool.bandit]的配置skips [B101]exclude_dirs [tests]递归扫描整个仓库将报告输出到bandit-report.txt。5.5 通过 tox 检查覆盖率tox的pre-merge环境内部已集成pytest-cov因此只要通过 tox 运行测试覆盖率报告XML 格式就会自动生成并写入{toxworkdir}/coverage.xml无需额外步骤。六、测试基座conftest 与 dummy 数据集理解 tests/conftest.py 能让你更高效地编写或运行 Anomalib 测试。它定义了覆盖整个测试套件的 session 级 fixtureproject_path在仓库根目录的tmp下创建临时项目目录权限0o700测试结束后自动清理dataset_path在项目目录内按ImageDataFormat与VideoDataFormat枚举自动生成全套 dummy 图片/视频数据集folder、tabular 格式除外RealIAD 因其独特格式被单独生成dataset_name参数化 fixture遍历 examples/configs/data 下的所有数据集 YAML 文件名用于数据相关测试ckpt_path按模型名返回预训练 checkpoint 路径若不存在则用 MVTecAD dummy 数据训练 1 个 epoch 现场生成。同时pytest_collection_modifyitems钩子会在收集阶段自动为未显式标记gpu的测试添加cpu标记因此默认情况下整个测试套件都可以在纯 CPU 环境运行。dummy 数据的生成逻辑在 tests/helpers/data.py 中实现DummyImageGenerator使用 PerlinAnomalyGenerator 以 Perlin 噪声生成异常扰动再以beta系数叠加到随机图像上从而在毫秒级构造出带 mask 的正常/异常样本对使模型测试不依赖真实工业数据集。七、常见问题与建议版本差异README 声称支持 Python 3.8但当前仓库 pyproject.toml 要求3.10且 tox 的pre-merge环境已参数化为py{38,39,310}以兼容旧解释器在本地请优先使用 3.10 及以上版本。首次运行较慢dataset_pathfixture 会为所有数据格式生成 dummy 数据集且ckpt_path首次访问需要训练模型建议在 CI 或本地缓存这些产物ANOMALIB_DATASET_PATH可指定数据集位置。覆盖率门槛提交 PR 前请确保整体覆盖率不低于 75%--cov-fail-under75否则 tox 的pre-merge环境会直接判失败。通过 pytest 的灵活执行、pytest-cov 的覆盖率度量与 tox 的多环境编排Anomalib 将单元测试、集成测试、Notebook 验证、安全扫描与代码规范检查整合为一条完整的质量保障流水线——这也是其 30 余种异常检测模型能够持续稳定演进的基础设施保障。【免费下载链接】anomalibAn anomaly detection library comprising state-of-the-art algorithms and features such as experiment management, hyper-parameter optimization, and edge inference.项目地址: https://gitcode.com/GitHub_Trending/an/anomalib创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表