Si créer des jobs ou des routes d’intégration est parfois simple, les tester est une autre paire de manches. Dans cet article, j’utiliserai le plugin Maven intégré dans le studio ainsi que le plugin Git pour créer et automatiser des tests unitaires. Nous verrons aussi comment intégrer le contexte de Talend avec les PropertyPlacholder de Camel.
Comment tester ?
C’est une question qui revient souvent, il n’y a pas vraiment de solution toute en un, ni d’outil dédié, Talend nous renvoie donc à nos classiques en nous recommandant de faire un projet maven dans la perspective java du studio
Pas un projet standard
Le souci c’est que cela sort un peu du cadre standard de Talend et de sa gestion de projets dans le dépôt de source, mais pas grave, même si vous utilisez SVN, rien ne vous empêche de le synchroniser manuellement même sur un dépôt Git, si vous utilisez une version communautaire sans le fameux plugin, je vous invite à relire mon précédent article sur l’ajout du plugin Git dans Talend.
Création du projet maven
Ajouter la perspective java dans le studio
Cliquez droit dans le volet package explorer puis faites new -> other
Choisir Maven Project
Sélectionner les deux premières options
Choisir un nom d’artefact qui sera aussi le nom de votre projet externe à Talend
Votre projet Maven est maintenant prêt
Création de la route Camel
Créer la route suivante, pour information mon projet se nomme Testing, les noms sont importants pour créer les classes de test et déterminer les dépendances requises.
Vous pouvez ajouter des composants cMock à la fin de vos routes pour tester les messages qui transitent.
Attention: J’utilise un composant cMock à titre d’exemple mais Apache Camel ne recommande pas d’ajouter des endpoints mock partout à la fin de vos routes, les échanges qui transitent sont conservés en mémoire pour répondre aux besoins des tests et peuvent saturer la JVM. Il faut privilégier les NotifyBuilder ou les AdviceWith.
Voici les options des composants cTimer et cSetBody pour ne transmettre qu’un seul message contenant la chaine de caractères « Hello »
Installer la route dans le dépôt Maven local
Vérifier dans les paramètres Maven que vous ne travaillez pas en mode offline
Rendez vous dans la perspective java et ajouter la vue navigator
Vérifier que le pom de votre route à tester existe, exemple pom_TestingCamel_0.1.xml, comme dit précédemment, il faut la lancer pour que Talend le génère.
Installer la route grâce à la phase install de Maven en cliquant droit sur le pom parent puis run as -> maven install
NB: Vous pouvez gagner en efficacité si vous sauvegardez une configuration qui poitera uniquement sur le pom correspondant à votre route avec l’option -f pom_TestingCamel_0.1.xml
Une fois cette opération effectuée, vous êtes prêt à créer des tests unitaires sur votre route.
Vous pouvez vérifier que tout est installé en allant voir dans le référentiel local
Créer une classe de test
Retourner dans la perspective java et ajouter la classe de test dans src/test/java
Clic droit puis New -> Class
Cliquez sur browse pour ajouter la superclasse Apache Camel de testing CamelTestSupport
Ajouter le code suivant:
package MAVENPROJECTNAME; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; import org.apache.camel.test.junit4.CamelTestSupport; import org.junit.Test; import PROJECTNAME.ROUTENAMEVERSION.ROUTENAME; public class BodyTest extends CamelTestSupport { @Override protected RouteBuilder createRouteBuilder() throws Exception { return new ROUTENAME(); } @Test public void testBody() throws InterruptedException { MockEndpoint m = getMockEndpoint("mock:cMock_1"); m.expectedBodiesReceived("Hello"); assertMockEndpointsSatisfied(); } @Test public void testBodyCount() throws InterruptedException { MockEndpoint m = getMockEndpoint("mock:cMock_1"); m.expectedMessageCount(1); assertMockEndpointsSatisfied(); } }
Adaptez le nom de votre projet et de votre route dans ce code ou les fichiers d’exemples.
Ajouter ensuite les dépendances nécessaires pour faire des tests, camel-core, camel-test, junit, la route camel et les routines.
Lancer les tests avec Maven
Depuis la perspective java; clic droit sur le pom du projet externe puis faites Run as -> Maven test
Voyez le résultat des deux tests dans la console
Les deux tests sont correctement réalisés, il s’agit de compter le nombre d’échange et de tester le contenu du corps du message.
Pour aller plus loin
Vous aurez peut être remarqué le message d’erreur « Could not find the context Default« , en effet le jar de votre route est installé dans le dépôt local sans les paramètres de contexte, vous me direz ok mais comment les ajouter et avoir la possibilité de changer de contexte lors du test ???
Pour ajouter le/les contexte(s) dans le jar installé, modifier le squelette du pom dans les propriétés du projet -> build -> Maven -> standalone job
<configuration> <includes> <include>${talend.job.path}/**/*.properties</include> </includes> </configuration>
Pour changer de contexte lors du lancement de la classe de test, modifiez l’appel de la méthode surchargée createRouteBuilder en ajoutant l’argument context via une HashMap.
@Override protected RouteBuilder createRouteBuilder() throws Exception { Map<String,String> args = new HashMap<String,String>(); args.put("context", "Default"); Route1 route = new Route1(); route.setArguments(args); return route; }
Vérifiez que les différents contextes ont été installé avec le jar
Conclusion
Avec très peu de paramétrage et l’utilisation de Maven de manière un peu plus intensive, il est très facile de créer des test unitaires, une connaissance du framework de test d’Apache Camel, comme tout framework de test qui se respecte est grandement recommandée 😉