用途:这是一份基于 pytest 的 Python 测试编写与评估指南,适用于编写测试、审阅测试代码、调试测试失败或提升测试覆盖率。
主要原则:每个测试应原子化、自包含,只验证单一行为;测试名称应在失败时说明哪里坏了。多个断言可以,但须验证同一行为。同一概念的不同变体用参数化处理,不相关的行为用独立测试。
项目特定规则:项目全局设置 asyncio_mode = "auto",因此异步测试无需再写 @pytest.mark.asyncio。所有导入放在文件顶部,不做局部导入。测试 FastMCP 时直接把服务器对象传给客户端,使用内存传输;仅在明确测试网络功能时才用 HTTP 传输。
复杂数据结构:可用 inline-snapshot 测试 JSON Schema 与复杂结构,命令为 pytest --inline-snapshot=create(填充空快照)和 pytest --inline-snapshot=fix(有意变更后更新)。
Fixture 与 Mock:优先函数作用域 fixture;文件操作用 tmp_path。在边界处 mock,不要把自有内部类 mock 掉,外部服务才 mock。
命名与错误测试:用能说明场景的描述性名称;用 pytest.raises 验证异常,可配合 match 匹配消息。
运行命令:uv run pytest -n auto(并行全量)、uv run pytest -n auto -x(首个失败即停)、uv run pytest path/to/test.py(指定文件)、uv run pytest -k "test_name"(匹配模式)、uv run pytest -m "not integration"(排除集成测试)。
提交前检查:每个测试只测一件事;不加 @pytest.mark.asyncio;导入在模块级;命名具描述性;非网络测试用内存传输;同一行为变体用参数化;不同行为分开写测试。