Как использовать фикстуры на уровне класса только для одного класса, не указывая его в каждой сигнатуре метода тестирования
Я нашел еще одну жемчужину в идиомах Pytest.
Проблема: есть медленное приспособление для установки/разборки, которое мне нужно вызвать один раз перед большой группой тестов. В модуле есть другие тесты, которым не нужен этот фикстур. Я не хочу вводить имя прибора в каждую тестовую функцию.
Решение:
- Переместите все функции, требуемые фикстурой, в класс (сделайте их методами класса)
- Пометить прибор как
scope=”class”
- Используйте
@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
в своей подписи.