如何构建PyTest测试套件实现指定yield测试执行流程?
解决方案
方法一:使用会话级Fixture控制执行流程
你可以把三个测试的before和after逻辑提取出来,通过会话级Fixture来控制执行顺序,确保所有前置逻辑在升级前完成,所有清理逻辑在升级后执行。
代码实现
import pytest # 提取各测试的前置/后置逻辑 def setup_logic_1(): # test_logic_1 的 before 逻辑 print("Executing test_logic_1 before logic") def teardown_logic_1(): # test_logic_1 的 after 逻辑 print("Executing test_logic_1 after logic") def setup_logic_2(): print("Executing test_logic_2 before logic") def teardown_logic_2(): print("Executing test_logic_2 after logic") def setup_logic_3(): print("Executing test_logic_3 before logic") def teardown_logic_3(): print("Executing test_logic_3 after logic") # 会话级Fixture:先执行所有前置逻辑,会话结束时执行所有后置逻辑 @pytest.fixture(scope="session") def pre_upgrade_setup(): # 按顺序执行三个测试的before逻辑 setup_logic_1() setup_logic_2() setup_logic_3() yield # 暂停,等待依赖此Fixture的测试执行完成 # 按顺序执行三个测试的after逻辑 teardown_logic_1() teardown_logic_2() teardown_logic_3() # 升级测试依赖前置Fixture,确保前置逻辑先执行 def test_upgrade(pre_upgrade_setup): # 测试机升级逻辑 print("Performing test machine upgrade")
执行说明
- 运行
pytest时,PyTest会先执行pre_upgrade_setup中的前置逻辑,再运行test_upgrade,最后执行yield后的后置逻辑。 - 若原本的
test_logic_*还有核心测试逻辑,可拆分为独立测试函数并让它们依赖pre_upgrade_setup,再通过pytest-ordering插件控制执行顺序。
方法二:使用自定义测试类封装流程
通过测试类的类级初始化/销毁方法,把前置、升级、后置逻辑封装为一个完整流程:
代码实现
import pytest class TestUpgradeWorkflow: @classmethod def setup_class(cls): # 类初始化时执行所有前置逻辑 cls._setup_logic_1() cls._setup_logic_2() cls._setup_logic_3() @classmethod def teardown_class(cls): # 类销毁时执行所有后置逻辑 cls._teardown_logic_1() cls._teardown_logic_2() cls._teardown_logic_3() @staticmethod def _setup_logic_1(): print("Executing test_logic_1 before logic") @staticmethod def _teardown_logic_1(): print("Executing test_logic_1 after logic") @staticmethod def _setup_logic_2(): print("Executing test_logic_2 before logic") @staticmethod def _teardown_logic_2(): print("Executing test_logic_2 after logic") @staticmethod def _setup_logic_3(): print("Executing test_logic_3 before logic") @staticmethod def _teardown_logic_3(): print("Executing test_logic_3 after logic") def test_upgrade(self): print("Performing test machine upgrade")
执行说明
- 测试类的
setup_class会在类内所有测试执行前运行,teardown_class会在所有测试执行后运行,天然符合你需要的流程顺序。 - 这种方式适合把整个升级相关的操作封装为独立模块,逻辑更集中清晰。
注意事项
- 若原本的
test_logic_*包含断言逻辑,需将断言拆为独立测试函数,并根据需求调整它们与test_upgrade的执行顺序。 - 会话级Fixture的
scope="session"确保逻辑只执行一次,适合跨用例的全局前置/后置操作。
内容的提问来源于stack exchange,提问作者FireSlayerTM
相关产品推荐
相关产品推荐

