Встроенный сервер MySQL для JUnit-тестирования.
При разработке программ, связанных с базами данных, обычно требуется подключение к серверу MySQL при модульном тестировании. Если над проектом работает несколько человек, можно либо создать общий тестовый сервер MySQL, доступный всем, либо настроить экземпляр на каждого разработчика в его среде разработки. Оба эти подхода могут быть неудобными для последующего обслуживания, поэтому лучше предоставить временную базу данных в памяти, подобную SQLite3 или H2, которая автоматически создаётся с нуля, заполняется тестовыми данными и очищается после выполнения тестов.
me.zzp/mysqld
использует mysql/mysql-connector-mxj
для реализации встроенного сервера MySQL. mysql-connector-mxj
упаковывает весь исполняемый файл MySQL в jar-файл (что делает его довольно большим), а затем распаковывает его во время выполнения в указанный каталог и запускает временный сервер MySQL через внешнюю программу.
<project>
...
<repositories>
<repository>
<id>zzp-mvn-repo</id>
<url>http://10.0.40.218</url>
</repository>
</repositories>
<dependencies>
...
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>me.zzp</groupId>
<artifactId>mysqld</artifactId>
<version>1.0.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.7</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Поскольку me.zzp/mysqld
зависит от slf4j-api
, необходимо предоставить реализацию slf4j
.
package me.zzp.mysql.file;
import me.zzp.mysqld.Mysqld;
import org.junit.AfterClass;
import org.junit.BeforeClass;
public class FooTest {
private static Mysqld mysql;
@BeforeClass
public static void setUpClass() {
mysql = Mysqld.start();
}
@AfterClass
public static void tearDownClass() {
mysql.close();
}
}
Запуск экземпляра MySQL осуществляется через Mysqld.start()
. Метод Mysqld::close()
закрывает базу данных и завершает процесс. Существует три формы метода start
:
start(String root, int port)
:
root
: путь к каталогу, где хранятся исполняемый файл и файлы данных MySQL.port
: порт базы данных.start(int port)
:
zzp.mysqld.root
, используется его значение, иначе используется значение по умолчанию для mysqld
.start()
:
zzp.mysqld.root
, используется его значение, иначе используется значение по умолчанию для mysqld
.zzp.mysqld.port
, используется его значение, иначе используется порт по умолчанию 3306.Путь, соответствующий root
, должен быть каталогом, который будет создан автоматически при отсутствии, поэтому необходимы права на запись. Порт, соответствующий port
, должен быть свободен, иначе запуск завершится неудачно.
По умолчанию JUnit запускает отдельный сервер MySQL для каждого теста и закрывает его после завершения. Это приводит к неэффективности из-за постоянного запуска и остановки серверов.
Используя плагин maven-surefire, можно избежать повторного запуска, запустив один общий экземпляр MySQL перед всеми тестами и закрыв его после их завершения. Настройка выполняется следующим образом:
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<configuration>
<properties>
<property>
<name>listener</name>
<value>me.zzp.mysqld.MysqldRunListener</value>
</property>
</properties>
<systemPropertyVariables>
<zzp.mysqld.root>mysqld</zzp.mysqld.root>
<zzp.mysqld.port>3306</zzp.mysqld.port>
</systemPropertyVariables>
</configuration>
</plugin>
</plugins>
</build>
</project>
Свойства zzp.mysqld.root
и zzp.mysqld.port
являются необязательными. Они имеют то же значение, что и свойства root
и port
.
После настройки тесты не требуют изменений кода. Выполнение mvn test
автоматически запускает все тесты.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )