Что такое фикстуры в `pytest`?

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

Фикстуры в pytest - это функции, которые предоставляют тестовым функциям предопределённое состояние или данные, необходимые для их работы. Они позволяют централизованно управлять настройкой и очисткой тестового окружения, делая тесты более читаемыми, поддерживаемыми и переиспользуемыми.

Основные характеристики фикстур:

  • Определение: Фикстура определяется с помощью декоратора @pytest.fixture.
  • Использование: Тестовая функция "запрашивает" фикстуру, указывая её имя в качестве аргумента. pytest автоматически вызывает фикстуру перед выполнением теста и передаёт возвращаемое значение фикстуры в тестовую функцию.
  • Область видимости (scope): Фикстуры могут иметь различную область видимости, определяющую, как часто фикстура будет вызываться:
    • function (по умолчанию): Фикстура выполняется перед каждым тестом, который ее использует.
    • class: Фикстура выполняется один раз для каждого класса, содержащего тесты, использующие её.
    • module: Фикстура выполняется один раз для каждого модуля, содержащего тесты, использующие её.
    • package: Фикстура выполняется один раз для каждого пакета, содержащего тесты, использующие её.
    • session: Фикстура выполняется один раз для всей тестовой сессии.
  • Автоматическое использование (autouse): Фикстуру можно пометить как autouse=True, тогда она будет автоматически применена ко всем тестам в определенной области видимости (например, в модуле или классе), даже если они явно не запрашивают её.
  • yield (для очистки): Фикстуры могут использовать оператор yield для выполнения кода после завершения теста, например, для освобождения ресурсов, закрытия соединений с базой данных и т.п. Код после yield называется teardown-кодом.

Преимущества использования фикстур:

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

Пример:


import pytest

@pytest.fixture
def database_connection():
    # Setup: Connect to the database
    conn = connect_to_database()
    yield conn  # Provide the database connection to the test
    # Teardown: Close the connection after the test
    conn.close()

def test_data_insertion(database_connection):
    # Use the database connection to insert data
    insert_data(database_connection, data={"name": "Test"})
    # Assert that the data was inserted correctly
    assert query_data(database_connection, "name") == "Test"
    

В этом примере database_connection - это фикстура, которая устанавливает соединение с базой данных перед каждым тестом, использующим её, и закрывает соединение после завершения теста. Тестовая функция test_data_insertion принимает database_connection в качестве аргумента и использует его для взаимодействия с базой данных.

0