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

能否针对Fixture的不同提供者复制Pytest测试用例?

实现方案

你的需求可以通过调整fixture命名+收集阶段修改测试项来实现,pytest没有直接提供test_from这类API,但可以用官方支持的钩子完成。以下是具体步骤:

1. 调整插件fixture,避免命名冲突

先把各平台的fixture改为带平台前缀的名称,防止同名覆盖:

# plugins/riscv.py
import pytest

# 添加命令行选项控制RISCV启用
def pytest_addoption(parser):
    parser.addoption("--riscv", action="store_true", default=False, help="启用RISCV平台测试")

@pytest.fixture
def riscv_execution_log(request, riscv_dependency):
    return riscv_dependency.fetch_log()
# plugins/x86_64.py
import pytest

@pytest.fixture
def x86_execution_log(request, host):
    return host.fetch_log()

2. 实现收集阶段的测试副本生成

在项目根目录的conftest.py中添加pytest_collection_modifyitems钩子,批量复制测试并替换fixture依赖:

# conftest.py
import pytest

def pytest_collection_modifyitems(config, items):
    # 配置启用的平台与对应fixture的映射
    enabled_platforms = []
    # 根据命令行参数判断是否启用RISCV
    if config.getoption("--riscv"):
        enabled_platforms.append(("riscv", "riscv_execution_log"))
    # 默认启用x86_64,若需控制可添加类似--x86的命令行选项
    enabled_platforms.append(("x86_64", "x86_execution_log"))

    modified_items = []
    for item in items:
        # 只处理依赖execution_log的测试用例
        if "execution_log" not in item.fixturenames:
            modified_items.append(item)
            continue

        # 为每个启用的平台生成测试副本
        for platform_name, fixture_name in enabled_platforms:
            # 复制原测试项
            test_copy = item.copy()
            # 替换fixture依赖:将execution_log替换为对应平台的fixture
            test_copy.fixturenames = [
                f if f != "execution_log" else fixture_name 
                for f in test_copy.fixturenames
            ]
            # 修改测试ID,添加平台标识,方便区分结果
            test_copy._nodeid = f"{test_copy.nodeid}[{platform_name}]"
            # 添加平台标记,支持后续用-m参数筛选测试
            test_copy.add_marker(pytest.mark.platform(platform_name))
            modified_items.append(test_copy)

    # 用修改后的测试列表替换原列表
    items[:] = modified_items

3. 运行效果

  • 执行pytest:仅生成x86_64平台的测试副本,使用x86_execution_log fixture
  • 执行pytest --riscv:同时生成x86_64和RISCV两个平台的测试副本,分别使用对应fixture

为什么你的原设想不可行

pytest没有pytest.test_from方法,也不存在pytest_collection_hook这个官方钩子。直接修改测试的fixture依赖需要通过复制测试项并调整fixturenames属性来实现,这是官方支持的合法操作。

内容的提问来源于stack exchange,提问作者Wanderer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 19:25:22