{"id":879,"date":"2011-04-27T21:28:38","date_gmt":"2011-04-27T21:28:38","guid":{"rendered":"http:\/\/blog.milamberspace.net\/?p=879"},"modified":"2011-05-03T17:51:41","modified_gmt":"2011-05-03T17:51:41","slug":"integration-dun-test-jmeter-dans-hudson-avec-le-plugin-hudson-performance","status":"publish","type":"post","link":"https:\/\/blog.milamberspace.net\/index.php\/2011\/04\/27\/integration-dun-test-jmeter-dans-hudson-avec-le-plugin-hudson-performance-879.html","title":{"rendered":"Int\u00e9gration d&rsquo;un test JMeter dans Hudson avec le plugin Hudson Performance"},"content":{"rendered":"<p><a href=\"http:\/\/hudson-ci.org\/\">Hudson<\/a> est une plate-forme d&rsquo;int\u00e9gration continue, JMeter est un outil de test de charge et aussi de tests fonctionnels<em> (on a tendance \u00e0 l&rsquo;oublier, mais pour faire du test de charge, il faut savoir faire du test fonctionnel)<\/em>. Que diriez vous d&rsquo;int\u00e9grer dans Hudson l&rsquo;ex\u00e9cution d&rsquo;un test (de charge) JMeter, et d&rsquo;avoir un beau graphique pour voir l&rsquo;\u00e9volution des temps de r\u00e9ponses de votre application en fonction des &lsquo;builds&rsquo; Hudson \/ versions de votre application ?<\/p>\n<p>La r\u00e9ponse \u00e0 cette question est l&rsquo;objet de ce tutoriel.<!--more--><\/p>\n<p>Les pr\u00e9-requis\u00a0:<\/p>\n<ul>\n<li>Un serveur Hudson (le mien est sous Linux Debian)<\/li>\n<li>Un script JMeter pour tester une application ou tout autre chose que sait tester JMeter (voir les <a title=\"Tutoriels JMeter\" href=\"http:\/\/blog.milamberspace.net\/index.php\/jmeter-pages\">diff\u00e9rents tutoriels sur ce m\u00eame blog<\/a>)<\/li>\n<li><strong>Changer le format de sortie des r\u00e9sultats de JMeter (au lieux de CSV, passer en JTL (xml)), pour cela, modifier dans le fichier jmeter.properties, la proprit\u00e9 suivante : jmeter.save.saveservice.output_format=xml<\/strong><\/li>\n<li>L&rsquo;installation du plugin \u00ab\u00a0Hudson Performance plugin\u00a0\u00bb depuis le gestionnaire des plugins int\u00e9gr\u00e9 \u00e0 Hudson, cf. la capture ci-dessous.<\/li>\n<\/ul>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"Installation du plugin JMeter Performance dans Hudson\" src=\"\/wp-content\/images\/jmeter-34-hudson\/01_20110417_JMeter_integration_dans_Hudson_html_7cfc88d2.png\" alt=\"\" width=\"959\" height=\"595\" \/><\/p>\n<p>On va cr\u00e9er une nouvelle t\u00e2che dans Hudson (New Job).<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"Cr\u00e9ation d'une nouvelle t\u00e2che dasn Hudson\" src=\"\/wp-content\/images\/jmeter-34-hudson\/02_20110417_JMeter_integration_dans_Hudson_html_26467644.png\" alt=\"\" width=\"635\" height=\"409\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>On saisit un nom de t\u00e2che, puis on s\u00e9lectionne l&rsquo;option \u00ab\u00a0Build a free-style software project\u00a0\u00bb avant de clique sur le bouton <strong>OK.<\/strong><\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"Cr\u00e9ation du projet de build\" src=\"\/wp-content\/images\/jmeter-34-hudson\/03_20110417_JMeter_integration_dans_Hudson_html_3e22f302.png\" alt=\"\" width=\"624\" height=\"481\" \/><\/p>\n<p>Dans le formulaire de configuration de la t\u00e2che, dans la section <strong>Build<\/strong> on choisit l&rsquo;invocation d&rsquo;un script Ant.<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"Invocation script Ant dans Hudson\" src=\"\/wp-content\/images\/jmeter-34-hudson\/04_20110417_JMeter_integration_dans_Hudson_html_m534d64ff.png\" alt=\"\" width=\"540\" height=\"179\" \/><\/p>\n<p>Dans la configuration de l&rsquo;invocation de Ant, on saisit la cible \u00ab\u00a0all\u00a0\u00bb, et on ajoute dans les propri\u00e9t\u00e9s\u00a0:<\/p>\n<pre>jmeter.dir=\/var\/lib\/hudson\/jobs\/TestJMeter\/jakarta-jmeter-2.4.1<\/pre>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"Configuration de la t\u00e2che Ant\" src=\"\/wp-content\/images\/jmeter-34-hudson\/05_20110417_JMeter_integration_dans_Hudson_html_5e02afb2.png\" alt=\"\" width=\"765\" height=\"336\" \/><\/p>\n<p>Plus bas dans le formulaire de configuration de la t\u00e2che, on retrouve le plugin Performance. On le coche afin de l&rsquo;activer.<\/p>\n<p>Dans le champ <strong>Report files<\/strong> on saisit\u00a0: \u00ab\u00a0**\/*.jtl\u00a0\u00bb afin d&rsquo;ex\u00e9cuter tous les fichiers .jtl (c&rsquo;est-\u00e0-dire les fichiers script de test de JMeter) qui se trouveront dans l&rsquo;espace de travail de la t\u00e2che (le workspace)<\/p>\n<p>On pourra aussi configurer le champ <strong>Performance threshold<\/strong> afin de modifier le statut du \u00ab\u00a0build\u00a0\u00bb en fonction du pourcentage d&rsquo;erreur trouv\u00e9es.<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"Activation du plugin performance hudson\" src=\"\/wp-content\/images\/jmeter-34-hudson\/06_20110417_JMeter_integration_dans_Hudson_html_503d61c7.png\" alt=\"\" width=\"788\" height=\"255\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Voil\u00e0, c&rsquo;est fini pour le formulaire de configuration de la t\u00e2che, il faut bien entendu enregistrer le formulaire.<\/p>\n<p>Maintenant, on entre dans une petite phase de \u00ab\u00a0ligne de commande\u00a0\u00bb afin de pr\u00e9parer son workspace.<\/p>\n<p>On d\u00e9pose sur le serveur Hudson, l&rsquo;archive de JMeter (le tgz plut\u00f4t que le zip afin d&rsquo;avoir les bons droits positionn\u00e9s sur les fichiers).<\/p>\n<p>Dans notre cas, l&rsquo;archive jakarta-jmeter-2.4.1.tgz <em>(nb. j&rsquo;utilise une version de test de JMeter, la 2.4.1 n&rsquo;est pas encore sortie \u00e0 ce jour)<\/em> est positionn\u00e9 dans \/var\/lib\/hudson\/jobs\/TestJMeter<\/p>\n<p>Ensuite on proc\u00e8de \u00e0 la d\u00e9compression de l&rsquo;archive\u00a0:<\/p>\n<pre>hudson@hudson:~\/jobs\/TestJMeter$ tar xfz jakarta-jmeter-2.4.1.tgz<\/pre>\n<p>On cr\u00e9\u00e9 quelques r\u00e9pertoires\u00a0:<\/p>\n<pre>hudson@hudson:~\/jobs\/TestJMeter$ mkdir workspace<\/pre>\n<pre>hudson@hudson:~\/jobs\/TestJMeter$ mkdir workspace\/scripts<\/pre>\n<p>On copie le fichier script JMeter dans le r\u00e9pertoire ci-dessous\u00a0:<\/p>\n<pre>hudson@hudson:~\/jobs\/TestJMeter$ cp \/tmp\/test_webservices.jmx workspace\/scripts<\/pre>\n<p>On \u00e9dite le fichier de la t\u00e2che JMeter\/Ant avec le contenu suivant\u00a0:<\/p>\n<pre>hudson@hudson:~\/jobs\/TestJMeter$ vi workspace\/build.xml<\/pre>\n<pre>&lt;project default=\"all\"&gt;\r\n &lt;!-- Define an environment variable pointing to JMETER folder or change this --&gt;\r\n &lt;property environment=\"env\"\/&gt;\r\n &lt;property name=\"jmeter-home\" location=\"${jmeter.dir}\"\/&gt;\r\n &lt;!-- Should report include response data for failures? --&gt;\r\n &lt;property name=\"show-data\" value=\"y\"\/&gt;\r\n &lt;!-- ant-jmeter.jar comes with jmeter, be sure this is the release you have --&gt;\r\n &lt;path id=\"ant.jmeter.classpath\"&gt;\r\n     &lt;fileset dir=\"${jmeter-home}\/extras\"&gt;\r\n         &lt;include name=\"ant-jmeter*.jar\"\/&gt;\r\n     &lt;\/fileset&gt;\r\n &lt;\/path&gt;\r\n &lt;taskdef\r\n     name=\"jmeter\"\r\n     classname=\"org.programmerplanet.ant.taskdefs.jmeter.JMeterTask\"\r\n     classpathref=\"ant.jmeter.classpath\" \/&gt;\r\n &lt;target name=\"clean\"&gt;\r\n     &lt;delete dir=\"results\"\/&gt;\r\n     &lt;delete file=\"jmeter.log\"\/&gt;\r\n     &lt;mkdir dir=\"results\/jtl\"\/&gt;\r\n     &lt;mkdir dir=\"results\/html\"\/&gt;\r\n &lt;\/target&gt;\r\n &lt;target name=\"test\" depends=\"clean\"&gt;\r\n     &lt;jmeter\r\n          jmeterhome=\"${jmeter-home}\"\r\n          resultlogdir=\"results\/jtl\"&gt;\r\n          &lt;testplans dir=\"scripts\" includes=\"*.jmx\"\/&gt;\r\n     &lt;\/jmeter&gt;\r\n &lt;\/target&gt;\r\n\r\n &lt;property name=\"lib.dir\" value=\"${jmeter-home}\/lib\"\/&gt;\r\n &lt;!-- Use xalan copy from JMeter lib directory to ensure consistent processing with Java 1.4+ --&gt;\r\n &lt;path id=\"xslt.classpath\"&gt;\r\n     &lt;fileset dir=\"${lib.dir}\" includes=\"xalan*.jar\"\/&gt;\r\n     &lt;fileset dir=\"${lib.dir}\" includes=\"serializer*.jar\"\/&gt;\r\n &lt;\/path&gt; \r\n\r\n &lt;!-- This is not needed for the plugin, but it produces a nice html report\r\n which can be saved usin hudson's archive artifact feature --&gt;\r\n &lt;target name=\"report\" depends=\"test\"&gt;\r\n     &lt;xslt\r\n         classpathref=\"xslt.classpath\"\r\n         basedir=\"results\/jtl\"\r\n         destdir=\"results\/html\"\r\n         includes=\"*.jtl\"\r\n         style=\"${jmeter-home}\/extras\/jmeter-results-detail-report_21.xsl\"&gt;\r\n         &lt;param name=\"showData\" expression=\"${show-data}\"\/&gt;\r\n     &lt;\/xslt&gt;\r\n     &lt;!-- add images for best report display --&gt;\r\n     &lt;copy file=\"${jmeter-home}\/extras\/expand.jpg\" tofile=\"results\/html\/expand.jpg\"\/&gt;\r\n     &lt;copy file=\"${jmeter-home}\/extras\/collapse.jpg\" tofile=\"results\/html\/collapse.jpg\"\/&gt;\r\n &lt;\/target&gt;\r\n &lt;target name=\"all\" depends=\"test, report\"\/&gt;\r\n&lt;\/project&gt;<\/pre>\n<p>Une fois que le fichier build.xml est enregistr\u00e9, revenir sur l&rsquo;interface de gestion de Hudson. Au niveau de son projet, choisir le lien \u00ab\u00a0Build Now\u00a0\u00bb afin de lancer le premier test.<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"Lancement du build\" src=\"\/wp-content\/images\/jmeter-34-hudson\/07_20110417_JMeter_integration_dans_Hudson_html_8c990ba.png\" alt=\"\" width=\"477\" height=\"237\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Hudson va donc lancer le test JMeter et afficher son succ\u00e8s ou \u00e9chec. Depuis la console de gestion Hudson, au niveau de la t\u00e2che, il est possible d&rsquo;avoir la sortie de console. La capture d&rsquo;\u00e9cran montre un exemple d&rsquo;ex\u00e9cution r\u00e9ussie.<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"Sorite console pour le build hudson\" src=\"\/wp-content\/images\/jmeter-34-hudson\/08_20110417_JMeter_integration_dans_Hudson_html_17036ef0.png\" alt=\"\" width=\"845\" height=\"652\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Sur la page d&rsquo;accueil du projet dans Husdon, apr\u00e8s quelques ex\u00e9cutions de \u00ab\u00a0build\u00a0\u00bb, de nouveau graphiques apparaissent. Le lien <strong>Performance Trend<\/strong> permet d&rsquo;avoir le d\u00e9tail des indicateurs de performances.<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"Page d'accueil du projet avec les graphiques du test (quand il n'y a qu'un seul jtl)\" src=\"\/wp-content\/images\/jmeter-34-hudson\/09_20110417_JMeter_integration_dans_Hudson_html_38e33079.png\" alt=\"\" width=\"1063\" height=\"572\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>La capture ci-dessous montre les graphiques des indicateurs de performance.<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"Ecran Performance Trend\" src=\"\/wp-content\/images\/jmeter-34-hudson\/10_20110417_JMeter_integration_dans_Hudson_html_m2f1373d1.png\" alt=\"\" width=\"794\" height=\"419\" \/><\/p>\n<p>Il est \u00e9galement possible de consulter le rapport HTML produit par la t\u00e2che JMeter\/Ant. Pour cela, on se place sur la section Workspace, puis results &gt; html et on clique sur le fichier HTML.<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"rapport HTML produit par la t\u00e2che JMeter\/Ant\" src=\"\/wp-content\/images\/jmeter-34-hudson\/11_20110417_JMeter_integration_dans_Hudson_html_5525e859.png\" alt=\"\" width=\"662\" height=\"259\" \/><\/p>\n<p>La capture d&rsquo;\u00e9cran ci-dessous montre le rapport HTML produit par la t\u00e2che JMeter\/Ant.<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"Rapport HTML produit par la t\u00e2che JMeter\/Ant\" src=\"\/wp-content\/images\/jmeter-34-hudson\/12_20110417_JMeter_integration_dans_Hudson_html_1d15a588.png\" alt=\"\" width=\"1041\" height=\"447\" \/><\/p>\n<p>Et voil\u00e0 pour ce petit tutoriel de \u00ab\u00a0mise en liaison\u00a0\u00bb de JMeter et Hudson.<\/p>\n<p>Bien entendu, en disposant des t\u00e2ches hudson habituelles de construction d&rsquo;une release de son application (r\u00e9cup\u00e9ration SVN, compilation, ear\/war et d\u00e9ploiement sur un serveur de test) avant l&rsquo;ex\u00e9cution du test JMeter et la g\u00e9n\u00e9ration du rapport, on a un cycle de release avec test de charge.<\/p>\n<p>.\/<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hudson est une plate-forme d&rsquo;int\u00e9gration continue, JMeter est un outil de test de charge et aussi de tests fonctionnels (on a tendance \u00e0 l&rsquo;oublier, mais pour faire du test de charge, il faut savoir faire du test fonctionnel). Que diriez vous d&rsquo;int\u00e9grer dans Hudson l&rsquo;ex\u00e9cution d&rsquo;un test (de charge) JMeter, et d&rsquo;avoir un beau graphique &hellip; <a href=\"https:\/\/blog.milamberspace.net\/index.php\/2011\/04\/27\/integration-dun-test-jmeter-dans-hudson-avec-le-plugin-hudson-performance-879.html\" class=\"more-link\">Continuer la lecture de <span class=\"screen-reader-text\">Int\u00e9gration d&rsquo;un test JMeter dans Hudson avec le plugin Hudson Performance<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[32,33,169,34],"tags":[259,330],"class_list":["post-879","post","type-post","status-publish","format-standard","hentry","category-apache","category-jmeter","category-test-fonctionnel","category-tests-de-charges","tag-husdon","tag-jmeter"],"_links":{"self":[{"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/posts\/879","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/comments?post=879"}],"version-history":[{"count":7,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/posts\/879\/revisions"}],"predecessor-version":[{"id":891,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/posts\/879\/revisions\/891"}],"wp:attachment":[{"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/media?parent=879"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/categories?post=879"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/tags?post=879"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}