如何跨 pytest 装置同步参数化?
How to synchronize parametrization across pytest fixtures?
我有两个固定装置 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
(一个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
问题在于,只有当 A
和 B
在每个时间点都具有相同的参数时,整个结构才有意义,即 A
不能有 request.param = 1
,当 B
有 request.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
我有两个固定装置 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
(一个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
问题在于,只有当 A
和 B
在每个时间点都具有相同的参数时,整个结构才有意义,即 A
不能有 request.param = 1
,当 B
有 request.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