Подтвердить что ты не робот

Есть ли способ запустить MySQL в памяти для тестов JUnit?

Я просто пытаюсь добавить тестовые примеры для служб, обращающихся к базе данных MySQL, и хотел бы воссоздать всю схему (и для некоторых сценариев также просто использовать файл дампа MySQL с данными, необходимыми для каждого тестового примера). Я оглядывался вокруг и обнаружил, что некоторые ребята используют SQLite/H2 и другие, но я просто блуждаю, если есть какой-либо способ запустить MySQL в памяти, поэтому мне не нужно беспокоиться о чем-то конкретном для MySQL диалект, который я могу использовать на наших сервисах.

4b9b3361

Ответ 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 синтаксис...