Что такое фикстуры (fixtures) в Pytest?

Ответ

Фикстуры (fixtures) в Pytest — это мощный механизм для подготовки, настройки и очистки тестового окружения. Они позволяют инжектировать зависимости в тестовые функции, избегая дублирования кода и соблюдая принцип DRY (Don't Repeat Yourself).

Основные концепции:

  • Объявление: Фикстура — это функция, декорированная @pytest.fixture.
  • Использование: Тестовая функция запрашивает фикстуру, указав её имя в качестве параметра.
  • Область видимости (scope): Управляет временем жизни фикстуры: "function" (по умолчанию, для каждого теста), "class", "module", "session".

Пример: Фикстура для временного файла

import pytest
import os

@pytest.fixture(scope="function")
def temp_config_file(tmp_path):  # Используем встроенную фикстуру tmp_path
    # SETUP: Создаем файл с конфигом
    config_file = tmp_path / "app_config.json"
    config_file.write_text('{"timeout": 30}')

    yield config_file  # Передаем объект файла в тест

    # TEARDOWN: Очистка (неявно выполняется tmp_path)
    # Код после yield выполнится после теста, даже если он упал

def test_read_config(temp_config_file):
    # Фикстура автоматически передается как аргумент
    content = temp_config_file.read_text()
    assert "timeout" in content
    assert "30" in content

Преимущества фикстур:

  • Модульность и переиспользование.
  • Четкое разделение setup/teardown логики.
  • Возможность композиции: фикстуры могут зависеть от других фикстур.
  • Автоматическое обнаружение и использование Pytest.

Связь с вопросом: Термин "текстуры" в исходном вопросе, вероятно, является опечаткой или искажением слова "фикстуры" (fixtures).

Ответ 18+ 🔞

А, так вот ты о чём, пизда с ушами! Текстуры, блядь... Да не текстуры, а фикстуры, ёпта! Это ж основа основ, хуй с горы, без них тесты — как суп без соли, одна вода.

Смотри, чтобы не быть распиздяем, который в каждом тесте одно и то же пишет по десять раз. Вот представь: тебе перед каждым тестом надо базу данных поднять, конфиг загрузить, тестового пользователя создать. И после теста всё это ебалом нахуй снести. Так вот фикстуры — это твои личные рабы, которые всё это делают за тебя, пока ты ковыряешь в носу.

Как это, блядь, работает:

  • Объявляешь функцию и вешаешь на неё @pytest.fixture. Это как сказать: "Эй, Питест, вот эта функция — фикстура, запомни её".
  • Используешь — просто пишешь имя этой фикстуры в параметрах своей тестовой функции. Питест такой: "Ага, ща всё будет", — подготавливает и суёт тебе в руки готовый объект.
  • Область видимости (scope) — это вообще магия, блядь. Можно сделать так, чтобы фикстура создавалась один раз на всю сессию тестов (session), на один файл (module), на класс (class) или, как обычно, на каждый тест (function). Экономия времени — овердохуища!

Вот смотри, живой пример. Допустим, тебе нужен временный файл с конфигом:

import pytest
import os

@pytest.fixture(scope="function") # Дефолтный scope, можно и не писать
def temp_config_file(tmp_path):  # О, смотри, а тут фикстура использует другую фикстуру! tmp_path — встроенная, даёт временную папку.
    # Эта часть (SETUP) выполняется ДО теста
    config_file = tmp_path / "app_config.json" # Создаём путь к файлу
    config_file.write_text('{"timeout": 30}') # Пишем в него хуйню

    yield config_file  # А вот тут — стоп! Передаём управление тесту вместе с этим файлом.
    # Всё, тест отработал (или сдох), и вот эта часть (TEARDOWN) выполняется ПОСЛЕ.
    # Чистку тут можно не писать, tmp_path сам всё за собой приберёт, умная жопа.

def test_read_config(temp_config_file): # Смотри сюда! Просто указал имя — и получил файл!
    content = temp_config_file.read_text()
    assert "timeout" in content
    assert "30" in content # Проверяем, что там та самая хуйня, которую мы записали.

И в чём, сука, кайф?

  • Не повторяешься, мудя. Написал логику подготовки один раз — юзай в сотне тестов.
  • Всё чисто и аккуратно. setup и teardown — как инь и янь, в одном месте.
  • Фикстуры в фикстуры, блядь! Можно строить целые цепочки зависимостей, одна фикстура готовит данные для другой. Красота!
  • Питест сам всё видит и делает. Ты просто говоришь "хочу это" — а он уже бежит, готовит.

А насчёт "текстур"... Да это же, блядь, классика! Человек, видимо, слышал звон, да не знает, где он. Фикстуры, ёпта, fixtures. Запомни, а то будешь выглядеть, как тот самый Герасим, который только "Муму" мычать может.