параметризация тестовых классов в pytest

У меня есть класс для тестирования некоторых из моего кода. Я хотел бы параметризовать установку и повторно запустить класс с другими параметрами:

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

Я хотел бы запустить этот класс с t = 2000 до t = 20000 с шагом 1000.

Ответ 1

Вместо вашей функции настройки создайте параметризованное тестовое устройство:

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)

A "параметризированное тестовое устройство" - это такое, где при использовании в тестовом случае pytest создаст новый тестовый пример для каждого параметра и будет запускаться каждый отдельно.

Вы используете тестовое крепление, добавив аргумент функции, называемый "плазма", к каждой из тех функций, которые ему нужны:

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 позаботится о сборе светильников, сборе тестовых функций, выяснении, какие функции тестирования нужны, какие светильники и передача значений прибора в тестовые функции для выполнения.

Ознакомьтесь с документами для получения дополнительной информации: http://pytest.org/latest/fixture.html#fixture-parametrize

Ответ 2

Вы также можете применить parametrize вашего класса, чтобы одни и те же данные были отправлены всем методам тестирования в классе.

Сначала создайте список plasmas который содержит элементы плазмы, которые вы хотите передать каждому тесту. Во-вторых, используйте decorator @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