SuperAPI AI 工具集

python-testing-patterns

测试与质量

查看项目

更新于 10-16 07:31

技能介绍

Python Testing Patterns 是一份系统化的 Python 测试实践指南,围绕 pytest、fixtures、mocking、参数化与测试驱动开发(TDD)展开,用于实现较完整的测试策略。

【用途】 适合以下场景:为 Python 代码编写单元测试;搭建测试套件与测试基础设施;实施测试驱动开发;为 API 与服务编写集成测试;mock 外部依赖与服务;测试异步代码与并发操作;在 CI/CD 中设置持续测试;实施基于属性的测试;测试数据库操作;调试失败的测试。

【核心概念】

  1. 测试类型:单元测试(隔离测试单个函数/类)、集成测试(测试组件间交互)、功能测试(端到端测试完整特性)、性能测试(衡量速度与资源使用)。
  2. 测试结构(AAA 模式):Arrange 准备测试数据与前置条件,Act 执行被测代码,Assert 验证结果。
  3. 测试覆盖率:衡量测试覆盖了哪些代码,识别未被测试的代码路径,目标是“有意义的覆盖”而非仅追求高百分比。
  4. 测试隔离:测试之间应相互独立,不共享状态,每个测试自行清理。

【快速开始】 示例文件 test_example.py 定义 add(a, b) 函数,编写 test_add 断言 add(2, 3) == 5,test_add_negative 断言 add(-1, 1) == 0,运行命令为:pytest test_example.py。更详细的模式与完整示例位于 references/details.md,当上层导航信息不足时可查阅该文件。

【测试最佳实践】 测试组织方面,给出的目录结构示例为:tests/ 下包含 init.py、conftest.py(共享夹具)、test_unit/(test_models.py、test_utils.py)、test_integration/(test_api.py、test_database.py)、test_e2e/(test_workflows.py)。 测试命名约定推荐 test_<unit><scenario><expected_outcome>,可根据团队偏好调整,例如 test_create_user_with_valid_data_returns_user、test_create_user_with_duplicate_email_raises_conflict、test_get_user_with_unknown_id_returns_none。好的命名清晰可描述(如 test_user_creation_with_valid_data、test_login_fails_with_invalid_password、test_api_returns_404_for_missing_resource);应避免 test_1、test_user、test_function 这类无描述性、过于模糊或不说明测试内容的命名。

【重试行为测试】 通过 unittest.mock 的 Mock side_effect 验证重试逻辑:test_retries_on_transient_error 设置 client.request.side_effect 为两次 ConnectionError 后一次成功字典,断言结果为 {"status": "ok"} 且 call_count == 3;test_gives_up_after_max_retries 设置始终 ConnectionError,用 pytest.raises 断言抛出异常且调用 3 次;test_does_not_retry_on_permanent_error 设置 ValueError,断言抛出 ValueError 且仅调用 1 次(不重试)。

【用 Freezegun 模拟时间】 使用 freezegun 控制测试中的时间以获得可预测的时间相关行为:@freeze_time("2026-01-15 10:00:00") 下 test_token_expiry 断言 token.expires_at == datetime(2026, 1, 15, 11, 0, 0);test_is_expired_returns_false_before_expiry 断言未过期;@freeze_time("2026-01-15 12:00:00") 下 test_is_expired_returns_true_after_expiry 断言已过期;test_with_time_travel 使用 freeze_time 上下文并在内部用 frozen_time.move_to("2026-01-15") 推进时间,断言 item.age_days == 14。示例中包含 create_token、Token、create_item 等示意对象。

【测试标记】 使用 @pytest.mark.slow 标记慢测试,@pytest.mark.integration 标记集成测试,@pytest.mark.skip(reason=...) 临时跳过,@pytest.mark.skipif(os.name == "nt", reason=...) 条件跳过,@pytest.mark.xfail(reason=...) 标记预期失败。运行方式:pytest -m slow 只跑慢测试,pytest -m "not slow" 跳过慢测试,pytest -m integration 只跑集成测试。

【覆盖率报告】 安装:pip install pytest-cov。运行:pytest --cov=myapp tests/;生成 HTML 报告:pytest --cov=myapp --cov-report=html tests/;覆盖率低于阈值即失败:pytest --cov=myapp --cov-fail-under=80 tests/;显示未覆盖行:pytest --cov=myapp --cov-report=term-missing tests/。

【限制与补充】 资料指出高级模式(异步测试、monkeypatching、基于属性的测试、数据库测试、CI/CD 集成与配置)需查阅 references/advanced-patterns.md。关于该技能的安装方式、收费与价格、支持的平台、实际效果与具体使用步骤,资料中暂未提供。