如何跨 pytest 装置同步参数化?

How to synchronize parametrization across pytest fixtures?

我有两个固定装置 AB,它们具有相同的 params 参数传递给 pytest.fixture()。此外,BA 作为参数:

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,它以固定装置Bmy_class(一个returns一个MyClass()实例的固定装置)作为参数,测试 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

问题在于,只有当 AB 在每个时间点都具有相同的参数时,整个结构才有意义,即 A 不能有 request.param = 1 ,当 Brequest.param = 2。这些变量不打算在程序中以其他方式使用,如果它们被测试代码会中断。

有没有办法在灯具之间共享或同步参数化?或者以某种方式重新设计代码,这样就不是问题了?谢谢!

根据 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