Python Testing Patterns 是一套面向 Python 应用的测试策略,围绕 pytest、TDD 方法论与最佳实践展开。该技能说明了何时启用:编写新的 Python 代码(遵循 TDD:红、绿、重构)、为 Python 项目设计测试套件、评审 Python 测试覆盖率、搭建测试基础设施。
一、核心测试理念与覆盖率 技能要求始终遵循 TDD 循环:RED 为期望行为编写一个失败测试;GREEN 编写最小代码让测试通过;REFACTOR 在测试保持通过的前提下改进代码。文档给出了 add 函数的示例:先写 test_add_numbers 并断言结果为 5,再实现 return a + b,最后按需重构。覆盖率要求为 80% 以上,关键路径要求 100% 覆盖率,使用 pytest --cov 测量,命令示例为 pytest --cov=mypackage --cov-report=term-missing --cov-report=html。
二、pytest 基础与断言 基础测试结构包括 test_addition、test_string_uppercase、test_list_append 等示例。断言部分列举了相等、不等、真值、成员关系、比较、类型检查,并说明异常测试的推荐方式是 with pytest.raises(...),可用 match 检查异常消息,也可通过 exc_info 检查异常属性。
三、Fixtures 介绍了基本 fixture 用法、带 setup/teardown 的 fixture(yield 前为 setup,yield 后为 teardown)、fixture 作用域(function 默认、module、session)、带参数的 fixture(params 与 request.param,测试会按每个参数各运行一次)、多个 fixture 同时使用、autouse fixture(自动在每个测试前运行),以及通过 tests/conftest.py 定义共享 fixture,示例中提供共享 client 与生成认证头的 auth_headers。
四、参数化与标记 参数化覆盖基本用法、多参数、为用例指定可读 ID(ids),以及参数化 fixture,例如对 sqlite、postgresql、mysql 多个数据库后端运行同一测试。标记部分介绍自定义标记如 slow、integration、unit,运行筛选命令示例:pytest -m "not slow"、pytest -m integration、pytest -m "integration or slow"、pytest -m "unit and not slow",并说明在 pytest.ini 中配置 markers。
五、Mocking 与补丁 涵盖 mock 函数、mock 返回值、mock 异常(side_effect)、mock 上下文管理器(如 patch builtins.open 配合 mock_open)、使用 autospec 捕获 API 误用、mock 类实例(如 UserRepository)、mock 属性(PropertyMock)。示例展示了 assert_called_once、assert_called_once_with、assert_awaited_once 等断言。
六、异步代码与异常测试 异步测试基于 pytest-asyncio,示例包括 @pytest.mark.asyncio 的异步测试、异步 fixture、以及对异步函数进行 mock 并断言 assert_awaited_once。异常测试涵盖预期异常、带消息匹配的自定义异常、异常属性检查。
七、副作用与文件操作测试 演示如何使用 tempfile.NamedTemporaryFile 并配合 try/finally 清理,以及使用 pytest 内置的 tmp_path 与 tmpdir fixture 进行文件测试(tmp_path 自动清理)。
八、测试组织与常见模式 推荐的目录结构为 tests/ 下包含 conftest.py、init.py、unit/、integration/、e2e/ 子目录及对应测试文件。介绍了用测试类分组相关测试,并通过 autouse fixture 在每个测试前完成 setup。常见模式包括 API 端点测试(FastAPI/Flask)、数据库操作测试(基于 Session 的 begin_nested 与 rollback)、类方法测试等。
九、配置与最佳实践 pytest.ini 示例配置包含 testpaths、python_files、python_classes、python_functions 以及 addopts(--strict-markers、--disable-warnings、--cov、--cov-report)。最佳实践方面,建议遵循 TDD、每个测试只验证一个行为、使用描述性名称、用 fixture 消除重复、mock 外部依赖、测试边界情况、追求 80% 以上覆盖率、保持测试快速;不建议测试实现细节、在测试中使用复杂条件、忽略失败、测试第三方代码、在测试间共享状态、在测试中捕获异常(应使用 pytest.raises)、使用 print 语句、编写过于脆弱的测试。
该技能适用于 Python 测试编写、测试套件设计、覆盖率评审与测试基础设施搭建。关于具体授权与收费信息,资料中暂未提供。