pytest 技能是一套围绕 pytest 的完整 Python 测试工具集,用于在开发过程中编写、组织和运行测试。资料将其定位为“Python testing mastery with pytest”,并指明在用户要求编写测试、添加 pytest fixture、mock 某个依赖等场景下使用。
一、用途与适用场景 该技能适用于 Python 项目的测试实践,包括:为代码编写测试、组织测试文件与目录、通过 fixture 管理测试前置与清理逻辑、用参数化减少重复用例、对依赖进行 mock、设置跳过或预期失败标记,以及统计测试覆盖率。资料中涉及的具体场景涵盖运行全部测试、运行特定文件或目录、运行特定测试、并发运行等。
二、主要能力
- 运行测试:资料列出 pytest 常规用法,如直接运行 pytest、指定 tests/test_api.py 或 tests/ 目录、指定单个测试(tests/test_api.py::test_login)或类方法(tests/test_api.py::TestUserClass::test_create);输出详细程度用 -v、-vv;首次失败即停止用 -x;仅运行上次失败用 --lf;先运行失败再运行其余用 --ff;显示 print 输出用 -s;并行需要 pytest-xdist,可用 pytest -n auto 或 pytest -n 4。
- Fixture:支持基础 fixture、带 teardown 的 yield fixture、autouse fixture、带 scope 的 fixture(function、class、module、package、session),以及带 params 的 fixture(通过 request.param 访问)。fixture 通过在测试函数参数中声明来使用。
- 参数化:使用 @pytest.mark.parametrize 支持基本参数化、多重堆叠参数化以生成组合用例,并可用 pytest.param 指定自定义 id。
- Mock:基于 unittest.mock 的 Mock、patch、MagicMock,支持 patch 装饰器与 with patch 上下文管理器方式,可用 pytest-mock 提供的 mocker fixture;资料还展示 side_effect 的异常、序列与函数三种用法,以及 Mock(spec=MyClass) 的 spec 模式。
- 标记:支持 @pytest.mark.skip、skipif、xfail 与自定义标记(如 slow),可用 pytest -m slow 或 pytest -m "not slow" 按标记筛选;标记需在 pytest.ini 或 pyproject.toml 中注册。
- 断言:支持常规 assert、成员判断、is None 判断;pytest.raises 可配合 match 做异常断言;pytest.approx 支持近似比较并可指定 rel;pytest.warns 可断言警告。
- 覆盖率:安装 pytest-cov 后可用 --cov=myapp,支持 html 报告、term-missing、分支覆盖 --cov-branch,以及最低阈值 --cov-fail-under=80。
- 共享 fixture:conftest.py 中定义的 fixture 可供所有测试使用,资料给出了 app、client、auth_headers 等示例。
- 配置:可在 pyproject.toml 的 [tool.pytest.ini_options] 中设置 testpaths、python_files、python_functions、addopts、markers、filterwarnings 等。
三、使用方式 资料给出的使用方式为:在测试目录中按 pytest 约定编写测试文件与函数,通过命令行运行;在 conftest.py 中集中定义共享 fixture;在 pyproject.toml 或 pytest.ini 中完成配置与标记注册;需要覆盖率时安装并调用 pytest-cov;需要并行时安装 pytest-xdist;需要 mocker 时使用 pytest-mock。资料末尾提到可参考 references/patterns.md 获取高级模式、插件与异步测试内容。
四、限制与未提供信息 资料未说明该技能的收费方式、价格、版本要求、支持的平台范围以及具体安装步骤(除 pytest-cov 的 pip install 示例外),这些信息暂未提供。