如何使用pytest对多个Fixture进行参数化?
解决pytest多Fixture参数化问题
核心解决办法是利用pytest.mark.parametrize的indirect参数,指定需要解析为Fixture的参数名称,让pytest自动把参数中的Fixture名字符串转换成对应Fixture的实例。
针对你的场景修改后的代码
@pytest.mark.parametrize( "input_payload, expected_output", [ ("input_payload_1", {"value"}), ("input_payload_2", {"value2"}), ], indirect=["input_payload"] # 关键:告诉pytest这个参数要解析为Fixture ) def test_something(input_payload, expected_output): result = tested_functionality(input_payload) assert result == expected_output
原理说明
默认情况下,parametrize会直接把参数列表里的字符串传给测试函数,但加上indirect=["input_payload"]后,pytest会把每个参数组里的"input_payload_1"、"input_payload_2"当作Fixture名称,自动执行对应的input_payload_1()和input_payload_2()Fixture函数,把返回的Pydantic实例传给测试函数的input_payload参数,而不是传字符串本身。
扩展:同时参数化多个Fixture
如果需要同时对多个Fixture进行这类参数化,只需要把多个参数名加入indirect的列表即可。比如有两个Fixture参数的场景:
# 假设conftest.py里还有这两个Fixture @pytest.fixture def config_a(): pass @pytest.fixture def config_b(): pass # 测试函数参数化多个Fixture @pytest.mark.parametrize( "payload, config, expected", [ ("input_payload_1", "config_a", {"val1"}), ("input_payload_2", "config_b", {"val2"}), ], indirect=["payload", "config"] # 多个参数都解析为Fixture ) def test_multi_fixture(payload, config, expected): result = tested_func(payload, config) assert result == expected
内容的提问来源于stack exchange,提问作者J. Donič
相关产品推荐
相关产品推荐

