> Как тестировать миграции базы данных? (Python)
Уровень: senior · Роль: backend · Язык: Python · Категория: Технические вопросы
Компании: praktika.ai, Московский метрополитен
Стек: Python
> Пример ответа
Тестирование миграций базы данных - это критически важный процесс, особенно в Python-проектах с использованием инструментов вроде Alembic (для SQLAlchemy) или Django ORM. Основная цель - убедиться, что изменения схемы (добавление/удаление колонок, таблиц, индексов) не нарушают существующую логику и данные.
Основные подходы:
-
Тестирование "вверх" и "вниз" (upgrade/downgrade). Каждая миграция должна быть обратимой. В тестах запускаем
upgrade(), проверяем состояние схемы (например, наличие колонки), затемdowngrade()и убеждаемся, что схема вернулась к исходному виду. Это гарантирует возможность отката. -
Интеграционные тесты с реальной БД. Используем тестовую базу данных (например, PostgreSQL в Docker-контейнере или SQLite для простоты). В фикстурах создаем пустую БД, применяем все миграции до текущей версии, затем проверяем, что CRUD-операции работают корректно. Пример на Python с pytest:
PYTHONimport pytestfrom alembic.config import Configfrom alembic.command import upgrade, downgrade@pytest.fixturedef migrated_db():alembic_cfg = Config("alembic.ini")upgrade(alembic_cfg, "head")yielddowngrade(alembic_cfg, "base") # откат после тестаdef test_add_column(migrated_db):# Проверяем, что колонка 'email' существует в таблице 'users'from sqlalchemy import inspectinspector = inspect(engine)columns = [col['name'] for col in inspector.get_columns('users')]assert 'email' in columns
-
Тестирование миграций на наличие данных. Если миграция добавляет колонку с дефолтным значением, проверяем, что существующие строки получают это значение. Для этого в тесте вставляем данные до применения миграции, применяем миграцию, затем проверяем корректность.
-
Автоматизация в CI. Миграции должны тестироваться в изолированной среде (например, временная БД в GitHub Actions). Это предотвращает случайное применение непроверенных изменений на продакшене.
-
Проверка на конфликты. Если несколько разработчиков создают миграции параллельно, тесты должны выявлять конфликты (например, дублирование имен колонок). Используйте
alembic checkили кастомные скрипты для проверки целостности.
Важно: не тестируйте миграции на продакшене - только на копии данных или в тестовой среде. Для больших проектов полезно иметь "золотую" базу данных с эталонной схемой, с которой сравнивается результат миграции.
> Похожие задачи по Python
Что такое нефункциональное тестирование и какие виды оно включает?
Как организовать юнит-тесты в Python?
Что такое git flow
Что происходит внутри dict при добавлении нового элемента
> Похожие задачи по backend
Что такое нефункциональное тестирование и какие виды оно включает?
Как организовать юнит-тесты в Python?
Что происходит внутри dict при добавлении нового элемента
Как реализуются атрибуты в классах Python
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью