我有一个用于测试我的一些代码的类.我想参数化设置并使用不同的参数重新运行类:
class TestNormalLTEPlasma:
def setup(self, t=10000):
self.plasma = plasma.LTEPlasma.from_abundance(t, {'Si':1.0}, 1e-13, atom_data, 10*86400)
def test_beta_rad(self):
assert self.plasma.beta_rad == 1 / (10000 * constants.k_B.cgs.value)
def test_t_electron(self):
assert self.plasma.t_electron == 0.9 * self.plasma.t_rad
def test_saha_calculation_method(self):
assert self.plasma.calculate_saha == self.plasma.calculate_saha_lte
Run Code Online (Sandbox Code Playgroud)
我希望运行这个类从t = 2000到t = 20000,步长为1000
Fra*_*k T 18
而不是您的设置功能,创建一个参数化的测试夹具:
ts = range(2000, 20001, 1000) # This creates a list of numbers from 2000 to 20000 in increments of 1000.
@pytest.fixture(params=ts)
def plasma(request):
return plasma.LTEPlasma.from_abundance(request.param, {'Si':1.0}, 1e-13, atom_data, 10*86400)
Run Code Online (Sandbox Code Playgroud)
"参数化测试夹具"是指在测试用例中使用它时,pytest将为每个参数创建一个新的测试用例并分别运行.
您可以通过向每个需要它的测试函数添加一个名为"plasma"的函数参数来使用测试夹具:
class TestNormalLTEPlasma:
def test_beta_rad(self, plasma):
assert plasma.beta_rad == 1 / (10000 * constants.k_B.cgs.value)
def test_t_electron(self, plasma):
assert plasma.t_electron == 0.9 * plasma.t_rad
def test_saha_calculation_method(self, plasma):
assert plasma.calculate_saha == plasma.calculate_saha_lte
Run Code Online (Sandbox Code Playgroud)
pytest负责收集夹具,收集测试功能,确定哪些测试功能需要哪些夹具,以及将夹具值传递给测试功能以便执行.
查看文档以获取更多详细信息:http://pytest.org/latest/fixture.html#fixture-parametrize
您还可以应用parametrize您的类,因此相同的数据将发送到类中的所有测试方法。
首先,创建一个plasmas包含要传递给每个测试的等离子元素的列表。其次,使用装饰器@pytest.mark.parametrize,并传递plasmas给它。
plasmas = [plasma.LTEPlasma.from_abundance(t, {'Si':1.0}, 1e-13, atom_data, 10*86400) for t in range(2000, 20001, 1000)]
@pytest.mark.parametrize('plasma', plasmas)
class TestNormalLTEPlasma:
def test_beta_rad(self, plasma):
assert plasma.beta_rad == 1 / (10000 * constants.k_B.cgs.value)
def test_t_electron(self, plasma):
assert plasma.t_electron == 0.9 * plasma.t_rad
def test_saha_calculation_method(self, plasma):
assert plasma.calculate_saha == plasma.calculate_saha_lte
Run Code Online (Sandbox Code Playgroud)