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

如何在跳过Pytest测试类时避免执行其参数化逻辑?

解决方案

核心问题原因

get_nums()会在pytest加载测试模块阶段就执行,而非测试运行阶段,所以哪怕你只跑TestQuick,也得等它执行完才能开始测试。

方案1:用pytest_generate_tests动态生成参数

这个方法能让参数生成逻辑仅在需要运行TestSlow相关测试时才执行,同时保留原有的测试分组结构,还能正常使用多进程加速nums生成。

修改后的代码:

import pytest
from multiprocessing import Pool

class TestQuick:
    def test_quick(self):
        pass

class TestSlow:
    def test_1(self, num):
        pass
    def test_2(self, num):
        pass

def get_nums():
    inputs = range(100)
    with Pool(10) as pool:
        return list(pool.map(IO_fn, inputs))  # IO_fn是你的慢IO函数

def pytest_generate_tests(metafunc):
    # 只针对TestSlow类中的测试函数,且参数名为num的情况生成参数
    if metafunc.cls is TestSlow and "num" in metafunc.fixturenames:
        nums = get_nums()
        metafunc.parametrize("num", nums)

效果说明

  • 当你运行pytest test.py -k "Quick"时,pytest_generate_tests里的get_nums()不会执行,直接跑快速测试,无需等待慢IO操作。
  • 测试输出会保持TestSlow/test_1[0]、TestSlow/test_2[0]这种分组结构,和原参数化的输出一致。
  • get_nums()里的多进程逻辑可以正常使用,不影响效率。

为什么之前的尝试没生效?

  • indirect=True是用来把参数值当作fixture名称解析,但你还是直接传了get_nums(),模块加载时依然会执行它。
  • 把IO_fn改成class级fixture,虽然延迟了执行,但fixture的参数化方式无法生成带参数标识的测试分组,且fixture本身不适合做批量多进程的参数生成。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 09:22:23