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

如何在pytest中对自定义transformer做参数化测试,解决函数不可迭代报错

报错原因

  • pytest.mark.parametrize的第二个入参要求直接传入可迭代对象,你直接传入list_transformers这个fixture函数本身,函数对象不是可迭代的序列,所以触发TypeError: 'function' object is not iterable
  • 代码逻辑不匹配:fixture里返回的是已经实例化完成的Transformer对象,但测试函数里却把传入的transformer当成(类, 初始化参数)的元组来拆解,逻辑完全对应不上
  • 存在拼写错误:fixture里定义的变量是list_transformers,return的时候写成了list_trasformers(少了字母n)

正确实现方案

方案1:直接参数化(最简便,无需fixture)

直接把所有要测试的Transformer类和对应参数整理成可迭代列表,传入parametrize即可,后续新增Transformer只需要往列表里加配置:

import pytest

# 所有待测试的Transformer配置:(类, 初始化参数字典)
TRANSFORMER_CASES = [
    (TransformerOne, {"column": "a"}),
    (TransformerTwo, {"column": "a"}),
]

@pytest.mark.parametrize("tf_type, params", TRANSFORMER_CASES)
def test_print_transformer(tf_type, params):
    tf = tf_type(**params)
    print(tf)
    # 可扩展其他通用断言逻辑
    assert isinstance(tf, tf_type)

如果你的测试逻辑不需要动态生成实例,也可以直接把实例放到参数化列表里:

@pytest.mark.parametrize("transformer", [
    TransformerOne(column='a'),
    TransformerTwo(column='a'),
])
def test_print_transformer(transformer):
    print(transformer)

方案2:fixture复用Transformer配置

如果需要在多个测试用例里复用Transformer配置,可以用fixture配合indirect参数实现:

import pytest

@pytest.fixture
def transformer(request):
    tf_type, params = request.param
    return tf_type(**params)

@pytest.mark.parametrize("transformer", [
    (TransformerOne, {"column": "a"}),
    (TransformerTwo, {"column": "a"}),
], indirect=True)
def test_print_transformer(transformer):
    print(transformer)

提示:如果测试代码写在测试类中,给测试函数加上self参数即可。

内容的提问来源于stack exchange,提问作者LAS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 06:45:03