SpringBoot, тестовые контейнеры для проверки запросов, отправляемых на внешнюю БД - PullRequest
0 голосов
/ 13 апреля 2020

Приложение My Spring имеет собственную базу данных для сохранения. Это же приложение должно отправлять ad-ho c запросы во внешние базы данных. Запросы предоставляются пользователями.

  • Приложение принимает SQL запрос, предоставленный пользователем
  • Приложение принимает внешний тип базы данных (postgres / oracle / независимо от jdb c)
  • Приложение отправляет запрос adho c во время выполнения на внешнюю базу данных
  • Приложение возвращает результат как json пользователю

Есть ли способ использовать контейнеры для пружинных испытаний для проверки этого functionaly? Моя цель:

  • Писать тесты для каждой поддерживаемой БД
  • каждый тест запускает тестовый контейнер с поддерживаемой БД (некоторые из этих подмножеств я полагаю: https://www.testcontainers.org/modules/databases/ )
  • каждый тест загружает примеры данных в базу данных контейнера
  • каждый тест запускает набор запросов «должен работать» против него.

Я вижу много примеров, когда само приложение само по себе тестируется на тестовых контейнерах, но можно ли просто запустить контейнер без подключения к нему как App persistence DB?

1 Ответ

2 голосов
/ 14 апреля 2020

Могу ли я просто запустить контейнер без подключения к нему как БД персистентности приложения?

Да, это вполне возможно. Testcontainers сам по себе не имеет ничего общего с Spring или Spring Boot.

Что бы вы сделали:

  • выберите контейнер, который вы хотите использовать (разные контейнеры для разных баз данных
  • создать экземпляр контейнера
  • запустить его
  • построить из него DataSource
  • Использовать это DataSource для своих тестов.

Spring Data JDB C делает именно это для запуска тестов с различными базами данных. В конце я добавляю класс, делающий это для MySQL. Это конфигурация контекста приложения Spring, но вы могли бы поставить что в JUnit before метод, правило JUnit 4 или расширение JUnit 5 или просто обычный метод, который вы вызываете в начале теста.

@Configuration
@Profile("mysql")
class MySqlDataSourceConfiguration extends DataSourceConfiguration {

    private static final MySQLContainer MYSQL_CONTAINER = new MySQLContainer().withConfigurationOverride("");

    static {
        MYSQL_CONTAINER.start();
    }

    /*
     * (non-Javadoc)
     * @see org.springframework.data.jdbc.testing.DataSourceConfiguration#createDataSource()
     */
    @Override
    protected DataSource createDataSource() {

        MysqlDataSource dataSource = new MysqlDataSource();
        dataSource.setUrl(MYSQL_CONTAINER.getJdbcUrl());
        dataSource.setUser(MYSQL_CONTAINER.getUsername());
        dataSource.setPassword(MYSQL_CONTAINER.getPassword());
        dataSource.setDatabaseName(MYSQL_CONTAINER.getDatabaseName());

        return dataSource;
    }

    @PostConstruct
    public void initDatabase() throws SQLException, ScriptException {
        ScriptUtils.executeSqlScript(createDataSource().getConnection(), null, "DROP DATABASE test;CREATE DATABASE test;");
    }
}
...