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

如何基于slow标记切换Pytest的全量/精简参数矩阵

解决Pytest参数集按标记动态切换的优雅方案

你不需要维护两套测试函数或重复fixture层级,用pytest_generate_tests钩子就能实现根据slow标记自动切换全量/精简参数矩阵,具体实现如下:

核心思路

利用pytest的测试收集钩子pytest_generate_tests,在测试用例生成阶段判断是否启用了slow标记,动态选择对应的参数集生成笛卡尔积,完全保留原测试函数和fixture结构。

完整代码示例

import itertools
import pytest

# 定义全局参数集合
class ParamSets:
    # 全量参数(slow模式使用)
    FULL = {
        "d_prob": [0.1, 0.8],
        "f_dens": [0.001, 0.1],
        "r_scale": [True, False],
        "i_corr": [True, False]
    }
    # 精简参数(默认快速模式使用)
    FAST = {
        "d_prob": [0.1],
        "f_dens": [0.001],
        "r_scale": [True],
        "i_corr": [True]
    }

def pytest_generate_tests(metafunc):
    # 仅处理需要"params"参数的测试用例
    if "params" not in metafunc.fixturenames:
        return
    
    # 判断是否处于slow模式:覆盖两种触发场景
    # 1. 命令行通过-m slow指定全局运行slow测试
    # 2. 单个测试函数被@pytest.mark.slow标记
    is_slow = False
    if metafunc.config.getoption("markexpr") == "slow":
        is_slow = True
    elif metafunc.function.get_closest_marker("slow"):
        is_slow = True
    
    # 选择对应参数集生成笛卡尔积
    target_params = ParamSets.FULL if is_slow else ParamSets.FAST
    param_combinations = itertools.product(
        target_params["d_prob"],
        target_params["f_dens"],
        target_params["r_scale"],
        target_params["i_corr"]
    )
    
    # 给测试用例参数化
    metafunc.parametrize("params", param_combinations)

# 原测试类完全保留,无需修改结构
class TestCases:
    def test_mytest(self, params):
        d, f, r, i = params
        # 这里写你的测试逻辑
        print(f"Running with params: d={d}, f={f}, r={r}, i={i}")
        assert True

使用方式

  • 快速模式(默认):直接运行,自动使用精简参数
pytest your_test_file.py
  • 全量slow模式:通过命令行标记触发,使用全量参数
pytest your_test_file.py -m slow
  • 单个测试启用slow模式:给指定测试函数加标记即可,其他测试仍用快速参数
class TestCases:
    @pytest.mark.slow
    def test_mytest_full(self, params):
        d, f, r, i = params
        # 测试逻辑...

这种方案的优势在于:

  • 不需要拆分测试函数,原测试结构完全保留
  • 无需维护重复的fixture层级,参数集中管理
  • 支持全局标记和单个测试标记两种场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 08:05:15