gpt4 book ai didi

python - Pytest - 将多个 fixture 参数组合到一个 fixture 中以优化 fixture 实例化

转载 作者:行者123 更新时间:2023-12-01 15:18:53 28 4
gpt4 key购买 nike

我有一个现有的 pytest使用一些预定义列表来测试它们的交叉产品的测试:

A_ITEMS = [1, 2, 3]
B_ITEMS = [4, 5, 6]
C_ITEMS = [7, 8, 9]

我还有一个昂贵的 fixture ,其内部条件取决于 A 和 B 项目(但不是 C),称为 F:
class Expensive:
def __init__(self):
# expensive set up
time.sleep(10)
def check(self, a, b, c):
return True # keep it simple, but in reality this depends on a, b and c

@pytest.fixture
def F():
return Expensive()

目前,我有一种简单的方法,可以简单地对测试函数进行参数化:
@pytest.mark.parametrize("A", A_ITEMS)
@pytest.mark.parametrize("B", B_ITEMS)
@pytest.mark.parametrize("C", C_ITEMS)
def test_each(F, A, B, C):
assert F.check(A, B, C)

这将测试 F 与 A、B 和 C 项目的所有组合,但是它构造了一个新的 Expensive实例通过 F每次测试的 fixture 。更具体地说,它重构了一个新的 Expensive通过 fixture F 用于 A、B 和 C 的每种组合。

这是非常低效的,因为我应该只需要构造一个新的 Expensive当 A 和 B 的值发生变化时,它们不会在 C 的所有测试之间发生变化。

我想做的是以某种方式结合 F带有 A_ITEMS 的 fixture 和 B_ITEMS列表,因此 F fixture 仅在每次运行 C 的值时实例化一个新实例。

我的第一种方法是将 A 和 B 列表分离到它们自己的固定装置中,并将它们与 F 固定装置结合起来:
class Expensive:
def __init__(self, A, B):
# expensive set up
self.A = A
self.B = B
time.sleep(10)
def check(self, c):
return True # keep it simple

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

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

@pytest.fixture
def F(A, B):
return Expensive(a, b)

@pytest.mark.parametrize("C", C_ITEMS)
def test_each2(F, C):
assert F.check(C)

虽然这会测试所有组合,但不幸的是,这会创建 Expensive 的新实例。对于每个测试,而不是将每个 A 和 B 项目组合成一个可以重复用于 C 的每个值的单个实例。

我研究了间接装置,但我看不到将多个列表(即 A 和 B 项)发送到单个装置的方法。

我可以用 pytest 采取更好的方法吗?基本上我想要做的是最小化次数 Expensive被实例化,因为它依赖于项目 A 和 B 的值。

注意:我试图简化这一点,但实际情况是 F 表示创建新进程,A 和 B 是该进程的命令行参数,而 C 只是通过 a 传递给进程的值 socket 。因此,我希望能够将 C 的每个值发送到此进程,而无需在每次 C 更改时重新创建它,但显然如果 A 或 B 更改,我需要重新启动它(因为它们是进程的命令行参数)。

最佳答案

在这种情况下,我已经使用范围更广的 fixture (模块或 session )作为每个测试 fixture 的“缓存”取得了一些成功,这种情况下 fixture 的“生命周期”与摊销成本或任何。

关于python - Pytest - 将多个 fixture 参数组合到一个 fixture 中以优化 fixture 实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61113801/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com