0Pricing
Python Academy · Урок

Фикстуры и настройка/очистка

Используйте фикстуры для общего состояния тестов и настройки ресурсов.

«Фикстуры и настройка/очистка» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Написание первых тестов pytest
  2. Фикстуры и настройка/очистка
  3. Параметризация и покрытие тестами
  4. Имитация с помощью unittest.mock
← Назад к Python Academy