Фикстуры и настройка/очистка
Используйте фикстуры для общего состояния тестов и настройки ресурсов.
«Фикстуры и настройка/очистка» — бесплатный урок Python Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Python Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Python Academy содержит 4 уроков всего.
Что такое фикстуры
Фикстуры — это функции с декоратором @pytest.fixture, которые предоставляют зависимости для тестов. pytest внедряет их по имени.
import pytest
@pytest.fixture
def user():
return {"name": "Alice", "age": 30}
def test_name(user):
assert user["name"] == "Alice"Настройка и очистка с помощью yield
Возвращайте значение фикстуры через yield внутри фикстуры, чтобы отделить настройку (до yield) от очистки (после yield).
import pytest
@pytest.fixture
def db_connection():
conn = create_connection() # setup
yield conn
conn.close() # teardown
def test_query(db_connection):
result = db_connection.query("SELECT 1")
assert result is not NoneОбласти действия фикстур
Управляйте частотой создания фикстуры с помощью scope: function (по умолчанию), class, module, session.
import pytest
@pytest.fixture(scope="module")
def expensive_resource():
print("\nSetup once per module")
yield object()
print("\nTeardown once per module")Общий доступ к фикстурам через conftest.py
Размещайте фикстуры в conftest.py, чтобы использовать их в разных файлах тестов без импорта.
# conftest.py
import pytest
@pytest.fixture
def config():
return {"env": "test", "debug": True}
# test_app.py
def test_env(config):
assert config["env"] == "test"Зависимости фикстур
Фикстуры могут зависеть от других фикстур, если указать их в качестве параметров.
import pytest
@pytest.fixture
def base_url():
return "http://localhost:8000"
@pytest.fixture
def api_client(base_url):
return Client(base_url)
def test_get(api_client):
resp = api_client.get("/health")
assert resp.status_code == 200Автоматически применяемые фикстуры
Установите autouse=True, чтобы применять фикстуру ко всем тестам в области действия без указания её в качестве параметра.
import pytest
@pytest.fixture(autouse=True)
def reset_env(monkeypatch):
monkeypatch.setenv("ENVIRONMENT", "test")
def test_env():
import os
assert os.environ["ENVIRONMENT"] == "test"Фикстура tmp_path
pytest предоставляет встроенную фикстуру tmp_path, которая создаёт отдельный новый временный каталог для каждого теста.
def test_write_file(tmp_path):
f = tmp_path / "hello.txt"
f.write_text("hello")
assert f.read_text() == "hello"Фикстура monkeypatch
monkeypatch позволяет временно заменять атрибуты, переменные окружения или записи словаря во время теста.
def get_env():
import os
return os.environ.get("MODE", "prod")
def test_mode(monkeypatch):
monkeypatch.setenv("MODE", "test")
assert get_env() == "test"Фикстура capsys
capsys перехватывает вывод в stdout и stderr во время тестов.
def greet(name):
print(f"Hello, {name}!")
def test_greet(capsys):
greet("Alice")
out, err = capsys.readouterr()
assert out == "Hello, Alice!\n"Финализаторы фикстур с request.addfinalizer
Альтернатива yield: зарегистрируйте очистку с помощью request.addfinalizer.
import pytest
@pytest.fixture
def resource(request):
r = acquire_resource()
request.addfinalizer(r.release)
return rПараметризованные фикстуры
Используйте params в фикстуре, чтобы каждый зависящий от неё тест выполнялся один раз для каждого значения параметра.
import pytest
@pytest.fixture(params=["sqlite", "postgres"])
def db(request):
return create_db(request.param)
def test_insert(db):
db.insert({"id": 1})
assert db.count() == 1Проверка
Какая область действия фикстуры создаёт её один раз на весь сеанс тестирования?
Итоги
Фикстуры предоставляют повторно используемые подготовку и очистку с помощью yield. Используйте scope, чтобы управлять сроком действия, conftest.py — для общего доступа, а autouse=True — для неявного применения.
Часто задаваемые вопросы
Урок «Фикстуры и настройка/очистка» бесплатный?
Да — полный текст урока «Фикстуры и настройка/очистка» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Python Academy, подпишись на CoddyKit PRO. Курс Python Academy содержит 4 уроков всего.
Чему я научусь в уроке «Фикстуры и настройка/очистка»?
Используйте фикстуры для общего состояния тестов и настройки ресурсов. Ты практикуешь Python Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Python Academy?
Предыдущий опыт не требуется. Python Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Фикстуры и настройка/очистка»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Python Academy?
Да. Каждый урок Python Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Написание первых тестов pytest
- Фикстуры и настройка/очистка
- Параметризация и покрытие тестами
- Имитация с помощью unittest.mock