Pytest - передать крепление в mark.parametrize - PullRequest
0 голосов
/ 04 декабря 2018

Задача состоит в параметризации набора объектов, а для каждого объекта дальнейшая параметризация для всех тестов (от 1 до N).Мои объекты могут быть очень большими, поэтому я не хочу загружать все объекты за один раз.Количество тестов должно быть равно количеству ключей в tests для всех объектов, а не количеству объектов.

В настоящее время я пытаюсь сделать это, передавая фикстуру в метку.параметризовать, чтобы создать список тестов для запуска.Но это не работает, поскольку в 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

Большое спасибо.

1 Ответ

0 голосов
/ 04 декабря 2018

pytest не поддерживает приборы как часть параметризации, приборы создаются после того, как все тесты собраны

...