python - pytest-将 fixture 传递给mark.parametrize

标签 python pytest fixtures

目的是对一组对象进行参数化,并且对于每个对象,对所有测试进一步进行参数化(从1到N)。我的对象可能非常大,这就是为什么我不想一次性加载所有对象的原因。测试的数量应等于所有对象的tests中的键的数量,而不是对象的数量。

目前,我正在尝试通过将固定装置传递到mark.parametrize来生成要运行的测试列表来实现此目的。但这在pytest.mark.parametrize中不起作用,它将some_fixture视为一个函数,并且出现以下错误:

AttributeError: 'function' object has no attribute 'list_of_tuples'

样例代码:

dict = {
    'obj1': {
        'tests': {'a1': 'b1', 'a2':'b2'}
    },
    'obj2': {
        'tests': {'a3':'b3', 'a4':'b4', 'a5':'b5'}
    }
}

class RandomClass():
    def __init__(self, name, dict):
        self._obj_name = name
        self._dict = dict

        self.list_of_tuples = None

    def create_list_of_tuples(self):
        self.list_of_tuples = []
        for item in self._dict[self._obj_name]['tests']:
            self.list_of_tuples.append((item, self._dict[self._obj_name]['tests'][item]))


@pytest.fixture(params=list(dict.keys())
def some_fixture(request, dict):
    obj = RandomClass(name = request.param, dict=dict)
    obj.create_list_of_tuples()
    return obj

@pytest.mark.parametrize("var1, var2", some_fixture.list_of_tuples, indirect=True)
def test_something(var1, var2):

   assert var1 == var2


非常感谢。

最佳答案

pytest不支持夹具作为参数化的一部分,夹具是在收集所有测试后制成的

关于python - pytest-将 fixture 传递给mark.parametrize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53612184/

相关文章:

python - 使用 pytest.fixture 返回模拟对象的正确方法

python - pytest 标记命令不起作用

ruby-on-rails - Rails 日期时间和装置

django - 如何在 django init_data 上创建默认用户?

python - 如果输入不区分大小写,则更改 Python

python - 如何使用 : python warnings. warn()?

python - pytest 看不到正在测试的函数的日志

mysql - 交响乐 : Loading fixtures of objects with multiple column primary key which are also foreign keys

python - 计算 DNA 序列中的三联体

python - 选择插补方法