mcpField
P
python-testing-strategies

python-testing-strategies

github.com/c0x12c测试与质量109108 次安装19 周前更新
代码仓库

关于 python-testing-strategies

面向测试 FastAPI 类端点的开发者,提供编写和运行异步 Python 测试的速查指南,重点涵盖异步配置、端点覆盖和测试隔离。

主要功能

  1. 01pytest 异步配置
  2. 02使用 httpx AsyncClient 与 ASGITransport
  3. 03端点覆盖清单
  4. 04测试数据工厂建议
  5. 05常见异步测试陷阱

适用场景

  1. 01为 API 端点配置异步测试
  2. 02检查端点的成功与错误情形
  3. 03避免数据库状态在测试间泄漏

安装

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

$npx skills add https://github.com/c0x12c/ai-toolkit --skill python-testing-strategies

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

附带文件examples.md

详细介绍

Python 测试策略 — 快速参考

设置(关键)

在 pyproject.toml 中设置 asyncio_mode = "auto",以便自动检测异步测试,无需标记。(如果使用 @pytest.mark.asyncio 标记测试,默认的 "strict" 模式也可正常工作。)

完整的 conftest.py 和 pyproject.toml 设置请参阅 examples.md。

测试客户端

使用 httpx.AsyncClient + ASGITransport,异步测试中切勿使用 TestClient。

客户端 fixture 设置请参阅 examples.md。

每个端点所需的覆盖范围

  1. 正常流程(创建、读取、更新、删除)
  2. 未找到(404)
  3. 验证错误(422)
  4. 身份验证失败(401)——适用于受保护的端点
  5. 软删除——不返回已删除的记录

测试命名

async def test_create_item():           # Happy path
async def test_create_item_missing_name():  # Validation
async def test_get_item_not_found():    # 404
async def test_get_item_soft_deleted(): # Soft delete

测试数据工厂

使用默认值合理的简单工厂函数。只覆盖测试关注的部分。

工厂模式请参阅 examples.md。

运行测试

pytest                           # All tests
pytest tests/test_items.py       # One file
pytest -k "test_create"          # By name pattern
pytest --tb=short -q             # Quiet output

注意事项

  • 缺少 asyncio_mode = "auto" 会导致所有内容悄无声息地出错。 测试看似通过(收集到 0 项),或无限期挂起。在编写任何异步测试之前,先将 [tool.pytest.ini_options] asyncio_mode = "auto" 添加到 pyproject.toml。这是“我的测试无法运行”的头号原因。

  • TestClient 和 AsyncClient 不能互换。 TestClient(来自 Starlette)是同步的,会阻塞;AsyncClient(来自 httpx)是异步的,会使用事件循环。如果应用使用带有 await 的 async def 路由,就必须使用搭配 ASGITransport 的 AsyncClient。使用 TestClient 可能会掩盖异步错误,因为它以同步方式运行。

  • 没有正确清理时,数据库状态会在测试之间泄漏。 每个测试都需要一个干净的数据库。使用 autouse=True fixture 来创建/删除表,或在测试之间清空数据。否则,测试顺序会影响结果,CI 中也会出现随机失败。

  • 默认情况下,response.json() 返回的是 FastAPI 的 snake_case 格式。 如果 Pydantic 模型使用了 alias_generator,JSON 键可能与 Python 字段名不同。断言时务必使用实际的 JSON 键,而非 Python 属性名。

  • 在异步测试中忘记使用 await 会导致令人困惑的错误。 如果测试输出中出现 <coroutine object ...>,而不是实际数据,说明你漏写了 await。每个 client.get()、client.post() 等调用都必须使用 await。

评论

支持 Markdown