Проверка миграций Liquibase с помощью Database Rider
Как часто вы сталкиваетесь с неприятным кейсом — запускаем миграцию liquibase на стенде, а она падает с ошибкой или данные становятся…
Проверка миграций Liquibase с помощью Database Rider

Как часто вы сталкиваетесь с неприятным кейсом — запускаем миграцию liquibase на стенде, а она падает с ошибкой или данные становятся неконсистентны? При этом на машине разработчика все проходит успешно…
Как снизить риски ошибок при миграции схемы данных?
Отдельно тестировать миграции данных, в этом нам поможет — Database Rider. Database Rider в сочетании с Liquibase позволяет создать надежную систему автоматизированной проверки миграций.
Сегодня разберем, как можно достаточно легко тестировать миграции схем данных.
Почему важно тестировать миграции?
Миграции баз данных — это критически важная часть приложения. Ошибка в миграции может привести к:
- Потере данных в проде.
- Несовместимости между версиями приложения
- Дорогостоящему восстановлению
Необходимые настройки
Воспользуемся предыдущим примером, где мы поднимали Test Containers и изменим его для наших нужд.
1️⃣ Подключаем liquibase:
Добавим зависимости liquibase в build.gradle:
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
// Добавляем зависимость для Liquibase
implementation 'org.liquibase:liquibase-core'
// ...
}
Также необходимо добавить настройки в application.properties чтобы миграции начали работать:
# Liquibase configuration
spring.liquibase.enabled=true
spring.liquibase.change-log=classpath:/db/changelog/db.changelog-master.yaml
Также изменим конфигурацию для тестов:
spring:
datasource:
url: jdbc:tc:postgresql:16-alpine:///testdb
driver-class-name: org.testcontainers.jdbc.ContainerDatabaseDriver
liquibase:
enabled: false
# Важно отключить валидацию схемы
jpa.hibernate.ddl-auto: none
При тестировании миграций есть вероятность, что наши JPA сущности в какой-то момент будут находится в неконсистентном состоянии со схемой данных, поэтому важно отключить валидацию схемы в Hibernate: jpa.hibernate.ddl-auto: none.
2️⃣ Добавляем миграции
Теперь добавим лог миграции базы данных db.changelog-master.yaml:
databaseChangeLog:
- include:
file: changes/001-create-users-info-table.yaml
relativeToChangelogFile: true
- changeSet:
id: tag-version-1
author: kit
changes:
- tagDatabase:
tag: v1
- include:
file: changes/002-users-info-add-status.yaml
relativeToChangelogFile: true
В 002-users-info-add-status.yaml мы к таблице users_info добавим колонку status. Соответствующие изменения применим и к JPA сущности User.
Обратите внимание на чейнджсет с id: tag-version-1, здесь мы добавляем тэг к БД. Это позволит нам гибко управлять миграциями и накатывать изменения по версиям тэгов.
3️⃣ Пишем тест для проверки миграции
Настало время реализации теста миграции. Сначала подготовим наборы данных, необходимых для проверки миграции:
datasets/migrations/v1/users.yml- начальное состояние данных;datasets/migrations/v1/expected-users.yml- конечное состояние, после проведенных миграций.
Суть теста довольно проста:
- Применяем миграцию до версии
v1перед тестом. - Применяем миграцию до следующей версии.
- Используя механизмы Database Rider проверяем конечное состояние базы данных.
Полный код теста:
@SpringBootTest
@DBRider
@ActiveProfiles("test")
@Testcontainers
@DBUnit(schema = "public", caseSensitiveTableNames = true)
@TestPropertySource(properties = {
"spring.liquibase.enabled=false" // отключаем автоприменение
})
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class UsersInfoAddStatusTest {
@Autowired
private DataSource dataSource;
private Liquibase liquibase;
@BeforeAll
void runV1Migration() throws Exception {
// применяем миграцию v1
liquibase = new Liquibase(
"db/changelog/db.changelog-master.yaml",
new ClassLoaderResourceAccessor(),
DatabaseFactory.getInstance()
.findCorrectDatabaseImplementation(new JdbcConnection(dataSource.getConnection()))
);
liquibase.update("v1");
}
@Test
@DataSet(value = "datasets/migrations/v1/users.yml") // начальное состояние
@ExpectedDataSet(value = "datasets/migrations/v1/expected-users.yml", ignoreCols = "id") // конечное состояние
void testMigrationAfterV1() throws Exception {
// Применяем остальные изменения (после v1)
liquibase.update();
}
}
Вывод
Database Rider предоставляет нам отличный гибкий функционал для проверки состояния БД и работы с тестовыми наборами данных.
Использование Database Rider совместно с Liquibase и Testcontainers позволит тестировать миграции схемы данных и данных. Это позволит снизить количество ошибок, возникающих в самый неподходящий момент.
Исходный код доступен по ссылке
Подпишись на мой telegram-канал
메타데이터
- post_id
- af7d8a5a8b2a
- slug
- проверка-миграций-liquibase-с-помощью-database-rider-af7d8a5a8b2a
- url
- https://medium.com/@kazakov.andr.v/%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0-%D0%BC%D0%B8%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D0%B9-liquibase-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-database-rider-af7d8a5a8b2a
- canonical_url
- https://medium.com/@kazakov.andr.v/%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0-%D0%BC%D0%B8%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D0%B9-liquibase-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-database-rider-af7d8a5a8b2a
- author_url
- https://medium.com/@kazakov.andr.v
- status
- ok
- fetched_at
- 2026-06-09 15:37:30