← Назад к вопросам

Приведи пример фикстуры

2.0 Middle🔥 131 комментариев
#Теория тестирования

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Пример фикстуры в pytest с пояснением

Фикстура (fixture) в контексте автоматизации тестирования с использованием фреймворка pytest — это функция, которая выполняется до (а иногда и после) тестовых функций, к которым она применяется. Её основная цель — предоставить тестам фиксированное, предсказуемое и изолированное состояние тестовых данных или среды (test fixture), что является фундаментальным принципом надежного автоматизированного тестирования.

Проще говоря, фикстура — это механизм для настройки (setup) и очистки (teardown) условий теста. В pytest фикстуры объявляются с помощью декоратора @pytest.fixture. Они являются более мощной и гибкой альтернативой классическим методам setup/teardown из unittest или xUnit.

Базовый пример фикстуры

Рассмотрим простой пример фикстуры, которая создает и возвращает список данных для теста.

import pytest

# Объявление фикстуры с помощью декоратора @pytest.fixture
@pytest.fixture
def sample_data():
    """Фикстура, возвращающая набор данных для тестов."""
    # Эта часть выполняется ПЕРЕД тестом (setup)
    data = [1, 2, 3, 4, 5]
    print("\nФикстура 'sample_data': создан список.")
    
    # Возвращаемое значение передается в тестовую функцию
    yield data
    
    # Эта часть выполняется ПОСЛЕ теста (teardown)
    print("Фикстура 'sample_data': выполняется очистка (при необходимости).")
    # Здесь можно закрыть соединения, удалить временные файлы и т.д.

# Тестовая функция использует фикстуру, указав её имя как параметр
def test_sum(sample_data):  # Фикстура 'sample_data' внедряется (injected) как аргумент
    """Тест, проверяющий сумму элементов списка."""
    assert sum(sample_data) == 15
    print(f"Тест выполнен с данными: {sample_data}")

def test_length(sample_data):
    """Тест, проверяющий длину списка."""
    assert len(sample_data) == 5

Ключевые моменты этого примера:

  • @pytest.fixture: Декоратор, который сообщает pytest, что функция sample_data является фикстурой.
  • yield: Ключевое слово, разделяющее код настройки (до yield) и код очистки (после yield). Фикстура возвращает значение, указанное после yield (в нашем случае data). Код после yield выполнится после завершения теста, независимо от его результата (успех, падение, ошибка). Это наиболее рекомендуемый способ для фикстур, требующих очистки.
  • Внедрение зависимости: Pytest автоматически обнаруживает, что тестовой функции test_sum нужна фикстура sample_data, по её имени в списке аргументов, и передаёт туда результат выполнения фикстуры. Это называется dependency injection.
  • Изоляция: Каждый тест, использующий фикстуру, по умолчанию получает новое выполнение этой фикстуры. Изменения, внесенные тестом test_sum в список sample_data, не повлияют на данные, полученные тестом test_length.

Практический пример: фикстура для работы с временным файлом

Вот более сложный и приближенный к реальности пример, демонстрирующий силу фикстур в управлении ресурсами.

import pytest
import json
import tempfile
import os

@pytest.fixture
def temp_config_file():
    """Фикстура создает временный JSON-файл с конфигурацией для теста."""
    # Создаем временный файл в безопасном каталоге
    temp_file = tempfile.NamedTemporaryFile(mode='w', suffix='.json', delete=False)
    
    # Данные для записи в файл
    config_data = {
        "database": "test_db",
        "host": "localhost",
        "port": 5432,
        "debug_mode": True
    }
    
    # Записываем данные в файл
    json.dump(config_data, temp_file)
    temp_file.close()  # Закрываем файл, чтобы тест мог его открыть
    
    # Передаем путь к файлу в тест
    yield temp_file.name  # .name содержит путь к файлу
    
    # TEARDOWN: Удаляем временный файл после выполнения теста
    # Этот код выполнится даже если тест упал
    os.unlink(temp_file.name)
    print(f"\nВременный файл {temp_file.name} удален.")

def test_config_loading(temp_config_file):
    """Тест загрузки и проверки конфигурации из файла."""
    with open(temp_config_file, 'r') as f:
        config = json.load(f)
    
    assert config["database"] == "test_db"
    assert config["debug_mode"] is True
    print(f"Конфигурация успешно загружена из {temp_config_file}")

def test_file_exists(temp_config_file):
    """Тест проверяет, что файл, созданный фикстурой, существует."""
    assert os.path.exists(temp_config_file)

Важные возможности фикстур pytest

  • Область видимости (scope): Можно управлять тем, как часто выполняется фикстура.
    @pytest.fixture(scope="module")  # Выполнится один раз на модуль с тестами
    def shared_connection():
        conn = create_database_connection()
        yield conn
        conn.close()
    
    Доступные области: `"function"` (по умолчанию), `"class"`, `"module"`, `"package"`, `"session"`.

  • Автоиспользование (autouse): Фикстура выполняется автоматически для всех тестов в своей области видимости, без явного указания в аргументах.

    @pytest.fixture(autouse=True, scope="session")
    def global_log_setup():
        print("\n>>> Начало тестовой сессии")
        yield
        print(">>> Окончание тестовой сессии")
    
  • Зависимость фикстур от других фикстур: Фикстуры могут запрашивать другие фикстуры, что позволяет строить сложные, композируемые цепочки настройки.

    @pytest.fixture
    def database():
        return "test_db"
    
    @pytest.fixture
    def api_client(database):  # Эта фикстура зависит от фикстуры 'database'
        client = APIClient(connection_string=database)
        client.connect()
        yield client
        client.disconnect()
    

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

Приведи пример фикстуры | PrepBro