Вызов переменных уровня класса с использованием фикстуры "@ pytest.mark.parametrize" - PullRequest
1 голос
/ 05 апреля 2020

Я пытаюсь выполнить итеративный тест по списку значений, которые я генерирую внутри другого метода в классе теста.

Проблема в том, что я получаю: "@ pytest .mark.parametrize ("number", TestScratch.list_testing) NameError: имя 'TestScratch' не определено " ошибка при попытке запустить. Я знаю факт, что когда я передаю список как жесткий закодированный список т.е. [0,3,54,90] это работает. Ниже приведен мой код:

class TestScratch(object):

    @classmethod
    def setup_class(cls):
        cls.list_testing = []

    @classmethod
    def setup_method(cls):
        pass


    def test_populate_list(self):
        for i in range(100):
            self.list_testing.append(i)

    @pytest.mark.parametrize("number",TestScratch.list_testing)
    def test_pytest_param(self, number):
        assert type(number) == int

    @classmethod
    def teardown_class(cls):
        '''
        pass
        '''

Я также пытался самостоятельно. class .list_testing, но я получаю ту же ошибку

Подробности среды:

Python: 3,6,8

Pytest: 5.2,1

1 Ответ

1 голос
/ 05 апреля 2020

Вы не можете использовать класс в определении класса. Поскольку декоратор читается во время импорта, например, при загрузке определения класса, а не во время выполнения, класс на данный момент неизвестен. Вместо этого вы должны определить список вне класса:

import pytest

def populate_list():
    test_list = []
    for i in range(100):
        test_list.append(i)
    return test_list


list_testing = populate_list()


class TestScratch:
    def test_populate_list(self):
        # this will fail if list_testing could not be populated
        assert len(list_testing) > 50

    @pytest.mark.parametrize("number", list_testing)
    def test_pytest_param(self, number):
        # this will be skipped if list_testing could not be populated
        assert type(number) == int

Любой параметр, который вы используете в декораторе, читается только один раз во время загрузки, поэтому попытка инициализировать его во время выполнения не будет работать. Например, здесь вы можете найти объяснение, как работает параметризация и почему невозможно добавить параметры во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...