如何在pytest中从测试用例向fixture传递参数或值?
解决pytest fixture获取测试用例中变量的问题
你无法直接获取测试用例函数内的局部变量json_name,因为fixture在测试用例执行前运行,此时测试函数的局部变量还未定义。可以通过以下几种方案实现需求:
方案一:使用pytest标记传递元数据
给测试用例添加自定义标记,在fixture中通过request.node获取标记内容:
import pytest @pytest.fixture(autouse=True) def pretest(request): tc_name = request.node.name # 获取自定义标记的json_name值 json_mark = request.node.get_closest_marker("json_name") if json_mark: json_name = json_mark.args[0] print(f"测试用例{tc_name}的json_name: {json_name}") yield @pytest.mark.json_name("file1.json") def test_case_EVA_01(): # 测试逻辑 pass @pytest.mark.json_name("file2.json") def test_case_EVA_02(): # 测试逻辑 pass
方案二:给测试函数设置属性
直接为测试函数添加属性,fixture中通过request.node.function读取该属性:
import pytest @pytest.fixture(autouse=True) def pretest(request): tc_name = request.node.name # 检查测试函数是否有json_name属性 if hasattr(request.node.function, "json_name"): json_name = request.node.function.json_name print(f"测试用例{tc_name}的json_name: {json_name}") yield def test_case_EVA_01(): pass # 给测试函数添加属性 test_case_EVA_01.json_name = "file1.json" def test_case_EVA_02(): pass test_case_EVA_02.json_name = "file2.json"
方案三:使用参数化传递值
通过@pytest.mark.parametrize传递json_name,既可以在fixture中获取,也能在测试用例中直接使用:
import pytest @pytest.fixture(autouse=True) def pretest(request): tc_name = request.node.name # 获取参数化的json_name值 if hasattr(request, "param"): json_name = request.param print(f"测试用例{tc_name}的json_name: {json_name}") yield @pytest.mark.parametrize("json_name", ["file1.json"]) def test_case_EVA_01(json_name): # 测试逻辑中可直接使用json_name print(f"测试用例内使用json_name: {json_name}") @pytest.mark.parametrize("json_name", ["file2.json"]) def test_case_EVA_02(json_name): print(f"测试用例内使用json_name: {json_name}")
方案对比
- 标记方案:代码整洁直观,适合批量管理测试用例元数据,是最常用的方式。
- 函数属性方案:无需依赖标记,写法简单但不够直观,适合少量测试用例的场景。
- 参数化方案:兼顾fixture和测试用例的使用需求,适合需要在测试逻辑中也用到
json_name的场景。
内容的提问来源于stack exchange,提问作者Sunil Kumar
相关产品推荐
相关产品推荐

