python-testing 是一个为 Python 包构建测试基础设施的技能,核心目标是让测试在压力下仍然可信,避免“绿色但无意义”的测试套件。它关注 pytest 配置、分支覆盖率门槛、Hypothesis 属性测试、变异测试和多版本运行,并强调这些机制必须被证明真正生效。
用途 该技能用于为 Python 包搭建完整的测试基础设施,防止以下失败模式:覆盖率门槛静默通过、配置表被静默忽略、测试套件被人类或智能体反复编辑直到不再证明任何东西。它不适用于为单个文件或函数写测试、诊断单个失败测试、编写 CI 工作流 YAML、打包工作以及 Git 钩子配置。
主要能力
- 只读审计:通过 scripts/check_test_config.py 检查 pytest 和覆盖率配置,发现被遮蔽的配置源、错误的配置表、缺失的分支覆盖率或门槛。
- pytest 配置:强调单一配置源,根据安装的 pytest 主版本选择 [tool.pytest] 或 [tool.pytest.ini_options],并启用 --strict-markers、--strict-config 和 filterwarnings = ["error"]。
- 覆盖率:开启 branch = true,设置 fail_under 在 80–90 区间,并演示门槛在未达标时确实返回非零退出码。
- 属性测试:在解析器、序列化器、编解码器和算法代码中使用 Hypothesis,注册 settings 配置文件,持久化 .hypothesis/ 示例数据库。
- 变异测试:使用 mutmut、cosmic-ray 或 pytest-gremlins 检验测试是否能发现错误,首次运行限定范围并分类存活变异体。
- 多版本运行:通过 uv 循环、tox 或 nox 在多个 Python 版本上运行测试,覆盖率先合并再统一设门槛。
使用方式 技能以工作流形式组织:先运行只读审计脚本,再确认 pytest 版本和项目布局;然后在 pyproject.toml 中配置 pytest 和覆盖率;接着设置布局与发现规则;开启分支覆盖率并证明门槛;在合适场景添加 Hypothesis;按需引入变异测试;最后配置多版本运行并验证。所有命令通过 uv 调用,若不可用则回退到 pip install -e ".[dev]" 和 python -m pytest。
适用场景 适用于需要为 Python 包建立长期可信测试基础设施的项目,尤其是涉及解析器、序列化器、编解码器、算法代码,或需要多版本兼容、覆盖率门槛、属性测试和变异测试的场景。也适用于智能体参与编辑测试后需要额外验证的情况。
限制 不处理 CI 工作流 YAML、打包工作、Git 钩子配置和单个失败测试的诊断。变异测试不建议第一天就作为 CI 门槛。多版本运行中不应在每个版本分支内强制 fail_under。部分工具存在已知问题,如 pytest-cov 低于 7.1 的退出码 bug、pytest 9.0.x 的严格标志回归、nox 的 .python-version 固定问题等。具体版本兼容性和工具选择需根据项目实际情况判断。