Ответ
Фикстура (Fixture) — это функция или метод, который подготавливает систему к тесту, устанавливая предопределенное, стабильное и воспроизводимое состояние (данные, конфигурацию, среду), и при необходимости выполняет очистку после теста.
Основные цели:
- Устранение дублирования кода для настройки/очистки в разных тестах.
- Обеспечение изоляции тестов и их независимости от порядка выполнения.
- Повышение читаемости тестового кода.
Пример в Pytest (Python):
import pytest
# Объявление фикстуры
@pytest.fixture
def authenticated_client():
"""Фикстура создает и возвращает клиент API с валидным токеном."""
client = APIClient()
token = login_and_get_token("test_user", "pass") # Настройка
client.set_auth_token(token)
yield client # Передача контроля тесту
client.logout() # Очистка после теста
@pytest.fixture(scope="module")
def shared_database():
"""Фикстура с областью видимости на весь модуль."""
db = create_test_database()
yield db
db.drop()
# Использование фикстуры: передача как аргумента в тест
def test_create_order(authenticated_client, shared_database):
"""Тест использует предварительно аутентифицированный клиент и БД."""
response = authenticated_client.post("/orders", data={"item": "book"})
assert response.status_code == 201
assert shared_database.order_count() == 1
Области видимости (scope) фикстур в Pytest:
function(по умолчанию): Создается заново для каждого теста.class: Создается один раз для класса тестов.module: Создается один раз для модуля с тестами.session: Создается один раз за весь прогон тестов.
Аналоги в других фреймворках: setUp/tearDown в JUnit/xUnit, beforeEach/afterEach в Jest/Jasmine.
Ответ 18+ 🔞
А, фикстуры, блядь! Ну это ж классика, ёпта! Сейчас объясню, как есть, без всякой этой заумной хуйни.
Представь себе, ты каждый раз перед тестом начинаешь одно и то же: базу данных поднимаешь, пользователя логинишь, конфиги грузишь. Заебёшься же, блядь, писать это в каждом втором тесте! Вот фикстура — это твой личный раб-грум, который всё это делает за тебя один раз, а ты потом просто пользуешься, сука.
По-простому: это такая функция-обслуга, которая накрывает стол перед твоим тестом-пиршеством, а потом, когда ты обосрался и нажрался, всё за тобой убирает. Красота, а не жизнь!
Смотри, как в питоне с pytest это выглядит, там вообще пиздец как удобно:
import pytest
# Вот объявляем нашего раба-грума, то есть фикстуру
@pytest.fixture
def authenticated_client():
"""Эта хуйня создаёт клиента, который уже залогинен, чтоб не париться."""
client = APIClient()
token = login_and_get_token("test_user", "pass") # Вот он накрывает стол
client.set_auth_token(token)
yield client # А вот он тебе этот накрытый стол подаёт! Бери и жри!
client.logout() # А это он уже после твоего обжорства тарелки моет
# А бывают фикстуры-мажоры, которые на весь отдел (модуль) один раз работают
@pytest.fixture(scope="module")
def shared_database():
"""Эта создаёт тестовую базу данных, которую все тесты в файле делят."""
db = create_test_database()
yield db
db.drop() # И удаляет её, когда все наебнулись
# А вот как этим богатством пользоваться в тесте:
def test_create_order(authenticated_client, shared_database):
"""Смотри-ка, тесту просто подали готового клиента и БД! Ничего не делал!"""
response = authenticated_client.post("/orders", data={"item": "book"})
assert response.status_code == 201
assert shared_database.order_count() == 1
Видишь, блядь? Тест теперь чистый, красивый, только логику проверяет. Не засран подготовительным кодом. Это ж овердохуища как читать приятно!
А ещё у этих фикстур, сука, есть «зоны ответственности» (scope):
function(обычно по умолчанию) — Самый работяга. Для КАЖДОГО теста, блядь, всё заново накрывает и убирает. Изоляция — полный пиздец.class— Уже поумнее. Один раз на весь класс тестов отработал — и все тесты в нём этим пользуются.module— Вообще красава. Создался один раз на весь файл с тестами и всем сестрам по серьгам.session— Царь и бог. Запустился в начале всех тестов и живёт, пока всё не кончится. Экономия времени — просто ёперный театр!
В других языках та же хуйня, просто называется по-другому: setUp/tearDown в Java (JUnit), beforeEach/afterEach в JavaScript. Суть одна — чтобы тестировщик не превращался в уборщика, а занимался своим делом. Гениально и просто, как всё гениальное, блядь!