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

如何在pytest测试函数内访问parametrize设置的自定义测试标记

pytest参数化用例内部读取标记的实现方法

核心依赖pytest内置的request fixture实现,不需要修改conftest.py,直接在测试函数内即可完成读取。

实现步骤

  • 第一步:在测试函数的入参中添加request,这是pytest自带的内置fixture,无需额外定义或导入。
  • 第二步:通过request.node.own_markers获取当前参数化用例绑定的专属标记列表,提取标记的name属性即可得到标记名。

完整可运行代码

pytest.ini配置保持原有逻辑即可:

[pytest]
markers =
    MarkFoo
    MarkBar

修改后的test.py代码:

import pytest

from typing import Any
from dataclasses import dataclass

@dataclass(frozen=True)
class FooTest:
    name: str                           # Unique test name
    param: int                          # A parameter
    marks: Any = ()                     # Marks for this test


test_list = [
    # 单标记建议包装为元组,避免pytest解析异常
    FooTest(name='Foo', param=1, marks=(pytest.mark.MarkFoo,)),
    FooTest(name='Bar', param=2, marks=(pytest.mark.MarkBar,)),
]

@pytest.mark.parametrize("name, param",
    [ pytest.param(t.name, t.param, marks=t.marks) for t in test_list ]
)
def test_run_foo_bar(name, param, record_property, request):
    # 提取当前用例的所有标记名
    current_marks = [mark.name for mark in request.node.own_markers]
    # 将标记写入测试报告属性
    record_property("marks", current_marks)
    # 调试输出验证
    print(name, param, current_marks)

补充说明

  • request.node对应当前执行的单个参数化测试节点,每个参数化生成的用例都是独立节点,读取到的标记不会和其他参数用例混淆。
  • 如果你需要同时获取测试函数层面挂载的标记(即直接写在test_run_foo_bar函数定义上方的标记),将request.node.own_markers替换为request.node.iter_markers()即可。
  • 如果标记本身携带参数,比如pytest.mark.MarkFoo(priority=1),可以通过mark.kwargs取到传入的键值参数,通过mark.args取到位置参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 10:51:21