Fixture (фікстура) – це об’єкт або набір умов, які готують середовище для виконання тесту. Вони забезпечують створення необхідного контексту, а також автоматизують процеси підготовки та очищення перед і після тестування.

Приклади застосування фікстур:

  • Відкриття з’єднання з базою даних перед тестом і закриття його після завершення.
  • Ініціалізація драйвера браузера перед тестом і завершення сесії після виконання.
  • Авторизація користувача в системі перед запуском тесту.
  • Створення облікового запису перед тестом, використання його у тесті та видалення після завершення.
  • Підготовка тестових даних перед тестом і їх очищення або відновлення початкового стану системи після завершення.

Докладніше про фікстури у Pytest Python.

Файл conftest.py

conftest.py – це спеціальний файл (модуль) у pytest, призначений для зберігання загальних фікстур. Pytest автоматично знаходить і підключає його у поточній директорії та всіх її вкладених папках, завдяки чому фікстури з цього файлу доступні у тестах без явного імпорту. Це спрощує спільне використання фікстур між кількома тестовими файлами.

conftest.py зазвичай розміщують у папці tests/ або в корені проекту, якщо фікстури мають бути доступні всім тестам. Наприклад, базова структура проекту може виглядати так:

project_root/
├── app/
│   └── ...             # Код програми
├── tests/
│   ├── conftest.py     # Спільні фікстури для тестів
│   ├── test_example.py # Тестовий файл
│   └── ...
├── requirements.txt
├── pytest.ini
└── README.md

Практичний приклад використання файлу conftest.py

Розглянемо простий приклад використання conftest.py у pytest для підготовки тестових даних.

Структура проекту:

project_root/
├── app/
│   ├── __init__.py
│   └── calculator.py        # Файл з функціями, які будемо тестувати
├── tests/
│   ├── __init__.py
│   ├── conftest.py          # Спільні фікстури для тестів
│   └── test_calculator.py   # Тести для calculator.py
└── pytest.ini               # Конфігураційний файл pytest

Модуль app/calculator.py:

def add(a, b):
    return a + b

Модуль tests/conftest.py:

import pytest
from app.calculator import add


@pytest.fixture
def addition_data():
    # (a, b, expected_result)
    return (2, 3, 5)


@pytest.fixture
def calculator_add():
    return add

Модуль tests/test_calculator.py:

def test_addition(addition_data, calculator_add):
    a, b, expected = addition_data
    result = calculator_add(a, b)
    assert result == expected

У цьому прикладі conftest.py містить дві фікстури:

  • addition_data – повертає кортеж з двох чисел та очікуваного результату їх додавання
  • calculator_add – повертає функцію add, яку тестуватимемо

У test_calculator.py фікстури автоматично доступні у тестових функціях без явного імпорту. Тести можуть використовувати підготовлені дані для перевірки результатів. Завдяки conftest.py можна уникнути дублювання коду та зробити тести легшими в підтримці.

Кілька файлів conftest.py

У великих проектах може бути кілька файлів conftest.py, розміщених у різних каталогах. Pytest шукає їх у поточній та всіх батьківських директоріях папки, де знаходиться тест. Наприклад, фікстури з рівня tests/api/users/ будуть доступні лише для тестів у цій папці та її підпапках, і водночас вони доповнять фікстури з conftest.py у директоріях вищих рівнів. 

Каталоги в pytest виступають своєрідними областями видимості: фікстури, визначені у conftest.py певного каталогу, автоматично доступні всім тестам у ньому та його підпапках. Такий підхід запобігає конфліктам і дублюванню коду, а також робить структуру тестів гнучкішою та легшою в підтримці.

Це дає змогу створювати як загальні фікстури для всього проекту, так і локальні – специфічні для певного набору тестів. Pytest використовує першу фікстуру з таким ім’ям, яку знайде під час пошуку, тому за потреби її можна перевизначити, щоб змінити або розширити поведінку для конкретного scope.

Підсумок

Сторінка документації доступна за посиланням: conftest.py – sharing fixtures across multiple files