Python面试题更新 2026-08-03

在软件测试过程中,pytest 框架里的 yield 关键字承担着什么样的功能角色?

考察说明

考查对 pytest 中 yield 用于 fixture 清理机制的理解。

回答思路

  1. 【回答框架 1】pytest 中的 yield 主要用在 fixture 函数内部,它把 fixture 的执行分成 setup 和 teardown 两个阶段。在 yield 之前的代码会在测试用例执行前运行,相当于 setup;yield 之后的代码会在测试用例执行后运行,相当于 teardown,用于清理资源。
  2. 【回答框架 2】yield 本身可以返回一个值给测试用例作为 fixture 的返回值,例如返回一个数据库连接或临时文件对象,测试用例可以直接使用。同时,无论测试用例是否执行成功,yield 之后的清理代码都会被执行,保证了资源释放的可靠性。
  3. 【回答框架 3】与 request.addfinalizer 相比,yield 语法更简洁直观,更符合自然读写顺序,因此是 pytest 中推荐使用的 fixture 编写方式。需要注意,如果 fixture 是 session 或 module 级别的,yield 之后的代码会在整个会话或模块测试结束后执行,此时要避免在清理代码中引用已销毁的上下文。
  4. 【回答框架 4】使用 yield 时,如果 fixture 需要支持参数化或依赖其他 fixture,yield 依然适用,只要保证 yield 只出现一次且其前后的代码符合执行顺序即可。
  5. 【回答框架 5】实际项目中,常用 yield fixture 来管理测试数据库连接、创建临时目录、启动和关闭外部服务等,显著提高测试的隔离性和稳定性。
  6. 【关键点 1】yield 将 fixture 划分为 setup 和 teardown 两部分,yield 前是 setup,后是 teardown。
  7. 【关键点 2】yield 可以给测试用例返回数据,且清理代码在用例执行后必定运行。
  8. 【关键点 3】yield 是 pytest 推荐的自定义 fixture 方式,比 addfinalizer 更简洁。
  9. 【易错点 1】yield 只能出现在 fixture 函数中作为生成器使用,如果误放在普通测试函数中不会生效。
  10. 【易错点 2】对于函数级 fixture,每次测试函数调用都会执行一次 yield 前后的所有代码,性能敏感时需注意开销。
  11. 【易错点 3】在高并发或异步测试中,yield 的清理顺序可能受作用域影响,需明确 scope 级别,避免资源冲突。