pytest是否依据依赖链确定module级fixture的yield时机?
问题解答
首先明确结论:pytest默认不会自动识别测试模块之间的依赖关系,如果你的integration_test_cleanup是module作用域,三个测试模块会各自实例化一个该fixture的副本,每个模块的测试执行完毕后,就会立即执行自己那个fixture的yield后清理逻辑——也就是说testmodule_one跑完就会触发清理,这会导致依赖它的testmodule_two和testmodule_three因为资源已被清理而报错。
你不需要把fixture拆分成session和module级的多个实例,直接修改fixture的作用域就能解决问题:
把scope="module"改成scope="session":
@pytest.fixture(scope="session") def integration_test_cleanup(): yield # 执行清理操作
session作用域的fixture整个测试会话只会创建一次,所有测试模块(包括依赖testmodule_one的两个模块)全部执行完成后,才会触发yield后的清理逻辑。
额外提醒:如果需要确保testmodule_two和testmodule_three一定在testmodule_one之后运行,可以借助pytest-dependency插件给测试用例标记依赖关系,避免执行顺序混乱导致的问题,但这一步不影响fixture清理时机的控制——session级fixture的清理始终会等所有测试跑完才执行。
内容的提问来源于stack exchange,提问作者red888
相关产品推荐
相关产品推荐

