如何在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
相关产品推荐
相关产品推荐

