Используя pytest, могу ли я получить значения приборов вне тестовой функции? - PullRequest
0 голосов
/ 22 января 2019

Я использую параметризационные тесты, чтобы протестировать 2 разных набора данных.Например, вот так.some_data() функции возвращают тестовые данные.

test_data = [
    (some_data1_v1(), some_data2_v2()),
    (some_data1_v2(), some_data2_v2())
]

@pytest.mark.parametrize('a,b', test_data)
def test_fn(a,b):
    pass

Но для некоторых тестов, которые проверяют только общее поведение, мне не нужно тестировать 2 набора данных, потому что оба набора имеют соответствующие общие данные.Я хочу преобразовать функцию some_data1_v1() в прибор и использовать ее в тесте, например:

def test_fn2(some_data1_v1):
    pass

Если я это сделаю, то вызову some_data1_v1() во время test_data исключения при создании списка Fixtures are not meant to be called directly...

Так что вместо этого

def test_fn2(some_data1_v1):
    pass

мне это нравится

@pytest.mark.parametrize('some_data1_v1', [some_data1_v1()])
def test_fn2(some_data1_v1):
    pass

Это позволяет мне иметь один источник тестовых данных - «поддельные приборы» (обычные функции, которые возвращаютdata) и передать тестовые данные в список test_data (первый пример или последний пример).Но я думаю, что мой подход к хранению данных в обычных функциях - это прерывание "абстракция фикстур".

Есть ли лучший подход, чтобы делать то, что я делаю?

1 Ответ

0 голосов
/ 22 января 2019

Вы можете использовать параметризованный прибор . request.param относится к конкретной записи в последовательности params

Например:

@pytest.fixture(params=(1, 2, 3))
def fix1(request):
    return request.param


@pytest.fixture(params=(4, 5, 6))
def fix2(request):
    return request.param


def test1(fix1, fix2):
    print(fix1, fix2)


def test2(fix1):
    print(fix1)

И исполнение:

$ pytest t.py

...

collected 12 items                                                             

t.py::test1[1-4] 1 4
PASSED
t.py::test1[1-5] 1 5
PASSED
t.py::test1[1-6] 1 6
PASSED
t.py::test1[2-4] 2 4
PASSED
t.py::test1[2-5] 2 5
PASSED
t.py::test1[2-6] 2 6
PASSED
t.py::test1[3-4] 3 4
PASSED
t.py::test1[3-5] 3 5
PASSED
t.py::test1[3-6] 3 6
PASSED
t.py::test2[1] 1
PASSED
t.py::test2[2] 2
PASSED
t.py::test2[3] 3
PASSED
...