> Как тестировать миграции базы данных? (Python)

Уровень: senior · Роль: backend · Язык: Python · Категория: Технические вопросы

Компании: praktika.ai, Московский метрополитен

Стек: Python

> Пример ответа

Тестирование миграций базы данных - это критически важный процесс, особенно в Python-проектах с использованием инструментов вроде Alembic (для SQLAlchemy) или Django ORM. Основная цель - убедиться, что изменения схемы (добавление/удаление колонок, таблиц, индексов) не нарушают существующую логику и данные.

Основные подходы:

  1. Тестирование "вверх" и "вниз" (upgrade/downgrade). Каждая миграция должна быть обратимой. В тестах запускаем upgrade(), проверяем состояние схемы (например, наличие колонки), затем downgrade() и убеждаемся, что схема вернулась к исходному виду. Это гарантирует возможность отката.

  2. Интеграционные тесты с реальной БД. Используем тестовую базу данных (например, PostgreSQL в Docker-контейнере или SQLite для простоты). В фикстурах создаем пустую БД, применяем все миграции до текущей версии, затем проверяем, что CRUD-операции работают корректно. Пример на Python с pytest:

PYTHON
import pytest
from alembic.config import Config
from alembic.command import upgrade, downgrade
@pytest.fixture
def migrated_db():
alembic_cfg = Config("alembic.ini")
upgrade(alembic_cfg, "head")
yield
downgrade(alembic_cfg, "base") # откат после теста
def test_add_column(migrated_db):
# Проверяем, что колонка 'email' существует в таблице 'users'
from sqlalchemy import inspect
inspector = inspect(engine)
columns = [col['name'] for col in inspector.get_columns('users')]
assert 'email' in columns
  1. Тестирование миграций на наличие данных. Если миграция добавляет колонку с дефолтным значением, проверяем, что существующие строки получают это значение. Для этого в тесте вставляем данные до применения миграции, применяем миграцию, затем проверяем корректность.

  2. Автоматизация в CI. Миграции должны тестироваться в изолированной среде (например, временная БД в GitHub Actions). Это предотвращает случайное применение непроверенных изменений на продакшене.

  3. Проверка на конфликты. Если несколько разработчиков создают миграции параллельно, тесты должны выявлять конфликты (например, дублирование имен колонок). Используйте alembic check или кастомные скрипты для проверки целостности.

Важно: не тестируйте миграции на продакшене - только на копии данных или в тестовой среде. Для больших проектов полезно иметь "золотую" базу данных с эталонной схемой, с которой сравнивается результат миграции.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью