La version 5.0.0-alpha4 a signé la fin du support du mode embedded d’Elasticsearch.
Cela a été annoncé là et la classe NodeBuilder permettant de démarrer un noeud programmatiquement a été supprimée.
Cependant, même si la raison de l’arrêt du support de ce mode est compréhensible, cela pose le problème des tests d’intégration puisqu’il n’est plus possible de démarrer un Elasticsearch pendant la phase de test.
Oui, Elastic propose officiellement une alternative via l’utilisation de ESIntegTestCase mais personnellement, je ne suis pas très fan de cette approche…
Cet article va tenter de dresser un panorama non exhaustif de ce que j’ai pu trouver d’intéressant pour permettre de réaliser des tests d’intégration avec Elasticsearch.
Parmi les solutions intéressantes et simples que j’ai trouvés pour faire des tests d’intégration, il y a surtout 2 projets que j’ai retenus.
Plugin maven permettant de télécharger, installer et démarrer Elasticsearch
Il s’agit d’un plugin maven s’appuyant sur maven-resolver qui permet sur les phases de pré-intégration et post-intégration de démarrer et d’arrêter Elasticsearch.
dependencies {
compile group: 'org.apache.logging.log4j', name: 'log4j-to-slf4j', version:'2.7'
compile group: 'org.slf4j', name: 'slf4j-api', version:'1.7.12'
compile group: 'ch.qos.logback', name: 'logback-classic', version:'1.1.3'
testCompile group: 'org.elasticsearch.client', name: 'transport', version:'5.4.3'
testCompile group: 'org.elasticsearch.client', name: 'rest', version:'5.4.3'
testCompile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version:'2.7.1'
testCompile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version:'2.7.1'
testCompile group: 'org.codehaus.jettison', name: 'jettison', version:'1.3.8'
testCompile group: 'org.assertj', name: 'assertj-core', version:'3.8.0'
testCompile group: 'junit', name: 'junit', version:'4.11'
compile(group: 'org.projectlombok', name: 'lombok', version:'1.16.6') {
/* This dependency was originally in the Maven provided scope, but the project was not of type war.
This behavior is not yet supported by Gradle, so this dependency has been converted to a compile dependency.
Please review and delete this closure when resolved. */
}
}
Contrairement à la solution précédente, ce projet permet programmatiquement de télécharger, installer et démarrer/arrêter Elasticsearch.
En outre, l’avantage de cette solution est qu’il n’est pas nécessaire de configurer la partie test d’intégration dans maven. Ainsi, utiliser un autre outils de build est possible.
dependencies {
compile group: 'org.apache.logging.log4j', name: 'log4j-to-slf4j', version:'2.7'
compile group: 'org.slf4j', name: 'slf4j-api', version:'1.7.12'
compile group: 'ch.qos.logback', name: 'logback-classic', version:'1.1.3'
testCompile group: 'pl.allegro.tech', name: 'embedded-elasticsearch', version:'2.2.0'
testCompile group: 'org.elasticsearch.client', name: 'transport', version:'5.4.3'
testCompile group: 'org.elasticsearch.client', name: 'rest', version:'5.4.3'
testCompile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version:'2.7.1'
testCompile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version:'2.7.1'
testCompile group: 'org.codehaus.jettison', name: 'jettison', version:'1.3.8'
testCompile group: 'org.assertj', name: 'assertj-core', version:'3.8.0'
testCompile group: 'junit', name: 'junit', version:'4.11'
compile(group: 'org.projectlombok', name: 'lombok', version:'1.16.6') {
/* This dependency was originally in the Maven provided scope, but the project was not of type war.
This behavior is not yet supported by Gradle, so this dependency has been converted to a compile dependency.
Please review and delete this closure when resolved. */
}
Conclusion
En conclusion, on a pu voir deux solutions qui permettent de faire des tests d’intégration avec Elasticsearch.
Personnellement, j’ai une préférence pour la deuxième solution qui me permet d’avoir la main sur la récupération et installation d’Elasticsearch.