組み込みMySQLを使ったユニットテスト

GitBucketがMySQLPostgreSQL対応したのでマイグレーションのテストをMySQLPostgreSQLで実行できるようにしたいなぁと思って方法を考えています。

テスト用のDBを立てたりDockerを使ったりするのが一般的な方法なのではないかと思いますが、Javaで利用可能な組み込みMySQLなんていうものも存在するようなので試してみました(以前@makingに教えてもらいました)。

github.com

使い方はとても簡単で、Mavenの依存関係を追加して

<dependency>
  <groupId>com.wix</groupId>
  <artifactId>wix-embedded-mysql</artifactId>
  <version>1.0.3</version>
  <scope>test</scope>
</dependency>

こんな感じで使えます。

MysqldConfig config = aMysqldConfig(v5_7_10)
  .withPort(3306)
  .withUser("root", "")
  .build();

EmbeddedMysql mysqld = anEmbeddedMysql(config)
  .addSchema("gitbucket")
  .start();

Connection conn = DriverManager.getConnection(
  "jdbc:mysql://localhost:3306/gitbucket", "root", "");
...

mysqld.stop();

初回実行時はプラットフォームに応じたMySQLバイナリをダウンロードしてくるのでめっちゃ時間がかかりますw ただ、設定もコードで制御できますし、Dockerとか別途整備しなくても使えるのはいいですね。

ちなみにMySQLの組み込み化には以下のツールを使っているようです。

github.com

MySQLの他にもこのツールを使ってMongoDB、Redis、Memcached、node.js、PostgreSQLを組み込み化するライブラリが存在するようです。また、これとは関係ないようですがMariaDBを組み込み化しているJavaライブラリもあったりします。

github.com

現状では自動テストでこういった外部のミドルウェアが必要な場合はやはりDockerを使うのが筋がいいとは思うのですが、状況によってはこれらのライブラリが有効な場合もあるのではないでしょうか。