Как синхронизировать параметризацию между приспособлениями pytest? - PullRequest
1 голос
/ 07 августа 2020

У меня есть два прибора A и B с одним и тем же аргументом params, переданным в pytest.fixture(). Кроме того, B принимает A в качестве аргумента:

import pytest

@pytest.fixture(params=[1, 2])
def A(request):
    if request.param == 1:
        # do stuff to get matrix_1
        return matrix_1
    if request.param == 2:
        # do stuff to get matrix_2
        return matrix_2

@pytest.fixture(params=[1, 2])
def B(request, A):
    if request.param == 1:
        # do stuff with A to get matrix_3
        return matrix_3
    if request.param == 2:
        # do stuff with A to get matrix_4
        return matrix_4

У меня также есть функция test_method, которая принимает приборы B и my_class (прибор, возвращающий MyClass() instance) в качестве аргументов и проверяет метод my_class. Метод принимает B в качестве аргумента. Я не думаю, что эта информация обязательно имеет значение для вопроса, она здесь только для контекста:

from my_module import MyClass

@pytest.fixture
def my_class():
    return MyClass()

def test_method(my_class, B):
    # do stuff to get the expected value
    actual = my_class.method(B)
    assert actual == expected

Проблема в том, что вся конструкция имеет смысл, только если A и B имеют одинаковые params в каждый момент времени, т.е. A не может иметь request.param = 1, когда B имеет request.param = 2. Эти переменные не предназначены для использования в программе иным образом, и тестируемый код ломается, если они используются.

Есть ли способ поделиться или синхронизировать параметризацию между приборами? Или как-то переделать код, чтобы не было проблем? Спасибо!

1 Ответ

1 голос
/ 07 августа 2020

Обновлено после комментариев OP :

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

@pytest.fixture(params=[1, 2])
def Base(request):
    return request.param

@pytest.fixture
def A(Base):
    if Base == 1:
        return value_1
    if Base == 2:
        return value_2


@pytest.fixture
def B(Base):
    if Base == 1:
        return value_3
    if Base == 2:
        return value_4
...