20

I have a class for testing some of my code. I would like to parametrize the setup and rerun the class with different parameters:

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

I would like to run this class going from t=2000 to t=20000 in steps of 1000.

4

2 回答 2

24

代替您的设置功能,创建一个参数化的测试夹具:

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)

“参数化测试夹具”是一种,当您在测试用例中使用它时,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

pytest 负责收集夹具、收集测试函数、确定哪些测试函数需要哪些夹具,并将夹具值传递给测试函数以执行。

查看文档以获取更多详细信息:https ://docs.pytest.org/en/latest/fixture.html#fixture-parametrize

于 2014-03-15T00:08:09.327 回答
7

你也可以应用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
于 2019-05-10T05:59:06.847 回答