切换日光/暗黑模式
049. PyTest Fixtures 与 conftest.py
学习目标
这一节开始复用测试依赖。
学完后,你应该能理解:
- fixture 是什么;
conftest.py为什么能被多个测试共享;- 后端接口测试为什么需要 HTTP client;
- 数据库断言为什么需要 session;
- 测试失败时如何根据断言定位问题;
- 为什么测试也可以验证关键初始化数据。
fixture 是什么
fixture 可以理解成“测试前准备好的对象”。
例如很多测试都需要:
- 一个 HTTP 请求客户端;
- 一个数据库 session;
- 一组默认测试数据;
- 一个已经登录的用户。
这些对象不应该在每个测试文件里重复写。
把它们做成 fixture 后,测试函数只要声明参数名,PyTest 就会自动注入。
conftest.py
tests/conftest.py 用来放共享 fixture。
它不需要每个测试文件手动 import。
只要测试运行时能找到这个文件,PyTest 就会自动加载里面定义的 fixture。
所以它很适合放项目级测试基础设施。
HTTP client fixture
后端接口测试需要一个客户端去请求自己的服务。
这个 client 通常会配置:
- 本地后端地址;
- 请求超时;
- 请求生命周期;
- 异步上下文管理。
测试函数拿到 client 后,就可以像前端调用接口一样发请求。
例如调用 /test 接口,再断言返回的 message 是否正确。
数据库 session fixture
有些测试不只看接口返回,还要直接检查数据库。
这时可以注入 db_session。
它适合用来验证:
- 某条记录是否写入;
- 某个默认用户是否存在;
- 某张基础表是否有初始化数据;
- 接口调用后数据库状态是否正确。
对业务系统来说,关键初始化数据很重要。
如果这些数据缺失,页面和接口可能都会异常。
接口测试的断言
接口测试不只是请求成功就结束。
还要判断返回内容是否符合预期。
例如:
py
response = await client.get("/test")
data = response.json()
assert data["message"] == "HelloWorld"如果后端把 message 改成了别的值,测试会失败。
失败信息会展示实际值和期望值,这能快速提醒你接口契约已经变化。
fixture 的价值
fixture 让测试关注“要验证什么”,而不是每次重复“如何准备环境”。
当项目越来越大时,这一点很重要。
例如同一个 client 可以被几十个接口测试复用。
数据库 session 也可以被多个数据验证测试复用。
AI 生成测试的边界
AI 可以帮你写测试,但它需要上下文。
如果只说“帮我写接口测试”,它可能不知道:
- 接口地址;
- 请求方式;
- 请求体格式;
- 返回结构;
- 依赖哪个 fixture;
- 本地服务端口;
- 数据库里应该有哪些基础数据。
越接近真实项目,越要把这些信息讲清楚。
这一节的重点
这一节的核心是复用测试基础设施。
你需要记住:
- fixture 是可注入的测试依赖;
conftest.py放共享 fixture;- HTTP client 用来测接口;
- DB session 用来查数据库状态;
- 测试要断言业务结果,不只是看请求有没有发出去。