<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Test on Java &amp; Moi</title><link>https://javaetmoi.com/tags/test/</link><description>Recent content in Test on Java &amp; Moi</description><generator>Hugo</generator><language>fr</language><lastBuildDate>Thu, 24 Mar 2016 07:36:23 +0000</lastBuildDate><atom:link href="https://javaetmoi.com/tags/test/feed.xml" rel="self" type="application/rss+xml"/><item><title>Génération de jeux de données Java</title><link>https://javaetmoi.com/2016/03/generation-jeux-donnees-java/</link><pubDate>Thu, 24 Mar 2016 07:36:23 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1553</guid><description>&lt;p&gt;Les &lt;strong&gt;jeux de données&lt;/strong&gt; font partie intégrante des tests. Elaborer un jeu de données demande une &lt;strong&gt;connaissance fonctionnelle&lt;/strong&gt;, aussi bien sur la nature des données que sur le scénario de test envisagé. Utiliser des jeux de &lt;strong&gt;données&lt;/strong&gt; &lt;strong&gt;réalistes&lt;/strong&gt; participe à la compréhension du &lt;strong&gt;scénario de test&lt;/strong&gt; et, donc, à sa documentation.
S’il vous était possible de &lt;strong&gt;générer&lt;/strong&gt; ces fameux jeux de données, seriez-vous intéressés ?C’est précisément l’objet de ce billet et d’un modeste &lt;strong&gt;outil&lt;/strong&gt; baptisé &lt;strong&gt;JavaBean Marshaller&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="artist"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2016/03/artist.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Tester unitairement une application Java</title><link>https://javaetmoi.com/2016/02/tester-unitairement-application-java/</link><pubDate>Fri, 12 Feb 2016 07:06:01 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1519</guid><description>&lt;p&gt;Un récent 13-14 m’a donné l’occasion de partager ma vision des &lt;strong&gt;tests unitaires&lt;/strong&gt; avec mes collègues, qu’ils soient &lt;strong&gt;développeurs Java&lt;/strong&gt; ou &lt;strong&gt;chefs de projet&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Au cours de cette présentation, j’ai essayé de répondre à des questions qui font régulièrement débat : &lt;em&gt;« Qu’est-ce qu’un test unitaire ? A quoi çà sert ? Que dois-je tester ? »&lt;/em&gt;. Tester n’est pas facile. Cela demande un apprentissage. Heureusement, il existe des &lt;strong&gt;bonnes pratiques&lt;/strong&gt; et des outils. J’y ai notamment présenté ceux faisant parti de notre stack technique : &lt;strong&gt;JUnit&lt;/strong&gt;, &lt;strong&gt;Mockito&lt;/strong&gt;, &lt;strong&gt;DbUnit&lt;/strong&gt; et &lt;strong&gt;Spring Test&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Spring Core 4.2 Certification Mock Exam</title><link>https://javaetmoi.com/2016/01/spring-core-4-2-certification-mock-exam/</link><pubDate>Mon, 18 Jan 2016 07:05:32 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1508</guid><description>&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="spring-pro-cert"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2016/01/spring-pro-cert.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
Four years ago, I’ve published a first &lt;a href="http://javaetmoi.com/2012/02/core-spring-3-0-certification-mock-exam/"&gt;mock exam for the Spring Core 3.0 Certification&lt;/a&gt;. Encouraged by Michael and Alan, I’ve updated this &lt;strong&gt;free&lt;/strong&gt; &lt;strong&gt;mock exam&lt;/strong&gt; for the &lt;a href="http://pivotal.io/academy#certification"&gt;Spring Professional certification based on the Spring Core 4.2 course&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;According to the &lt;a href="wp-content/uploads/2016/01/Core-Spring-4.2-Certification-Study-Guide.pdf"&gt;Core Spring 4.2 Certification Study Guide&lt;/a&gt;, 3 new topics have been added to the &lt;strong&gt;Spring Core 4.2 mock exam&lt;/strong&gt;: &lt;strong&gt;REST&lt;/strong&gt;, &lt;strong&gt;Microservices&lt;/strong&gt; and &lt;strong&gt;Spring Cloud&lt;/strong&gt;. They replace older topics: JMX, JMS and Remoting.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="spring-pro-cert"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2016/01/spring-pro-cert.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Démystifier l’annotation @SessionAttributes de Spring MVC</title><link>https://javaetmoi.com/2014/10/annotation-sessionattributes-modelattribute-spring-mvc/</link><pubDate>Tue, 14 Oct 2014 04:53:33 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1216</guid><description>&lt;a href="wp-content/uploads/2014/05/logo-spring-highres.png"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="logo-spring-highres"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2014/05/logo-spring-highres.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt; Le développement d’applications web requière une vigilance toute particulière quant à l’utilisation de la &lt;strong&gt;session web&lt;/strong&gt;. Spring MVC offre les mécanismes permettant aux développeurs de ne plus manipuler directement l’objet &lt;strong&gt;&lt;em&gt;HttpSession&lt;/em&gt;&lt;/strong&gt; mis à disposition par le conteneur web. Les 2 annotations &lt;strong&gt;&lt;em&gt;@Scope(&amp;ldquo;session&amp;rdquo;)&lt;/em&gt;&lt;/strong&gt; et &lt;strong&gt;&lt;em&gt;@SessionAttributes&lt;/em&gt;&lt;/strong&gt; en font parties. Dans ce billet, je vous expliquerai &lt;strong&gt;le fonctionnement de l’annotation &lt;em&gt;@SessionAttributes&lt;/em&gt;&lt;/strong&gt; qu’il est essentiel de maitriser avant d’utiliser. Nous verrons qu’elle fonctionne de pair avec l’annotation &lt;strong&gt;&lt;em&gt;@ModelAttribute&lt;/em&gt;&lt;/strong&gt; et qu’elle permet de simuler une &lt;strong&gt;portée conversation&lt;/strong&gt;. Nous commencerons cet article par rappeler ce qu’est &lt;strong&gt;un modèle&lt;/strong&gt; et nous le terminerons en &lt;strong&gt;testant&lt;/strong&gt; &lt;strong&gt;unitairement&lt;/strong&gt; du code qui utilise &lt;em&gt;@SessionAttributes&lt;/em&gt;.</description></item><item><title>Tester le code JavaScript de vos webapp Java</title><link>https://javaetmoi.com/2014/03/tester-code-javascript-webapp-java/</link><pubDate>Tue, 04 Mar 2014 09:27:15 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=995</guid><description>&lt;p&gt;&lt;a href="wp-content/uploads/2014/03/tester-code-javascript-webapp-logo.png"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="tester-code-javascript-webapp-logo"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2014/03/tester-code-javascript-webapp-logo.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt; Vous développez une &lt;strong&gt;application web&lt;/strong&gt; en &lt;strong&gt;Java&lt;/strong&gt;. Le couche présentation est assurée typiquement par un &lt;strong&gt;framework MVC&lt;/strong&gt; situé côté &lt;strong&gt;serveur&lt;/strong&gt; : Spring MVC, Struts 2, Tapestry ou bien encore JSF. Votre projet est parfaitement industrialisé : infrastructure de build sous maven, intégration continue, tests unitaires, tests Selenium, analyse qualimétrique via Sonar.&lt;/p&gt;
&lt;p&gt;A priori, vous n’avez rien à envier à la richesse grandissante de l’écosystème JavaScript, de l’outillage et des frameworks MV* côté clients. Et pourtant, quelque chose vous manque cruellement. En effet, depuis que RIA et Ajax se sont imposés, votre application Java contient davantage de code JavaScript qu’il y’a 10 ans. S’appuyant sur des librairies telles que jQuery ou Underscore, ce code JavaScript est typiquement embarqué dans votre &lt;strong&gt;WAR&lt;/strong&gt;. Pour le valider, les développeurs doivent démarrer leur conteneur web et accéder à l’écran sur lequel le code est utilisé. Firebug ou Chrome sont alors vos meilleurs amis pour la mise au point du script.&lt;/p&gt;
&lt;p&gt;Ce code JavaScript n’est généralement pas documenté. Le tester manuellement demande du temps. Les modifications sont sources d’erreur. Tout changement est donc périlleux. Si, à l’instar de vos tests JUnit pour vous classes Java, vous disposiez de &lt;strong&gt;tests JavaScript&lt;/strong&gt;, vous en seriez comblés. Or, c’est précisément ce qu’il vous manque. Et c’est là où &lt;strong&gt;Jasmine&lt;/strong&gt; et &lt;strong&gt;son plugin maven&lt;/strong&gt; viennent à votre rescousse.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="tester-code-javascript-webapp-logo"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2014/03/tester-code-javascript-webapp-logo.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Développer et industrialiser une web app avec AngularJS</title><link>https://javaetmoi.com/2014/02/developper-industrialiser-web-app-recherche-angularjs/</link><pubDate>Sun, 09 Feb 2014 19:13:56 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=898</guid><description>&lt;p&gt;Au travers du billet &lt;a href="https://github.com/angular/angular-seed/blob/master/README.md"&gt;Elastifiez la base MusicBrainz sur OpenShift&lt;/a&gt;, je vous ai expliqué comment indexer dans &lt;strong&gt;Elasticsearch&lt;/strong&gt; et avec &lt;strong&gt;Spring Batch&lt;/strong&gt; l’encyclopédie musicale &lt;strong&gt;MusicBrainz.&lt;/strong&gt; L’index avait ensuite été déployé sur le Cloud &lt;strong&gt;OpenShift&lt;/strong&gt; de RedHat.&lt;br&gt;Une application HTML 5 était mise à disposition pour consulter les albums de musique ainsi indexés. Pour m’y aider, &lt;a href="https://twitter.com/lucianprecup"&gt;Lucian Precup&lt;/a&gt; m’avait autorisé à adapter l’application qu’il avait mise au point pour l’atelier &lt;a href="http://agenda2013.scrumday.fr/event/149"&gt;Construisons un moteur de recherche&lt;/a&gt; de la conférence Scrum Day 2013.&lt;br&gt;Afin d’approfondir mes connaissances de l’ &lt;strong&gt;écosystème JavaScript,&lt;/strong&gt; je me suis amusé à recoder cette &lt;strong&gt;application front-end&lt;/strong&gt; en partant de zéro. Ce fut l’occasion d’adopter les meilleures pratiques en vigueur : framework JavaScript MV*, outils de builds, tests, qualité du code, packaging …&lt;br&gt;Au travers de ce article, je vous présenterai comment :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Mettre en place un projet Anguler à l’aise d’ &lt;strong&gt;Angular Seed&lt;/strong&gt;, &lt;strong&gt;Node.js&lt;/strong&gt; et &lt;strong&gt;Bower&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Développer en full &lt;strong&gt;AngularJS&lt;/strong&gt; et &lt;strong&gt;Angular UI Bootstrap&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Utiliser le framework &lt;strong&gt;elasticsearch-js&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Internationaliser&lt;/strong&gt; une application Angular&lt;/li&gt;
&lt;li&gt;Tester unitairement et fonctionnellement une application JS avec &lt;strong&gt;Jasmine&lt;/strong&gt; et &lt;strong&gt;Karma&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Analyser du code source JavaScript avec &lt;strong&gt;jshint&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Packager avec &lt;strong&gt;Grunt&lt;/strong&gt; le livrable à déployer&lt;/li&gt;
&lt;li&gt;Utiliser l’ &lt;strong&gt;usine de développement&lt;/strong&gt; JavaScript disponible sur le Cloud : Travis CI, Coversall.io et David&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Le code source de l’application est bien entendu &lt;a href="https://github.com/arey/angular-musicbrainz"&gt;disponible sur GitHub&lt;/a&gt; et &lt;a href="http://angular-musicbrainz.javaetmoi.com/"&gt;testable en ligne&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Angular MusicBrainz web app screenshot"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2014/02/angular-musicbrainz-screenshot.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>DbSetup, une alternative à DbUnit</title><link>https://javaetmoi.com/2013/09/dbsetup-spring-test-vs-dbunit/</link><pubDate>Fri, 06 Sep 2013 16:46:25 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=757</guid><description>&lt;p&gt;Lors du développement de &lt;strong&gt;tests d’intégration&lt;/strong&gt;, j’ai récemment eu besoin de charger une base de données à l’aide de jeux de données. Pour écrire mon premier test, j’ai simplement commencé par écrire un fichier SQL. En un appel de méthode (JdbcTestUtils::executeSqlScript) ou une ligne de déclaration XML (&amp;lt;jdbc:script location=&amp;quot;&amp;quot; /&amp;gt;), Spring m’aidait à charger mes données.&lt;br&gt;Pour tous ceux qui se sont déjà prêtés à l’exercice, maintenir des jeux de données est relativement fastidieux, qui plus en SQL. Cette solution n’était donc pas pérenne.&lt;/p&gt;
&lt;p&gt;Depuis une dizaine d’années, j’utilise régulièrement &lt;a href="http://www.dbunit.org/"&gt;DbUnit&lt;/a&gt; pour tester la couche de persistance des applications Java sur lesquelles j’interviens, qu’elle soit développée avec JDBC, Hibernate ou bien encore JPA. Cette librairie open source est également très appréciable pour tester unitairement des procédures stockées manipulant des données par lot. Pour mon besoin, j’aurais donc pu naturellement me tourner vers cet outil qui a fait ses preuves et dont je suis familier.&lt;/p&gt;
&lt;p&gt;Mais voilà, commençant à apprécier les avantages de la configuration en Java offerte par Spring et les &lt;strong&gt;APIs fluides&lt;/strong&gt; des frameworks FestAssert ou ElasticSearch utilisés sur l’application, l’idée d’ &lt;strong&gt;écrire des jeux de données en Java&lt;/strong&gt; me plaisait bien. Et justement, il y’a quelques temps, l’argumentaire de l’article &lt;a href="http://dbsetup.ninja-squad.com/approach.html"&gt;Why use DbSetup?&lt;/a&gt; ne m’avait pas laissé indifférent. C’était donc l’occasion d’utiliser cette jeune librairie développée par &lt;a href="http://ninja-squad.fr/team"&gt;les français de Ninja Squad&lt;/a&gt; et qui mérite de se faire connaitre, j’ai nommé &lt;strong&gt;&lt;a href="http://dbsetup.ninja-squad.com/"&gt;DbSetup&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Le &lt;a href="http://dbsetup.ninja-squad.com/user-guide.html"&gt;guide utilisateur de DbSetup&lt;/a&gt; étant particulièrement bien conçu, l&amp;rsquo;objectif de cet article n’est pas de vous en faire une simple traduction, mais de vous donner envie de l’essayer et de vous présenter la manière dont je l’ai mis en oeuvre. Celle-ci s’éloigne en effet quelque peu de celle présentée dans la documentation, la faute à mes vieux réflexes d’utilisateur de DbUnit et au bienheureux &lt;strong&gt;&lt;a href="http://xunitpatterns.com/Transaction%20Rollback%20Teardown.html"&gt;rollback pattern&lt;/a&gt;&lt;/strong&gt; de Spring.&lt;br&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="test-database"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2013/09/test-database.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Rendez autonomes vos Selenium</title><link>https://javaetmoi.com/2013/06/selenium-robuste-car-autonome/</link><pubDate>Sat, 22 Jun 2013 13:29:03 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=707</guid><description>&lt;p&gt;De nos jours, l’utilisation d’un serveur d’ &lt;strong&gt;intégration continue&lt;/strong&gt; pour déployer son application puis exécuter ses &lt;strong&gt;tests &lt;a href="http://seleniumhq.org/"&gt;Selenium&lt;/a&gt;&lt;/strong&gt; s’est relativement démocratisée. Néanmoins, l’investissement réalisé pour l’écriture de ces tests peut rapidement être mis à mal par le coût associé à leur maintenance. En effet, les tests d’IHM sont de nature plus &lt;strong&gt;instables&lt;/strong&gt; que de simples tests unitaires. Outre des problématiques de rendu et de transversalité des fonctionnalités testées, l’une des principales difficultés réside dans la &lt;strong&gt;répétabilité des tests&lt;/strong&gt;. Les &lt;strong&gt;données de test&lt;/strong&gt; y jouent pour beaucoup. Cette difficulté est décuplée lorsque votre application repose sur une &lt;strong&gt;architecture SOA&lt;/strong&gt; dont les services SOAP, XML ou bien REST sont hébergés par des tiers : vous n’avez aucune maitrise sur les données de l’environnement testé, ni sur sa stabilité.
Des tests qui échouent régulièrement à cause de données ayant été modifiées rendent laborieuse la détection de véritables &lt;strong&gt;régressions&lt;/strong&gt;.
Cet article propose une solution appliquée depuis 2 ans sur une application de taille modeste (35 000 LOC pour 20 écrans).&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Automatisation de lexécition de tests Selenium autonomes"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2013/06/deploiement-tests-selenium-autonomes.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Parallélisation de traitements batchs</title><link>https://javaetmoi.com/2012/12/parallelisation-de-traitements-batchs-spring-batch/</link><pubDate>Sat, 01 Dec 2012 17:54:55 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=368</guid><description>&lt;h2 id="contexte"&gt;Contexte&lt;/h2&gt;
&lt;p&gt;Récemment, j’ai participé au développement d’un batch capable d’indexer dans le moteur de recherche &lt;a href="http://www.elasticsearch.org/"&gt;Elasticsearch&lt;/a&gt; des données provenant d’une &lt;strong&gt;base de données&lt;/strong&gt; tierce. Développé en Java, ce batch s’appuie sur &lt;a href="http://static.springsource.org/spring-batch/"&gt;Spring Batch&lt;/a&gt;, le plus célèbre framework de traitements par lot de l’écosystème Java&lt;br&gt;Plus précisément, ce batch est décomposé en 2 jobs Spring Batch, très proches l’un de l’autre :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;le premier est capable d’initialiser à partir de zéro le moteur de recherche&lt;/li&gt;
&lt;li&gt;et le second traite uniquement les mouvements quotidiens de données.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="problématique"&gt;Problématique&lt;/h2&gt;
&lt;p&gt;Au cours du traitement batch, l’exécution de la requête par Oracle pour préparer son &lt;strong&gt;curseur&lt;/strong&gt; a été identifiée comme l’opération la plus couteuse, loin devant la lecture des enregistrements en &lt;strong&gt;streaming&lt;/strong&gt; à travers le réseau, leur traitement chargé de construire les documents Lucene à indexer ou leur &lt;strong&gt;écriture en mode&lt;/strong&gt; bulk dans ElasticSearch. A titre d’exemple, sur des volumétries de production, la préparation côté serveur Oracle d’une requête SQL ramenant 10 millions d’enregistrement peut mettre jusqu’à 1h30.&lt;/p&gt;
&lt;p&gt;Avec pour objectif que le batch passe &lt;strong&gt;sous le seuil de 2h&lt;/strong&gt; à moindre coût, 2 axes d’optimisations ont été étudiés : diminuer le temps d’exécution par Oracle et diminuer le temps de traitement.&lt;/p&gt;
&lt;h2 id="solutions-étudiées"&gt;Solutions étudiées&lt;/h2&gt;
&lt;p&gt;Les optimisations d’un DBA consistant à utiliser des &lt;strong&gt;tables temporaires&lt;/strong&gt; et des &lt;strong&gt;procédures stockées&lt;/strong&gt; n’ont pas été concluantes : trop peu de gains (10 à 20%) pour une réécriture partielle de notre batch, et avec le risque d’engendrer des régressions.&lt;/p&gt;
&lt;p&gt;Après mesures et calculs, l’utilisation de la &lt;strong&gt;pagination&lt;/strong&gt; sur des plages de 100, de 1 000 ou même de 10 000 enregistrements a également été écartée. Dans notre contexte, cela aurait dégradé les performances. Le choix de rester sur l’utilisation d’un &lt;strong&gt;curseur JDBC&lt;/strong&gt; a été maintenu.&lt;br&gt;A cette occasion, nous avons remarqué que les temps de mise en place d’un curseur Oracle pour préparer 1 millions ou 10 millions d’enregistrements étaient du même ordre de grandeur.&lt;/p&gt;
&lt;p&gt;Utilisant déjà l’une des techniques proposées par Spring Batch pour paralléliser notre traitement batch, pourquoi ne pas refaire appel à ses loyaux services ?&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Modèle physique de données des tables MASTERPIECE, MUSIC_ALBUM et MOVIE"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2012/11/Parall%C3%A9lisationTraitementsBatch_MPD.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Générer des tests JMeter à partir de Selenium</title><link>https://javaetmoi.com/2012/05/generer-tests-jmeter-selenium/</link><pubDate>Sat, 26 May 2012 18:51:06 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=166</guid><description>&lt;p&gt;Chez mon client, des &lt;strong&gt;tests de stress&lt;/strong&gt; sont réalisés sur toute nouvelle version d’une application. Outre le fait de &lt;strong&gt;qualifier techniquement&lt;/strong&gt; l’environnement de pré-production, ces tirs permettent de &lt;strong&gt;détecter toute&lt;/strong&gt; &lt;strong&gt;dégradation&lt;/strong&gt; des performances et de &lt;strong&gt;prévenir toute montée en charge&lt;/strong&gt; induite, par exemple, par une nouvelle fonctionnalité. Plus encore, ils permettent de mesurer les gains apportés par d’éventuelles optimisations. Ces tests de stress sont réalisés à l’aide de l’outil &lt;a href="http://jmeter.apache.org/"&gt;Apache JMeter&lt;/a&gt; [1].&lt;/p&gt;
&lt;p&gt;Afin de pouvoir &lt;strong&gt;comparer des mesures&lt;/strong&gt;, les cas fonctionnels utilisés lors des tests doivent, dans la mesure du possible, être identiques aux précédents tirs, sachant que ces derniers peuvent dater de plusieurs mois. Entre temps, nombre d’évolutions ont été susceptibles de casser vos tests JMeter. A priori, vous avez donc 2 choix : soit vous les réécrivez, soit vous les maintenez à jour. Si vous en avez déjà écrit, vous vous doutez bien que maintenir dans la durée des tests JMeter a un cout non négligeable. Une 3ième solution présentée ici consiste à la générer !&lt;/p&gt;
&lt;p&gt;J’ai la chance de travailler dans une équipe ou l’outil &lt;a href="https://selenium.dev/"&gt;Selenium&lt;/a&gt; [2] de tests IHM est rentré dans les mœurs. L’automatisation de leur exécution y joue un rôle indéniable. Notre hiérarchie s’est fortement impliquée ; elle a investi de l’énergie et du budget. Un DSL a été mis au point pour faciliter leur écriture et leur maintenance. Alors quand on peut les rentabiliser encore davantage, autant le faire. J’ai donc proposé de ne maintenir que les tests Selenium et de &lt;strong&gt;générer les tests JMeter à partir de tests Selenium&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Cet article a pour objectif de vous présenter la démarche adoptée. Si vous êtes intéressés, vous pourrez librement l’adapter en fonction de votre contexte projet.&lt;/p&gt;
&lt;h2 id="les-outils-à-disposition"&gt;Les outils à disposition&lt;/h2&gt;
&lt;h3 id="serveur-proxy-http-de-jmeter"&gt;Serveur Proxy HTTP de JMeter&lt;/h3&gt;
&lt;p&gt;Le client lourd JMeter offre la possibilité d&amp;rsquo; &lt;strong&gt;enregistrer toutes les requêtes HTTP&lt;/strong&gt; transitant entre le navigateur et l’application web à tester. Techniquement, il utilise le mécanisme de &lt;strong&gt;proxy HTTP&lt;/strong&gt;. Le navigateur est configuré pour utiliser le Serveur Proxy HTTP créé dans le Plan de Travail JMeter. Couplé à un &lt;strong&gt;Contrôleur Enregistreur&lt;/strong&gt;, le proxy enregistre les appels avant de les router vers le serveur d’application cible.&lt;/p&gt;
&lt;p&gt;Le tutoriel &lt;a href="http://jakarta.apache.org/jmeter/usermanual/jmeter_proxy_step_by_step.pdf"&gt;Proxy step by step&lt;/a&gt; [3] proposé sur le site de JMeter fournit toutes les étapes nécessaires pour configuration JMeter.&lt;/p&gt;
&lt;h3 id="du-code-source"&gt;Du code source&lt;/h3&gt;
&lt;p&gt;Le fichier .jmx généré lors de l’enregistrement va devoir être manipulé en Java (bien oui, vous êtes sur le blog d’un développeur java). Premier soulagement : il est au format XML et peut donc être aisément parsé une fois son schéma appréhendé. Mails là où il est intéressant d’avoir opté pour un outil open source, c’est que nous allons pouvoir utiliser son API Java pour manipuler les fichiers .jmx de description de plan de tests. Et pour mieux cerner l’API, l’accès au code source est précieux.&lt;/p&gt;
&lt;p&gt;Lors de la mise au point du générateur, les artefacts maven de la version 2.5.1 n’étaient pas disponibles sur le repo central maven, chose révolue depuis la version 2.6. JMeter est découpé en plusieurs modules. Dans le cadre du générateur, les modules Core, HTTP set Components ont été nécessaires. Sans oublier &lt;strong&gt;jorphan&lt;/strong&gt;, dont le package &lt;em&gt;collections&lt;/em&gt; offre toutes les API nécessaires pour naviguer dans l’arbre du Plan de Tests.&lt;/p&gt;
&lt;p&gt;Par transitivité, il est possible de récupérer tous les artefacts nécessaires en déclarant les dépendances maven suivantes :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-xhtml" data-lang="xhtml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;dependency&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;groupId&lt;/span&gt;&amp;gt;org.apache.jmeter&amp;lt;/&lt;span style="color:#f92672"&gt;groupId&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;artifactId&lt;/span&gt;&amp;gt;ApacheJMeter_http&amp;lt;/&lt;span style="color:#f92672"&gt;artifactId&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;version&lt;/span&gt;&amp;gt;2.6&amp;lt;/&lt;span style="color:#f92672"&gt;version&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;dependency&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;dependency&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;groupId&lt;/span&gt;&amp;gt;org.apache.jmeter&amp;lt;/&lt;span style="color:#f92672"&gt;groupId&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;artifactId&lt;/span&gt;&amp;gt;jorphan&amp;lt;/&lt;span style="color:#f92672"&gt;artifactId&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;version&lt;/span&gt;&amp;gt;2.6&amp;lt;/&lt;span style="color:#f92672"&gt;version&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;dependency&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="mise-en-œuvre"&gt;Mise en œuvre&lt;/h2&gt;
&lt;p&gt;Afin de pouvoir être rejoué, &lt;strong&gt;un scénario de test Selenium enregistré à l’état brut&lt;/strong&gt; par le proxy JMeter &lt;strong&gt;doit être épuré&lt;/strong&gt;, &lt;strong&gt;retravaillé&lt;/strong&gt; et &lt;strong&gt;variabilisé&lt;/strong&gt;. C’est d’ailleurs toute la plus-value apportée par le générateur.&lt;/p&gt;
&lt;h3 id="template-de-test"&gt;Template de test&lt;/h3&gt;
&lt;p&gt;Une première étape consiste à insérer le contenu du « fichier brut » (c’est-à-dire tous les éléments de tests enregistrés sous le &lt;em&gt;Contrôleur Enregistreur&lt;/em&gt;) dans ce que j’appellerai un &lt;strong&gt;template de test&lt;/strong&gt;.
Réutilisable, ce template contient toutes les caractéristiques d’un test de stress type. Voici quelques-unes de ses composantes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Contrôleur de Transaction&lt;/em&gt; dans lequel insérer par programmation tous les éléments de tests enregistrés&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Variables pré-définies&lt;/em&gt; : host et port de l’environnement à tester, délai de réflexion, durée maximum attendue de chargement d’une page&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Gestionnaire d’entêtes HTTP&lt;/em&gt;, par exemple avec le user-agent d’IE 8 si ce dernier est cible&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Gestionnaires de Cookies&lt;/em&gt; http&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Gestionnaire de&lt;/em&gt; &lt;em&gt;Cache HTTP&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Chargement des comptes utilisateurs (par exemple à partir d’un fichier CSV)&lt;/li&gt;
&lt;li&gt;Logique du test de stress, par exemple à l’aide d’un &lt;em&gt;Groupes d’Unités&lt;/em&gt; configuré pour un test aux limites&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Compteur de temps fixe&lt;/em&gt; pour simuler le « Think Time » des utilisateurs&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="traitement-des-données-brutes"&gt;Traitement des données brutes&lt;/h3&gt;
&lt;p&gt;La seconde étape consiste à implémenter les « &lt;strong&gt;processeurs&lt;/strong&gt; » chargés de traiter les éléments de tests enregistrés par le proxy JMeter.
A titre d’exemples, voici les traitements effectués par le générateur mis en œuvre dans le cadre d’une application JSF / RichFaces :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Variabilise le paramètre javax.faces.ViewState renvoyé dans les pages JSF&lt;/li&gt;
&lt;li&gt;Retire le nom et l&amp;rsquo;adresse IP du serveur web de chaque requête HTTP&lt;/li&gt;
&lt;li&gt;Supprime toutes les URL contenant des ressources vers selenium-server (ex:&lt;/li&gt;
&lt;li&gt;http://localhost:3333/selenium-server/core/selenium.css)&lt;/li&gt;
&lt;li&gt;Variabilise les paramètres d’authentification SSO&lt;/li&gt;
&lt;li&gt;Supprime tous les gestionnaires d&amp;rsquo;en-tête HTTP enregistrés par le proxy JMeter afin d’utiliser le gestionnaire global déclaré dans le template de test&lt;/li&gt;
&lt;li&gt;Regroupe tous les appels vers la même page JSF dans même un sous-contrôleur de transaction&lt;/li&gt;
&lt;li&gt;Supprime tous les appels vers des sites externes (ex : Google Analytics)&lt;/li&gt;
&lt;li&gt;Améliore la lisibilité des éléments de tests en les renommant&lt;/li&gt;
&lt;li&gt;Ajoute une assertion sur le temps d&amp;rsquo;exécution d&amp;rsquo;une requête&lt;/li&gt;
&lt;li&gt;Ajoute une assertion faisant échouer le test JMeter lorsque l&amp;rsquo;utilisateur est redirigé sur une page d&amp;rsquo;erreur technique de l’application&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Afin d’illustrer cet article et de le rendre plus concret, voici un exemple de processeur :&lt;/p&gt;
&lt;p&gt;Chez mon client, des &lt;strong&gt;tests de stress&lt;/strong&gt; sont réalisés sur toute nouvelle version d’une application. Outre le fait de &lt;strong&gt;qualifier techniquement&lt;/strong&gt; l’environnement de pré-production, ces tirs permettent de &lt;strong&gt;détecter toute&lt;/strong&gt; &lt;strong&gt;dégradation&lt;/strong&gt; des performances et de &lt;strong&gt;prévenir toute montée en charge&lt;/strong&gt; induite, par exemple, par une nouvelle fonctionnalité. Plus encore, ils permettent de mesurer les gains apportés par d’éventuelles optimisations. Ces tests de stress sont réalisés à l’aide de l’outil &lt;a href="http://jmeter.apache.org/"&gt;Apache JMeter&lt;/a&gt; [1].&lt;/p&gt;
&lt;p&gt;Afin de pouvoir &lt;strong&gt;comparer des mesures&lt;/strong&gt;, les cas fonctionnels utilisés lors des tests doivent, dans la mesure du possible, être identiques aux précédents tirs, sachant que ces derniers peuvent dater de plusieurs mois. Entre temps, nombre d’évolutions ont été susceptibles de casser vos tests JMeter. A priori, vous avez donc 2 choix : soit vous les réécrivez, soit vous les maintenez à jour. Si vous en avez déjà écrit, vous vous doutez bien que maintenir dans la durée des tests JMeter a un cout non négligeable. Une 3ième solution présentée ici consiste à la générer !&lt;/p&gt;
&lt;p&gt;J’ai la chance de travailler dans une équipe ou l’outil &lt;a href="https://selenium.dev/"&gt;Selenium&lt;/a&gt; [2] de tests IHM est rentré dans les mœurs. L’automatisation de leur exécution y joue un rôle indéniable. Notre hiérarchie s’est fortement impliquée ; elle a investi de l’énergie et du budget. Un DSL a été mis au point pour faciliter leur écriture et leur maintenance. Alors quand on peut les rentabiliser encore davantage, autant le faire. J’ai donc proposé de ne maintenir que les tests Selenium et de &lt;strong&gt;générer les tests JMeter à partir de tests Selenium&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Cet article a pour objectif de vous présenter la démarche adoptée. Si vous êtes intéressés, vous pourrez librement l’adapter en fonction de votre contexte projet.&lt;/p&gt;</description></item><item><title>Core Spring 3.0 Certification Mock Exam</title><link>https://javaetmoi.com/2012/02/core-spring-3-0-certification-mock-exam/</link><pubDate>Sun, 26 Feb 2012 16:22:40 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=18</guid><description>&lt;p&gt;Le &lt;strong&gt;framework Spring&lt;/strong&gt; est à l’honneur dans le premier article de ce tout jeune blog. En effet, début février j’ai eu l’opportunité de passer la &lt;strong&gt;&lt;a href="http://www.springsource.com/training/certification/springprofessional" title="SpringSource Certified Spring Professionnal"&gt;Certification Core Spring 3.0&lt;/a&gt;&lt;/strong&gt;. Et par ce billet, je tenais faire part de mon &lt;strong&gt;retour d’expérience&lt;/strong&gt; mais surtout vous offrir librement un &lt;strong&gt;examen blanc&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Comme pré-requis pour passer la certification, sachez tout d’abord qu’il est nécessaire de suivre la &lt;strong&gt;formation officielle de 4 jours&lt;/strong&gt; estampillée SpringSource. En France, elle est exclusivement assurée par le cabinet d’architecture Zenika. Mon formateur fut l’un de co-auteurs du très bon livre Spring par la Pratique.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Core Spring 3.0 Certification Mock Exam"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2012/02/CertitfiedSpring_Professional.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item></channel></rss>