Sobes.tech
Back to questions
Junior — Middle
61

Каким образом применяются фикстуры для взаимодействия с базой данных при написании тестов?

Answer from AI

sobes.tech AI

Фикстуры в тестах на Python (например, с pytest) используются для подготовки и очистки состояния базы данных перед и после выполнения тестов. Это позволяет изолировать тесты друг от друга и гарантировать предсказуемость результатов.

Основные способы применения фикстур для работы с БД:

  • Создание подключения и сессии: фикстура открывает соединение с тестовой базой, возвращает объект сессии или курсора, который используется в тестах.
  • Подготовка данных: в фикстуре можно создавать необходимые записи, чтобы тесты работали с известным набором данных.
  • Транзакции и откат: часто фикстуры запускают транзакцию перед тестом и делают откат после, чтобы не сохранять изменения в базе.
  • Очистка: если транзакции не используются, фикстура может удалять созданные данные вручную.

Пример фикстуры с SQLAlchemy и pytest:

import pytest
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from myapp.models import Base

@pytest.fixture(scope='function')
def db_session():
    engine = create_engine('sqlite:///:memory:')
    Base.metadata.create_all(engine)
    Session = sessionmaker(bind=engine)
    session = Session()

    yield session  # тесты используют сессию

    session.rollback()  # откат всех изменений
    session.close()

В тесте:

def test_add_user(db_session):
    user = User(name='Alice')
    db_session.add(user)
    db_session.commit()

    assert db_session.query(User).filter_by(name='Alice').one()

Такой подход обеспечивает изоляцию тестов и чистоту данных.