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