You need to enable JavaScript to run this app. 使用pytest_generate_tests时如何为pytest.param设置动态marks参数
优惠活动
大模型
产品
解决方案
定价
更多

使用pytest_generate_tests时如何为pytest.param设置动态marks参数

解决方案

你当前的问题是构造了字符串格式的标记路径,而非pytest要求的_pytest.mark.structures.MarkDecorator类型的标记实例,通过getattr动态获取pytest.mark下对应名称的属性即可解决。

修正后核心代码

def pytest_generate_tests(metafunc):
    ######################################################################
    # cm变量从yaml文件中读取定义,值为标记名称的字符串
    ######################################################################
    cm = "custom_marker"
    # 动态获取标记对象,而非构造字符串
    marker = getattr(pytest.mark, cm)
    final_param = pytest.param((1,2), marks=marker)

常用扩展场景

  • 多个标记的情况:如果yaml中配置了多个标记,直接构造标记对象列表传入即可
    # 假设从yaml读取到标记列表
    cm_list = ["custom_marker1", "custom_marker2", "slow"]
    markers = [getattr(pytest.mark, cm) for cm in cm_list]
    final_param = pytest.param((1,2), marks=markers)
    
  • 带参数的标记:如果标记需要传参(比如skipif这类带参数的标记),可以在YAML中存储标记的参数配置,按如下方式处理
    # 假设从yaml读取到的带参标记配置
    marker_conf = {
        "name": "skipif",
        "args": [__import__("sys").version_info < (3,8)],
        "kwargs": {"reason": "Python版本低于3.8不支持该用例"}
    }
    marker = getattr(pytest.mark, marker_conf["name"])(*marker_conf["args"], **marker_conf["kwargs"])
    

注意事项

记得提前在pytest.ini/pyproject.toml中注册所有自定义标记,避免pytest运行时抛出未知标记的警告,示例pytest.ini配置如下:

[pytest]
markers =
    custom_marker1: 第一种自定义标记的说明
    custom_marker2: 第二种自定义标记的说明
    slow: 标记运行耗时较长的用例

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 10:00:07