Я просто пытаюсь добавить тестовые примеры для служб, обращающихся к базе данных MySQL, и хотел бы воссоздать всю схему (и для некоторых сценариев также просто использовать файл дампа MySQL с данными, необходимыми для каждого тестового примера). Я оглядывался вокруг и обнаружил, что некоторые ребята используют SQLite/H2 и другие, но я просто блуждаю, если есть какой-либо способ запустить MySQL в памяти, поэтому мне не нужно беспокоиться о чем-то конкретном для MySQL диалект, который я могу использовать на наших сервисах.
Есть ли способ запустить MySQL в памяти для тестов JUnit?
Ответ 1
Самый простой способ использования базы данных в памяти, которая полностью совместима с MySQL и может использоваться в тестовых примерах JUnit, - это imho MariaDB4j. вам просто нужна зависимость Gradle (/Maven) (http://search.maven.org/#search%7Cga%7C1%7Ca%3A%22mariaDB4j%22) и несколько строк кода для запуска:
DB database = DB.newEmbeddedDB(3306);
database.start();
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/test", "root", "");
скрипт запуска может быть включен через
database.source("path/to/resource.sql");
Дополнительная информация о GitHub readme: https://github.com/vorburger/MariaDB4j
ОБНОВЛЕНИЕ: У меня есть несколько подсказок к этому ответу: MariaDB4j, кажется, добавляет файлы во временную папку системы. Таким образом, он будет работать встроенным образом, что означает, что нет необходимости устанавливать что-либо, и вы можете просто использовать зависимость через желаемый инструмент сборки. Но это не настоящее решение только в памяти, и поэтому мы больше не можем говорить о модульных тестах, потому что модульные тесты не должны полагаться на файлы или базы данных.
Ответ 2
Мы используем MySQL и flyway для управления миграцией.
Для модульного тестирования и простых интеграционных тестов мы используем базу данных H2 в памяти с параметром MODE=MySQL
. Mode=MySQL
позволяет H2 DB обрабатывать большую часть диалекта MySQL.
Наш тестовый источник данных в конфигурации Spring настроен следующим образом:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" >
<property name="driverClassName" value="org.h2.Driver"/>
<property name="url" value="jdbc:h2:mem:testdb;MODE=MySQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE" />
</bean>
(Если вы не знаете Spring - XML преобразуется в вызов new BasicDataSource
, а затем вызовет setDriverClassName
и setUrl
в созданном экземпляре)
Затем мы используем Flyway на источнике данных для создания схемы и читаем, как если бы мы использовали обычную БД MySQL:
<bean id="flyway" class="com.googlecode.flyway.core.Flyway" init-method="migrate">
<property name="dataSource" ref="dataSource" />
<property name="cleanOnValidationError" value="false" />
<property name="initOnMigrate" value="true" />
<property name="sqlMigrationSuffix" value=".ddl" />
</bean>
Вы также можете просто использовать bean-компонент dataSource в jdbcTemplate и запускать некоторые сценарии SQL таким образом или запускать несколько сценариев MySQL, используя тег <jdbc:initialize-database...>
.
Ответ 3
Это одна из причин, почему использование проприетарных расширений SQL обычно не является хорошей идеей.
Я бы попытался определить места, где вы используете нестандартный SQL, и реорганизовать свой код, чтобы переместить эти части в выделенные службы. Затем вы можете издеваться над ними при выполнении модульных тестов.
Ответ 4
Вы можете использовать другую схему для тестов JUnit. Если вы используете Spring, его расширения JUnit позволяют каждому тесту работать в транзакции только для чтения, поэтому после тестирования данные не будут сохраняться в базе данных. Если вам нужны исходные данные для тестов, вы помещаете необходимые данные в @Before
отмеченный метод, который участвует в транзакции.
Ответ 5
Вы можете установить ramdrive (используя ImDisk), скопировать ваши файлы данных на него и запустить службы Mysql после изменения соответствующей конфигурации в my.cnf Unit test базы данных обычно небольшие (и вы должны держать их маленькими для быстрого тестирования), они могут нормально вписываться в ramdrive.
Вы также можете использовать транзакцию в своих тестах spring вместо того, чтобы перестраивать таблицы при каждом тестировании.
Мы использовали это для нашей команды разработчиков, и это сработало как шарм, мы получили скорость в скорости.
Ответ 6
попробуйте http://hsqldb.org/, у меня нет опыта с ним, но вы слышали хорошие вещи.
ИЗМЕНИТЬ Извините - похоже, вам нужно будет удалить любой специфичный для MySQL синтаксис...