Для чего используются фикстуры в pytest и как их применять?

Ответ

Фикстуры в pytest — это функции, которые предоставляют предсказуемую, фиксированную среду для тестов. Они используются для подготовки данных, настройки соединений (например, с БД) или создания объектов, необходимых для тестирования.

Принцип работы: Код фикстуры выполняется до запуска теста, который её запрашивает. Если используется yield, то фикстура разделяется на две части:

  1. Setup: Код до yield (подготовка данных).
  2. Teardown: Код после yield (очистка ресурсов), который выполняется после завершения теста.

Пример:

import pytest
import tempfile
import os

# Фикстура создает временный файл и передает его имя в тест
@pytest.fixture
def temp_file():
    # Setup: создаем файл
    fp = tempfile.NamedTemporaryFile(delete=False, mode='w+')
    fp.write('test data')
    fp.close()

    yield fp.name  # Передаем управление и данные тесту

    # Teardown: удаляем файл после теста
    os.unlink(fp.name)

# Тест принимает имя фикстуры в качестве аргумента
def test_read_from_temp_file(temp_file):
    with open(temp_file, 'r') as f:
        content = f.read()
    assert content == 'test data'

Ключевые преимущества:

  • Переиспользование кода: Одна фикстура может использоваться во многих тестах.
  • Изоляция тестов: Каждый тест получает свой собственный экземпляр фикстуры (по умолчанию).
  • Управление ресурсами: Гарантированная очистка ресурсов благодаря yield.
  • Гибкость: Область видимости фикстуры (scope) можно настроить на уровне функции, класса, модуля или всей сессии.