Pytest代码审查
快速参考
| 问题类型 | 参考文档 |
|---|---|
使用async def test_*定义异步测试函数、AsyncMock以及await模式 |
references/async-testing.md |
conftest.py中的测试用例固定装置(fixtures)、作用域(scope)以及清理操作(cleanup) |
references/fixtures.md |
使用@pytest.mark.parametrize进行参数化测试 |
references/parametrize.md |
AsyncMock的调用跟踪、patch模式以及何时使用模拟(mocking) |
references/mocking.md |
审查 checklist
- 被测试的异步代码是否使用
async def test_*定义? - 是否对异步依赖项使用了
AsyncMock而非Mock? - 所有的异步模拟(mocks)和协程(coroutines)是否都正确地等待了结果(awaited)?
- 是否在
conftest.py中定义了用于共享测试环境的固定装置? - 固定装置的作用域是否合适(函数级、类级、模块级或会话级)?
- 使用
yield的固定装置是否在finally块中进行了适当的清理操作? - 是否使用了
@pytest.mark.parametrize来简化相似测试用例的编写? - 多个测试函数之间是否存在重复的测试逻辑?
- 模拟对象是否正确地记录了调用次数(使用
assert_called_once_with进行验证)? -
patch()函数是否应用于正确的位置(即实际需要修改的地方,而不是仅在定义处使用)? - 是否避免了对应该被测试的内部功能的模拟?
- 测试之间是否保持了隔离性(没有共享的可变状态)?
何时查阅相关参考文档
- 审查异步测试函数时 → 查阅
async-testing.md - 审查测试用例固定装置或
conftest.py时 → 查阅fixtures.md - 审查相似测试用例时 → 查阅
parametrize.md - 审查模拟(mocking)和
patch操作时 → 查阅mocking.md
审查问题
- 所有的异步函数是否都使用
async def test_*进行定义? - 固定装置的作用域是否合适,并且是否包含了必要的清理操作?
- 相似的测试用例是否可以通过参数化来减少代码重复?
- 模拟对象是否正确地记录了调用次数,并且被应用于正确的位置?
Source: AgentWorkers/skills — distributed by TomeVault.