Skip to content

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 用来查数据库状态;
  • 测试要断言业务结果,不只是看请求有没有发出去。

AI Agent 课程学习文档。