Есть ли способ запустить MySQL в памяти для тестовых случаев JUnit? - PullRequest
55 голосов
/ 18 июля 2011

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

Ответы [ 6 ]

33 голосов
/ 05 января 2017

Самым простым способом использования базы данных в памяти, которая полностью совместима с 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

EDIT: У меня есть несколько подсказок к этому ответу: MariaDB4j, кажется, добавляет файлы во временную папку системы. Таким образом, он будет работать встроенным образом, что означает, что нет необходимости устанавливать что-либо, и вы можете просто использовать зависимость через желаемый инструмент сборки. Но это не настоящее решение только в памяти, и поэтому мы больше не можем говорить о модульных тестах, потому что модульные тесты не должны полагаться на файлы или базы данных

19 голосов
/ 04 января 2013

Мы используем 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 ​​преобразуется в вызов нового 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>

Вы также можете просто использовать dataSourcebean в jdbcTemplate и запускайте некоторые сценарии SQL таким образом или запускайте несколько сценариев MySQL, используя тег <jdbc:initialize-database...>.

3 голосов
/ 18 июля 2011

Это одна из причин, по которой использование проприетарных расширений SQL, как правило, не очень хорошая идея.

Я бы попытался определить места, где вы используете нестандартный SQL, и выполнить рефакторинг кода для перемещенияэти части для специализированных услуг.Затем вы можете сделать это при запуске юнит-тестов.

1 голос
/ 05 июня 2012

Вы можете смонтировать ramdrive (используя ImDisk), скопировать на него свои файлы данных и запустить службы Mysql после изменения соответствующей конфигурации в базах юнит-тестов my.cnf, как правило, небольшого размера (и для быстрого тестирования вы должны держать их небольшими)обычно они могут уместиться в ramdrive.

Вы также можете рассмотреть возможность использования транзакции в своих весенних тестах вместо пересоздания таблиц в каждом тесте.

Мы использовали это для нашей команды разработчиков, и это работало такОчарование, мы получили скорость на порядок.

1 голос
/ 18 июля 2011

Вы можете использовать другую схему для тестов JUnit.Если вы используете Spring, его расширения JUnit позволяют выполнять каждый тест в транзакции только для чтения, поэтому после тестов никакие данные не будут сохраняться в базе данных.Если вам нужны исходные данные для тестов, вы помещаете необходимые данные в помеченный @Before метод, который участвует в транзакции.

0 голосов
/ 18 июля 2011

попробуй http://hsqldb.org/, У меня нет опыта, но слышал хорошие вещи.

EDIT Извините - похоже, вам нужно удалить любой специфический для MySQL синтаксис ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...