Ответ
Фикстура (fixture) — это предопределенное состояние тестовой среды или набор данных, которые подготавливаются перед выполнением теста и очищаются после. Её цель — обеспечить изоляцию, повторяемость и надежность тестов, устраняя дублирование кода для настройки и очистки.
Пример фикстуры в pytest:
import pytest
@pytest.fixture
def test_user():
# Setup: создаем тестового пользователя в базе данных
user = User.create(username="test_user", email="test@example.com")
yield user # передаем объект в тест
# Teardown: очищаем данные после теста
user.delete()
def test_user_authentication(test_user):
# Фикстура `test_user` автоматически передается в тест
auth_result = authenticate(test_user.username, "password123")
assert auth_result is True
Основные типы фикстур:
- Функциональные (
@pytest.fixture) — выполняются для каждой тестовой функции. - Модульные (
scope="module") — выполняются один раз для модуля с тестами. - Сессионные (
scope="session") — выполняются один раз за всю сессию запуска тестов.
Применение: подготовка БД, мокирование внешних сервисов, создание временных файлов, настройка веб-драйвера для UI-тестов.
Ответ 18+ 🔞
А, фикстуры! Ну это, блядь, классика такая, ебать мои старые костыли. Представь себе, ты каждый раз перед тестом пишешь одно и то же: создать юзера, подключиться к базе, настроить мок. Пиздец какой-то, рутина, терпения ноль ебать. Так вот фикстура — это как раз твой личный раб-джинн, который всё это делает за тебя. Настроил один раз — и потом просто вызываешь по имени, и он тебе подсовывает готовый, протестированный объект. Ёперный театр, удобно же!
Вот смотри, самый простой пример на pytest. Тут всё прозрачно, как слеза младенца, если, конечно, младенец не хитрая жопа.
import pytest
@pytest.fixture
def test_user():
# Setup: создаем тестового пользователя в базе данных
user = User.create(username="test_user", email="test@example.com")
yield user # передаем объект в тест
# Teardown: очищаем данные после теста
user.delete()
def test_user_authentication(test_user):
# Фикстура `test_user` автоматически передается в тест
auth_result = authenticate(test_user.username, "password123")
assert auth_result is True
Видишь магию? Ты просто объявляешь функцию с декоратором @pytest.fixture. Всё, что до yield — это подготовка, «закуска». Сам yield — это момент, когда он отдаёт тебе объект в тест. А всё, что после — это «уборка стола», удаление данных, чтобы следующий тест начинался с чистого листа. Изоляция полная, доверия ебать ноль к соседним тестам не требуется.
А ещё они бывают разной «живучести», это важно. Не все же хотят создавать юзера для каждого чиха.
- Обычные (функциональные) — дефолтные. Запускаются заново для каждой тестовой функции. Надёжно, но если фикстура тяжёлая, то долго.
@pytest.fixtureили@pytest.fixture(scope="function"). - Модульные (
scope="module") — вот это уже интереснее. Запускается один раз на весь файл с тестами. Экономит время, если тесты в одном модуле не портят общие данные. Но осторожно, вы ходите по охуенно тонкому льду, если тесты друг другу мешают. - Сессионные (
scope="session") — это вообще песня. Запускается один раз за весь прогон тестов. Идеально для чего-то очень дорогого в создании: глобальное подключение к базе, запуск тяжёлого Docker-контейнера, инициализация какого-нибудь ебанько-сервиса.
Где это всё применяется? Да везде, ёпта! Подготовка таблиц в тестовой БД — святое дело. Мокирование внешнего API, чтобы не ждать ответа от реального сервиса и не платить ему деньги. Создание временного файла с конфигом. Или, например, запуск и настройка Selenium-драйвера для UI-тестов — вот где без фикстур просто пипец, удивление пиздец, как люди раньше жили.
Короче, выучи эту тему, и твоя жизнь станет проще. А если не выучишь — ну, сам от себя охуеешь, когда начнёшь поддерживать свои же тесты через месяц.