Database Rider - простая работа с тестовыми данными

Database Rider - простая работа с тестовыми данными

Если вы пишете интеграционные тесты для spring-boot приложений, то, скорее всего, сталкивались с проблемой инициализации данных перед тестом и их последующей очистки после окончания теста.

Существует множество способов подготовки и очистки данных, вот некоторые из них:

  • Запуск sql-скрипта, написанного руками, в секциях @Before/@After.
  • Использование скрипта import.sql в spring-boot для инициализации БД.
  • Запуск отдельных миграций liquibase/flyway для тестовых данных.

Эти варианты достаточно простые для начальной реализации, но у них есть существенные недостатки при дальнейшем использовании:

  • Избыточный код, который переносится из теста в тест.
  • Сложность поддержки данных при изменении БД.
  • Постоянно возникающие конфликты между тестами.
  • Плохая читаемость тестовых данных.

Как упростить себе подготовку и очистку данных в интеграционных тестах? Использовать библиотеку Database Rider.

Database Rider - это библиотека, построенная на основе DBUnit, которая позволяет работать с тестовыми данными в простом и декларативном подходе. Вместо того, чтобы готовить SQL скрипты для наполнения таблиц, можно описывать необходимые для теста данные в простых и читаемых форматах - JSON, YAML, XML, CSV и XLS.

Ключевые преимущества, которые дает Database Rider:

  • Декларативный и читаемый формат - данные описываются в удобном и читаемом формате - CSV/YAML/JSON/XSL.
  • Автоматическая загрузка и очистка БД - с помощью одной аннотации - @DataSet можно указать, какие данные необходимо загрузить перед тестом. А после теста таблицы автоматически очистятся.
  • Сравнение состояния БД после теста - после манипуляции с данными можем проверить состояние БД и сравнить с ожидаемым, используя аннотацию @ExpectedDataSet.
  • Гибкость управления тестовыми данными - можно определять разные наборы данных для разных тестовых сценариев.
  • Поддержка Spring и JUnit5 - в отличие от DBUnit, Database Rider отлично интегрируется с современным стеком Java-разработки.

Простой пример использования Database Rider для тестирования

Начать использовать Database Reaper в тестах очень просто, нужна лишь минимальная конфигурация.

Подключаем к скрипту сборки, в качестве примера используем gradle:

dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' runtimeOnly 'com.h2database:h2' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' testImplementation 'com.github.database-rider:rider-junit5:1.44.0' testImplementation 'com.github.database-rider:rider-spring:1.44.0' }

Тестовые данные опишем в формате YAML:

users_info: - id: 1 name: "Alice" - id: 2 name: "Bob"

Теперь можно использовать аннотацию @DataSet для загрузки данных перед тестом:

@DataJpaTest @DBRider class UserRepositoryTest { @Autowired private UserRepository userRepository; @Test @DataSet("datasets/users.yml") // загружаем тестовые данные void shouldLoadAllUsers() { List<User> users = userRepository.findAll(); assertEquals(2, users.size()); assertEquals("Alice", users.get(0).getName()); assertEquals("Bob", users.get(1).getName()); } }

Мы также можем проверить состояние БД после теста, используя аннотацию @ExpectedDataSet:

// ... @Test @DataSet("datasets/users.yml") // начальное состояние @ExpectedDataSet(value = "datasets/expected-users.yml", ignoreCols = "id") // конечное состояние void shouldInsertNewUser() { userRepository.save(new User(3L, "Charlie")); }

Файл с данными для проверки конечного состояния:

users_info: - id: 1 name: "Alice" - id: 2 name: "Bob" - id: 3 name: "Charlie"

Итог

Database Rider делает рутинную работу по подготовке и очистке БД. Это простой инструмент, который сделает ваши тесты чище и нагляднее. Попробуйте использовать его совместно с testcontainers, это значительно упростит разработку и поддержку тестов.

Мой канал в telegram, не забудь подписаться.

Начать дискуссию