Короткий ответ
Фикстуры нужны, чтобы выполнить код до тест-метода и не повторять подготовку в каждом тесте. Метод помечается декоратором @pytest.fixture, а тест указывает имя фикстуры как параметр: pytest сам вызовет её и передаст возвращённое значение.
Как это работает подробнее
Обычно с помощью фикстур инициализируют подключения к базе данных, передают базовый URL и готовят другие данные.
- Назначение. Фикстура избавляет от повторения одного и того же подготовительного кода в каждом тесте.
- Подключение. Тест объявляет имя фикстуры аргументом, и pytest сам вызывает фикстуру и передаёт результат.
- Область видимости. Фикстура из тестового файла видна только в нём; общие для нескольких файлов выносят в conftest.py.
- Поиск. pytest сначала ищет фикстуру в самом тестовом файле, а если не находит — обращается к conftest.py.
- Scope. По умолчанию фикстура вызывается для каждого теста (function); доступны также class, module, package и session.
Пример кода
Фикстура с набором данных
import pytest
@pytest.fixture
def supply_AA_BB_CC():
aa = 25
bb = 35
cc = 45
return [aa, bb, cc]
def test_comparewithAA(supply_AA_BB_CC):
zz = 35
assert supply_AA_BB_CC[0] == zz, 'aa and zz comparison failed'Что использовать на практике
- conftest.py. Фикстуры, нужные в нескольких тестовых файлах, выноси в специальный файл conftest.py.
- Области видимости. Тяжёлые ресурсы готовь один раз на весь тестовый сеанс через scope='session' или 'module'.
- Совпадение имён. Имя параметра теста должно совпадать с именем фикстуры, чтобы pytest передал её значение.