その昔、ElasticsearchではEmbeddedモードという、アプリケーションに組み込んで使用したり、自動テストで使用するのに便利な機能がサポートされていました。しかし、この機能はElasticsearch 5.0でサポートされなくなってしまいました。詳しくはElastic社の以下のブログ記事に書かれていますが、Embeddedモードはセキュリティマネージャーや起動時のチェックなどをバイパスしてしまうなど様々な問題があったようです。
確かに理由はわからないでもないですが、とはいえ自動テストのためにはやはりEmbeddedモードのようなものがあると便利です。そこで利用できるのがelasticsearch-cluster-runnerというJavaライブラリです。
このライブラリを使うとElasticsearchクラスタをコードから制御することが可能になります。実際にelastic-scala-httpclientやAlpakka(のElasticsearchコネクタ)のテストでこのライブラリを使用してみましたが、非常に便利なものでした。
以下はJavaでのelasticsearch-cluster-runnerを使ったテストケースの例です。
public class ElasticsearchTest { private static ElasticsearchClusterRunner runner; @BeforeClass public static void setup() throws IOException { runner = new ElasticsearchClusterRunner(); runner.build(ElasticsearchClusterRunner.newConfigs() .baseHttpPort(9200) .numOfNode(1) .disableESLogger()); runner.ensureYellow(); } @AfterClass public static void teardown() throws Exception { runner.close(); runner.clean(); } ... }
この場合、ElasticsearchのRESTインターフェースはlocalhost:9201で起動します。見ての通り、ノード数を指定することもできるのでクラスタ環境でのテストも簡単に行うことができます。なお、elasticsearch-cluster-runnerは並列実行には対応していないので、テストで使用する場合は各テストをシリアルに実行する必要があるという点だけ注意が必要です。
JUnitなどでElasticsearchを使ったテストを行うにはうってつけのライブラリだと思いますので是非試してみていただければと思います。