Как использовать фикстуры на уровне класса только для одного класса, не указывая его в каждой сигнатуре метода тестирования

Я нашел еще одну жемчужину в идиомах Pytest.

Проблема: есть медленное приспособление для установки/разборки, которое мне нужно вызвать один раз перед большой группой тестов. В модуле есть другие тесты, которым не нужен этот фикстур. Я не хочу вводить имя прибора в каждую тестовую функцию.

Решение:

  1. Переместите все функции, требуемые фикстурой, в класс (сделайте их методами класса)
  2. Пометить прибор как scope=”class”
  3. Используйте @pytest.mark.usefixtures в классе (не в функциях!), чтобы использовать фикстуру.

Пример кода:

import pytest

@pytest.fixture(scope="class")
def bar():
    print("fxiture setup")
    yield
    print("fxiture teardown")


@pytest.mark.usefixtures('bar')
class TestFoo():
    @pytest.mark.parametrize("foo", [1,2])
    def test1(self, foo):
        assert foo

    @pytest.mark.parametrize("foo", [11,22])
    def test2(self, foo):
        assert foo


class TestBaz():
    def test3(self):
        pass

В этом коде TestFoo.test1 и TestFoo.test2 вызываются после «настройки прибора», а «разборка прибора» выполняется после последнего теста в TestFoo.

TestBaz.test3 не получает прибор foo.

Обратите внимание, что для каждого test1 и test2 не нужно указывать фикстуру bar в своей подписи.