@pytest.fixture
def tmp_file(tmp_path):
file = tmp_path / "test.txt"
file.write_text("some initial text")
yield file
# Cleanup (выполнится после завершения теста)
file.unlink()
Тесты принимают фикстуры как аргументы, pytest сам управляет их вызовом и очисткой. yield
разделяет логику настройки и очистки.
Фикстуры в контексте тестирования, особенно с использованием фреймворка pytest в Python, предоставляют механизм для настройки (setup) и очистки (teardown) тестовых данных. Они позволяют нам предоставить тестам надежный и воспроизводимый контекст, избегая повторения кода настройки и гарантируя, что среда возвращается в чистое состояние после завершения теста.
Настройка тестовых данных (Setup):
Фикстуры могут быть использованы для создания временных баз данных, заполнения их данными, создания файлов, инициализации объектов, подключения к внешним сервисам и выполнения других действий, необходимых для подготовки тестовой среды. Функция, отмеченная декоратором @pytest.fixture
, становится фикстурой. Когда тест требует фикстуру, pytest вызывает эту функцию, выполняет её код, и передает возвращаемое значение теста в качестве аргумента.
Очистка тестовых данных (Teardown):
Очень важно убирать за собой после завершения теста. Фикстуры позволяют это делать с помощью блока yield
. В фикстуре, все, что находится до yield
, выполняет настройку (setup), а все, что находится после yield
, выполняет очистку (teardown). Это гарантирует, что ресурсы освобождены, временные файлы удалены, а база данных возвращена в исходное состояние, даже если тест завершился неудачно.
Пример:
import pytest
@pytest.fixture
def temp_file():
"""Создает временный файл, записывает в него данные, и удаляет его после завершения теста."""
import tempfile
import os
# Setup
temp_file_object = tempfile.NamedTemporaryFile(delete=False)
temp_file_path = temp_file_object.name
temp_file_object.write(b"Some initial data")
temp_file_object.close()
yield temp_file_path # Provide the path to the test
# Teardown
os.remove(temp_file_path)
print(f"Удален временный файл: {temp_file_path}")
def test_temp_file_content(temp_file):
"""Проверяет, что временный файл содержит ожидаемые данные."""
with open(temp_file, 'r') as f:
content = f.read()
assert content == "Some initial data"
Объяснение примера:
@pytest.fixture
определяет фикстуру с именем temp_file
.tempfile.NamedTemporaryFile()
. delete=False
позволяет нам контролировать удаление файла.yield temp_file_path
: Возвращает путь к файлу тесту. Тест получает этот путь как аргумент (temp_file
в test_temp_file_content
).yield
выполняется, удаляя временный файл.test_temp_file_content
принимает фикстуру temp_file
в качестве аргумента. pytest автоматически предоставляет значение, возвращенное yield
.Преимущества использования фикстур:
В заключение, фикстуры - мощный инструмент в pytest для управления тестовой средой. Их использование приводит к более чистым, надежным и удобным в сопровождении тестам.