Как пометить .parametrize () прибор Pytest - PullRequest
0 голосов
/ 06 января 2020

Этот вопрос похож на Как параметризовать прибор Pytest , но я бы хотел go сделать шаг вперед. Вот что у меня есть:

import pytest

class TimeLine:
    def __init__(self, s, instances=[0, 0, 0]):
        self.s = s
        self.instances = instances

@pytest.fixture(params=[
    ('foo', [0, 2, 4, 0, 6]),
    ('bar', [2, 5]),
    ('hello', [6, 8, 10])
])
def timeline(request):
    return TimeLine(request.param[0], request.param[1])

Это работает

def test_timeline(timeline):
    for instance in timeline.instances:
        assert instance % 2 == 0

Я хотел бы создать параметризованный тест для длины instances.

@pytest.mark.parametrize('length', [
     (5), (1), (3)
])
def test_timeline(length, timeline):
   assert len(timeline.instances) == length

Должно быть 3 теста. Первый и последний тесты должны пройти. Второй тест должен провалиться. Как бы я настроил тест для этого?

1 Ответ

1 голос
/ 07 января 2020

Замечу, что @ pytest.mark.parameterize делает то же самое, что и настраиваемый прибор, который вы установили: запускает тест один раз для каждого параметра. Поэтому я никогда не использую его, потому что отступ выходит из-под контроля с какой-либо вложенной структурой. Я использую этот шаблон:

well_named_params = [1,2,3]  # I move this outside to avoid information overload.

@pytest.fixture(
    params=well_named_params,
    ids=["one","two","three"] # test label
)
def some_param(request):
    """ Run the test once for each item in params.
    Ids just provide a label for pytest. """
    return request.param

Ваш код в порядке, но вам нужно запятую после чисел для обозначения кортежа. Должно быть (5,), (1,), (3,). Я не уверен на 100%, что каждая запись должна быть повторяемой, поэтому, если это не сработает, попробуйте просто удалить скобки.

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