You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何构建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 14:07:29