Создание временной базы данных, которая работает на всех этапах тестирования?
Я присоединился к проекту, в котором много файлов с операторами SQL для создания базы данных, которая используется для интеграционного тестирования.
Мне интересно, как я могу использовать эти файлы для создания базы данных для модульного тестирования (с использованием Java и Maven).
Я могу создать базу данных HSQL в памяти для каждого модульного теста или даже использовать функцию встроенной базы данных spring jdbc, но в настройках теста так много операторов SQL, что они не масштабируются.
Поэтому я хотел бы создать временную базу данных (которая загружает операторы SQL) в начале фазы тестирования maven, иметь модульные тесты для доступа к этой временной базе данных и выполнять различные операции, а затем удалить временную базу данных в конце maven. фаза испытаний.
Я посмотрел на sql-maven-plugin, который позволил бы мне выполнять этапы тестирования, но я не уверен, как настроить временную базу данных, которая будет доступна во всех модульных тестах. Там нет сервера для подключения, и база данных в памяти не будет работать через несколько модульных тестов (я полагаю).
Одним из вариантов может быть использование уникального временного файла, например, указание URL-адреса драйвера JDBC в виде jdbc:hsqldb:file:/path/to/ временный / файл, но я не уверен, как создать уникальный временный файл в maven.
Любые предложения о том, как это сделать, или есть ли лучший подход?
Обновление: я решил использовать файловую базу данных, созданную в каталоге target / db. Я использую плагин maven clean для удаления каталога target / db до запуска тестов и плагин maven sql для создания базы данных из сценариев.
2 ответа
Для этого случая я создал плагин derby-maven-plugin. Он доступен в Maven Central, поэтому вам не нужно добавлять дополнительные репозитории или что-то еще.
Вы можете использовать это так:
<project ...>
<build>
<plugins>
<plugin>
<groupId>org.carlspring.maven</groupId>
<artifactId>derby-maven-plugin</artifactId>
<version>1.8</version>
<configuration>
<basedir>${project.build.directory}/derby</basedir>
<port>1527</port>
</configuration>
<executions>
<execution>
<id>start-derby</id>
<phase>pre-integration-test</phase>
<goals>
<goal>start</goal>
</goals>
</execution>
<execution>
<id>stop-derby</id>
<phase>post-integration-test</phase>
<goals>
<goal>stop</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Для получения дополнительной информации вы также можете проверить использование.
Почему бы не создать базу данных H2 на диске, чтобы каждый тест имел к ней доступ? Пока тесты не работают параллельно или не взаимодействуют друг с другом, вам не нужен сервер.
Тем более: просто создайте базы данных памяти в @Before и удалите их в @After. Вы уверены, что это слишком медленно?
В тесте перед интеграцией вы можете запустить сервер H2 (или derby) и завершить его в тесте после интеграции.
Вы можете написать плагин maven, который использует состояние сеанса для отслеживания встроенной службы базы данных, но это почти то же самое, что (3).