Pytest - Как параметризовать с различными тестовыми данными с различными параметрами отправить в прибор? - PullRequest
0 голосов
/ 07 октября 2019

Я работал над pyTest. Так что в данном случае один и тот же pyTest имеет несколько тестовых данных, однако разные тестовые данные имеют разные настройки в приборе. Я просматриваю документацию по pyTest и выясняю, как выполнять оба этих действия независимо, используя функцию parametrized, как показано ниже:

Для тестовых данных, управляемых данными: @pytest.mark.parametrize('valid_data', test_data, ids=test_data_ids) В этом случае test_data - это файл json, который имеетоколо 6 различных тестовых данных и test_data_ids - список идентификаторов тестовых данных.

Затем для передачи параметров в прибор: @pytest.mark.parametrize('setup_person', [['student']], indirect=True). В этом случае setup_person - это имя моего прибора, student - один из параметров, принятых этим прибором.

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

@pytest.fixture(params=['student', 'teacher', 'outsider'])
def setup_person(request):
    if request.param is 'student':
        setup = 'This is student.'
    elif request.param is 'teacher':
        setup = 'This is teacher.'
    elif request.param is 'outsider':
        setup = 'This is outsider'
    else:
        setup = 'Incorrect parameter passed'
    return setup

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

Вот так выглядит мой тест:

@pytest.mark.parametrize('setup_person', [['student']], indirect=True)
@pytest.mark.parametrize('valid_data', test_data, ids=test_data_ids)
def test_person(setup_person, valid_data):
    response = setup_person
    assert response == 'This is student.'

Однако, когда я попытался объединить обе параметризованные функции, кажется, что параметр student будет передан только один раз, когда первая параметризациявыполняется, тогда второй параметр с тестовыми данными не пройдет student, и прибор также не будет сохранен.

Таким образом, когда я запускаю тест, всегда происходит переход к части else, потому что ничего не пропускается, когда я запускаю параметризованную функцию тестовых данных.

Есть ли другой способ, которымЯ могу объединить обе функции вместе или есть другой обходной путь для этого? Спасибо за чтение, и я ценю любую помощь!

Ответы [ 2 ]

1 голос
/ 07 октября 2019

Я думаю, вы просто допустили ошибку в первом @pytest.mark.parametrize декораторе, используя список в списке. Простой список, подобный следующему:

@pytest.mark.parametrize('setup_person', ['student'], indirect=True)
@pytest.mark.parametrize('valid_data', test_data, ids=test_data_ids)

... должен создавать каждую возможную комбинацию значений из первого parametrize декоратора (в этом случае student всегда будет передаваться в функцию прибора) и извторой parametrize декоратор, который означает, что test_data содержит.

0 голосов
/ 07 октября 2019

Я обычно использую этот класс:

class parameterized:
    '''
    Use this decorator on test methods like this:
    @parameterized(actual=[5,6],expected=[5,6])
    def test3(self, actual, expected):
        self.shouldEqual(actual,expected)

    The example uses parameters actual and expected, but they can be anything you like, as long
    as the parameters match in number and name.
    This decorator uses unittest.TestCase.subTest to separately markup every failing test.
    '''
    def __init__(self, **kwargs):
        self.kwargs = kwargs

    def __call__(self, fn):
        def test_wrapped(itself):
            size = len(self.kwargs[list(self.kwargs.keys())[0]])
            for index in range(size):
                test_method_parameters = {k: self.kwargs[k][index] for k in self.kwargs}
                with itself.subTest(**test_method_parameters):
                    fn(itself, **test_method_parameters)

        return test_wrapped

Я использую его вместе с unittest, поэтому я не уверен, что он будет работать с pytest из-за использования subTest.

Источник: https://bitbucket.org/teamqu/qutest/src/default/Test.py

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