如何在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
相关产品推荐
相关产品推荐

