如何在pytest参数化中传递函数并调用,替代eval方法?
解决pytest参数化传递类实例方法(避免eval)的可行方案
方案1:结合request.getfixturevalue与getattr动态获取方法
通过参数化传递fixture名称和方法名的元组,在测试函数内动态获取fixture实例并提取对应方法执行,完全规避eval。
代码示例:
conftest.py(原有fixture保持不变)
import pytest from helper import ClassA, ClassB @pytest.fixture def class_a(): return ClassA() @pytest.fixture def class_b(): return ClassB()
- 测试文件
test_demo.py
import pytest @pytest.mark.parametrize("fixture_id, method_name", [ ("class_a", "function1"), ("class_b", "function2"), ]) def test_method_execution(request, fixture_id, method_name): # 动态获取fixture实例 target_instance = request.getfixturevalue(fixture_id) # 提取目标方法并调用 target_method = getattr(target_instance, method_name) result = target_method() # 此处添加断言逻辑 assert result == expected_result
方案2:使用间接参数化封装方法获取逻辑
定义一个专用fixture,负责根据参数匹配实例与方法,参数化时通过indirect=True委托该fixture处理,让测试代码更简洁。
代码示例:
conftest.py新增fixture
@pytest.fixture def bound_method(request): fixture_name, method_name = request.param instance = request.getfixturevalue(fixture_name) return getattr(instance, method_name)
- 测试文件
test_demo.py
import pytest @pytest.mark.parametrize("bound_method", [ ("class_a", "function1"), ("class_b", "function2"), ], indirect=True) def test_indirect_method_call(bound_method): result = bound_method() assert result == expected_result
方案3:预绑定实例与方法(适合无fixture依赖场景)
如果类实例不需要依赖其他fixture,可以直接在参数化前封装好绑定了实例的方法,参数化时直接传递方法对象。
代码示例:
import pytest from helper import ClassA, ClassB # 预封装绑定好实例的方法 def class_a_func1(): return ClassA().function1 def class_b_func2(): return ClassB().function2 @pytest.mark.parametrize("test_method", [ class_a_func1(), class_b_func2(), ]) def test_direct_method(test_method): result = test_method() assert result == expected_result
内容的提问来源于stack exchange,提问作者suryadevi
相关产品推荐
相关产品推荐

