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

如何在pytest参数化中传递函数并调用,替代eval方法?

解决pytest参数化传递类实例方法(避免eval)的可行方案

方案1:结合request.getfixturevalue与getattr动态获取方法

通过参数化传递fixture名称和方法名的元组,在测试函数内动态获取fixture实例并提取对应方法执行,完全规避eval。

代码示例:

  1. conftest.py(原有fixture保持不变)
import pytest
from helper import ClassA, ClassB

@pytest.fixture
def class_a():
    return ClassA()

@pytest.fixture
def class_b():
    return ClassB()
  1. 测试文件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处理,让测试代码更简洁。

代码示例:

  1. 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)
  1. 测试文件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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 08:10:00