mcpField
P
python-testing-patterns

python-testing-patterns

github.com/jurgendn测试与质量1138 次安装6 周前更新
代码仓库

关于 python-testing-patterns

面向 Python 开发者的测试模式技能,帮助编写聚焦的测试,让行为变更更安全。内容涵盖测试结构、边界隔离、fixtures、模拟对象及合理的测试套件层次。

主要功能

  1. 01采用聚焦的准备/执行/断言结构
  2. 02覆盖边界与错误情况
  3. 03指导 fixtures 与模拟对象
  4. 04说明测试套件金字塔
  5. 05提供定向测试检查清单

适用场景

  1. 01为特定行为编写测试
  2. 02测试错误路径和输入变体
  3. 03隔离网络或数据库影响
  4. 04规划单元、集成与端到端测试覆盖

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/jurgendn/agent-skills --skill python-testing-patterns

安装后在 Claude Code 中输入/python-testing-patterns确认已加载。

附带文件references/advanced-patterns.md

详细介绍

Python 测试模式

编写能让行为更安全地修改的测试。优先编写聚焦、易读的测试,而不是依赖巧妙的 fixture 或徒有其表的覆盖率。

有关异步测试、monkeypatch、基于属性的测试、数据库测试、CI 和覆盖率工具等高级模式,请阅读 references/advanced-patterns.md。

核心原则

  • 每个测试只验证一种行为。 失败时应能指向一种被破坏的行为。
  • 准备 / 执行 / 断言。 将设置、执行和验证明确区分。
  • 测试边界和错误。 只有正常路径的测试并不可靠。
  • 隔离外部影响。 如果网络、时间、随机性和服务不是待测行为,就对它们进行模拟。
  • 追求有意义的覆盖率。 覆盖重要行为和风险,而不是每一行代码。

Pytest 基本模式

def test_adds_two_numbers():
    result = add(2, 3)
    assert result == 5

测试异常:

import pytest

def test_rejects_zero_division():
    with pytest.raises(ValueError, match="zero"):
        divide(1, 0)

测试参数化用例:

import pytest

@pytest.mark.parametrize("value, expected", [
    ("[email protected]", True),
    ("not-an-email", False),
])
def test_email_validation(value, expected):
    assert is_valid_email(value) is expected

Fixtures

使用 fixture 复用设置,并明确其生命周期:

@pytest.fixture
def user():
    return User(id=1, email="[email protected]")

避免隐藏的 fixture 依赖网。如果一个测试需要许多 fixture,说明被测单元可能耦合过紧,或测试范围可能过宽。

模拟

在系统边界处进行模拟:

  • HTTP 客户端;
  • 文件系统或对象存储;
  • 不测试持久化时的数据库会话;
  • 时间和随机性;
  • 开销较大的模型/API 调用。

如果行为复杂到调用断言会变得脆弱,优先使用 fake,而不是 mock。

测试套件结构

采用小型测试金字塔:

  • 为纯逻辑编写许多单元测试;
  • 为边界编写较少的集成测试;
  • 为关键工作流编写少量端到端测试。

根据行为命名测试:

test_<unit>_<scenario>_<expected_behavior>

输出

在提供测试建议或编写测试时,返回:

  • 目标行为;
  • 所需的测试级别;
  • fixtures/mock;
  • 具体测试用例;
  • 尚未覆盖的边界/错误路径;
  • 运行聚焦测试的命令。

评论

支持 Markdown