Ответ
Тестирование БД — это проверка целостности, корректности и консистентности данных, а также логики работы с ними. Я подхожу к этому на нескольких уровнях.
1. Проверка структуры (Schema Testing):
- Соответствие DDL-скриптов требованиям: названия таблиц и колонок, типы данных (
VARCHAR(255)vsTEXT), ограничения (NOT NULL,UNIQUE). - Проверка индексов и ключей. Например, убедиться, что на колонку
user_idв таблицеordersесть внешний ключ (FOREIGN KEY) наusers(id).-- Проверка существования индекса SELECT * FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_NAME = 'orders' AND COLUMN_NAME = 'user_id';
2. Проверка данных (Data Integrity Testing):
- Корректность: Данные соответствуют бизнес-правилам (возраст > 0, email имеет валидный формат).
-- Поиск некорректных email'ов SELECT id, email FROM users WHERE email NOT REGEXP '^[^@]+@[^@]+\.[^@]{2,}$'; - Консистентность: После CRUD-операций данные в связанных таблицах синхронизированы. Например, удаление пользователя должно каскадно удалить его заказы (или обработать это в приложении).
- Миграции: Проверка скриптов миграции (Liquibase/Flyway) на откат (rollback) и отсутствие даунтайма.
3. Проверка бизнес-логики на уровне БД:
- Тестирование хранимых процедур, триггеров и представлений (VIEW). Пишу небольшие SQL-скрипты, которые подготавливают тестовые данные, вызывают процедуру и проверяют результат.
4. Интеграция с автотестами:
- Использую Testcontainers для поднятия изолированного контейнера с БД на время прогона тестов.
- Для модульных тестов сервисов применяю H2 или другую in-memory БД с той же структурой, что и продакшен.
- После выполнения E2E-теста проверяю, что данные записались в БД именно так, как ожидалось.
Инструменты: Помимо прямых SQL-запросов, использую DBeaver для визуального анализа, pgTAP для unit-тестов в PostgreSQL и DBUnit для управления тестовыми датасетами в Java-проектах.