Talend ESB: Tests unitaires de vos routes avec JUnit et Maven

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.

  • Un exemple de classe de test est disponible ici
  • Un POM d’exemple est disponible ici

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 😉

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> 

Petit calcul pour valider votre commentaire! merci * Time limit is exhausted. Please reload CAPTCHA.