gpt4 book ai didi

python - 是否可以为类实例范围创建 pytest 固定装置?

转载 作者:太空宇宙 更新时间:2023-11-03 19:58:24 26 4
gpt4 key购买 nike

假设我有多组参数:

[
('a', 'b'),
('c', 'd'),
('e', 'f')
]

这组参数不是静态的。它是从另一个函数获取的。

因此,就我而言,使用这组参数对类进行参数化非常方便:

@pytest.mark.parametrize('a, b', [
('a', 'b'),
('c', 'd'),
('e', 'f')
])
class TestClass:
def test_a(self, a, b):
print(a)
def test_b(self, a, b):
print(b)

但我也有需要根据这些值 ab 计算第三个值 c 的情况。值 c 的计算是相当耗时的任务,因此我想将其移动到固定装置(类似这样):

@pytest.mark.parametrize('a, b', [
('a', 'b'),
('c', 'd'),
('e', 'f')
])
class TestClass:
@pytest.fixture
def calculate_c(a, b):
return a + b

def test_a(self, a, b, calculate_c):
print(a)

def test_b(self, a, b, calculate_c):
print(b)

很明显,对于每组参数,函数 calculate_c 的结果都会不同。

我知道pytest中有一个scope="class",但是根据我的实验,这不是我需要的。

谁能帮我解决这个问题吗?

谢谢!

最佳答案

这似乎有效。当然,如果 c 的大小很大,并且参数的数量很多,您可能会开始付出显着的内存成本来存储所有这些参数。不幸的是,您无法一次只存储一个,因为 pytest 在继续运行 test_b 之前会使用每个参数对运行 test_a。

导入pytest

@pytest.mark.parametrize('a, b', [
('a', 'b'),
('c', 'd'),
('e', 'f')
])
class TestClass:

@classmethod
def calculate_c(self, a, b):
try:
if self.c_map[(a,b)]:
print("didn't calculate")
return self.c_map[(a,b)]
except AttributeError:
self.c_map = {}
except KeyError:
pass

self.c_map[(a, b)] = a+b # do whatever expensive computation here
return self.c_map[(a,b)]


def test_a(self, a, b):
c = self.calculate_c(a, b)
print(a, c)

def test_b(self, a, b):
c = self.calculate_c(a, b)
print(b, c)

产生:

a ab
.c cd
.e ef
.didn't calculate
b ab
.didn't calculate
d cd
.didn't calculate
f ef
.

关于python - 是否可以为类实例范围创建 pytest 固定装置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59413008/

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