{"id":834,"date":"2011-03-11T08:13:02","date_gmt":"2011-03-11T08:13:02","guid":{"rendered":"http:\/\/blog.milamberspace.net\/?p=834"},"modified":"2011-03-18T21:54:03","modified_gmt":"2011-03-18T21:54:03","slug":"jmeter-et-groovy-exemple-d-echantillon-bsf-groovy","status":"publish","type":"post","link":"https:\/\/blog.milamberspace.net\/index.php\/2011\/03\/11\/jmeter-et-groovy-exemple-d-echantillon-bsf-groovy-834.html","title":{"rendered":"JMeter et Groovy\u00a0: exemple d&rsquo;\u00e9chantillon BSF\/Groovy"},"content":{"rendered":"<p><!-- p { margin-bottom: 0.21cm; } -->JMeter dispose de plusieurs \u00e9l\u00e9ments \u00ab\u00a0BSF\u00a0\u00bb pour <a href=\"http:\/\/en.wikipedia.org\/wiki\/Bean_Scripting_Framework\">Bean Scripting Framework<\/a>. Ce <a href=\"http:\/\/jakarta.apache.org\/bsf\/index.html\">cadre de travail (framework), fait par la Fondation Apache<\/a>, permet de faire un pont entre le Java de JMeter et un code script dans un autre langage de programmation.<\/p>\n<p>Plus pr\u00e9cis\u00e9ment ces \u00e9l\u00e9ments BSF permettent d&rsquo;avoir acc\u00e8s \u00e0 un certain nombre d&rsquo;objets internes de JMeter (comme l&rsquo;objet <a href=\"http:\/\/jakarta.apache.org\/jmeter\/api\/org\/apache\/jmeter\/samplers\/SampleResult.html\">SampleResult<\/a> correspondant au r\u00e9sultat courant\u00a0: temps de r\u00e9ponses, nom, latence, etc.), tout en pouvant effectuer des op\u00e9rations (de programmation) dessus avec un langage de programmation qui n&rsquo;est pas forc\u00e9ment du Java (le langage utilis\u00e9 pour cr\u00e9er JMeter).<\/p>\n<p>BSF supporte un grand nombre de langage, soit directement c&rsquo;est-\u00e0-dire distribu\u00e9 dans l&rsquo;archive binaire de BSF, soit directement par les langages eux-m\u00eames, qui dans ces cas-l\u00e0 proposent leur moteur BSF.<\/p>\n<p>Dans ce billet, nous allons voir comment faire du <a href=\"http:\/\/groovy.codehaus.org\/\">Groovy<\/a> (d\u00e9finit comme un langage dynamique et agile pour Java) dans JMeter \u00e0 travers ces \u00e9l\u00e9ments BSF.<!--more--><\/p>\n<p>Pour continuer sur JMeter, les \u00e9l\u00e9ments BSF sont (dans la version 2.4)\u00a0:<\/p>\n<ul>\n<li><a href=\"http:\/\/jakarta.apache.org\/jmeter\/usermanual\/component_reference.html#BSF_Timer\">Compteur de temps BSF<\/a><\/li>\n<li><a href=\"http:\/\/jakarta.apache.org\/jmeter\/usermanual\/component_reference.html#BSF_PreProcessor\">Pr\u00e9-Processeur BSF<\/a><\/li>\n<li><a href=\"http:\/\/jakarta.apache.org\/jmeter\/usermanual\/component_reference.html#BSF_Sampler\">Echantillon BSF<\/a><\/li>\n<li><a href=\"http:\/\/jakarta.apache.org\/jmeter\/usermanual\/component_reference.html#BSF_PostProcessor\">Post-Processeur BSF<\/a><\/li>\n<li><a href=\"http:\/\/jakarta.apache.org\/jmeter\/usermanual\/component_reference.html#BSF_Assertion\">Assertion BSF<\/a><\/li>\n<li> <a href=\"http:\/\/jakarta.apache.org\/jmeter\/usermanual\/component_reference.html#BSF_Listener\">R\u00e9cepteur BSF<\/a><\/li>\n<\/ul>\n<p>Au total donc, 6 \u00e9l\u00e9ments BSF, qui savent tous ex\u00e9cuter des scripts BSF mais qui sont ex\u00e9cuter \u00e0 diff\u00e9rents moments lors d&rsquo;un test (voir la notion <a href=\"http:\/\/jakarta.apache.org\/jmeter\/usermanual\/test_plan.html#executionorder\">d&rsquo;ordre d&rsquo;ex\u00e9cution<\/a>).<\/p>\n<p>Nous allons travailler sur l&rsquo;\u00e9chantillon BSF, qui peut aussi \u00eatre traduit par \u00ab\u00a0Requ\u00eate BSF\u00a0\u00bb, ce qui signifie qu&rsquo;un \u00e9chantillon BSF s&rsquo;ex\u00e9cute comme une Requ\u00eate \u00ab\u00a0standard\u00a0\u00bb, ce sera donc un \u00e9l\u00e9ment principal dans ce sc\u00e9nario de test.<\/p>\n<p>Voici l&rsquo;arbre JMeter pour ce billet\u00a0:<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"Arbre JMeter\" src=\"\/wp-content\/images\/jmeter-32-groovy\/01_groovy_bsf.png\" alt=\"\" width=\"210\" height=\"173\" \/><\/p>\n<p>Tr\u00e8s simple. La requ\u00eate BSF va faire le test, et l&rsquo;arbre de r\u00e9sultat va capter le r\u00e9sultat.<\/p>\n<p><strong>Revenons \u00e0 Groovy.<\/strong><\/p>\n<p>Le binaire BSF (le fichier .jar) est directement inclut dans JMeter, mais le langage Groovy n&rsquo;est pas inclut directement dans BSF, car il dispose de son propre moteur BSF. Il faut donc aller t\u00e9l\u00e9charger l&rsquo;archive binaire de Groovy (qui est aussi un .jar) et l&rsquo;ajouter dans le classpath de JMeter.<\/p>\n<p>Pour cela, r\u00e9cup\u00e9rer le fichier ZIP de Groovy \u00e0 partir de <a href=\"http:\/\/groovy.codehaus.org\/Download\">cette page<\/a>, puis le d\u00e9compresser dans un r\u00e9pertoire temporaire.<\/p>\n<p>Dans le r\u00e9pertoire groovy-1.7.8\/embeddable, il y a le fichier <strong>groovy-all-1.7.8.jar<\/strong>. C&rsquo;est lui qui va \u00eatre install\u00e9 dans JMeter. Il faut placer ce fichier dans le r\u00e9pertoire JMETER_HOME\/lib\/. Ensuite, Si votre JMeter est lanc\u00e9, il faut le red\u00e9marrer bien entendu.<\/p>\n<p>Voil\u00e0 vous \u00eates pr\u00eats \u00e0 faire du Groovy dans JMeter.<\/p>\n<p>Nous allons commencer notre script Groovy avec un exemple simple, en gros, on ne va pas faire grand chose dans notre \u00e9chantillon BSF, on va se concentrer sur l&rsquo;interfa\u00e7age entre JMeter &lsquo;inside&rsquo; et le script BSF.<\/p>\n<p>Donc dans notre script Groovy\/JMeter, on a un \u00e9chantillon BSF. On choisit le langage \u00ab\u00a0groovy\u00a0\u00bb dans la liste des langages de script.<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"Echantillon BSF pour Groovy\" src=\"\/wp-content\/images\/jmeter-32-groovy\/02_groovy_bsf.png\" alt=\"\" width=\"370\" height=\"204\" \/><\/p>\n<p>Dans l&rsquo;\u00e9chantillon BSF, une zone est consacr\u00e9e au script \u00e0 ex\u00e9cuter, o\u00f9 il est possible d&rsquo;acc\u00e9der \u00e0 des variables &lsquo;internes&rsquo; de JMeter.<\/p>\n<p>Ces variables &lsquo;internes&rsquo; correspondent \u00e0 des objets Java qui sont manipul\u00e9s dans le cadre (ici) d&rsquo;un \u00e9chantillon traditionnel de JMeter.<\/p>\n<p>Voici une petite description de ces variables\u00a0:<\/p>\n<ul>\n<li><strong>log<\/strong> &#8211; le Logger de JMeter (commons-logging)<\/li>\n<li><strong>Label<\/strong> \u2013 le libell\u00e9 de l\u2019\u00e9chantillon, genre\u00a0: \tOUT.println(Label);<\/li>\n<li><strong>FileName<\/strong> \u2013 le nom du fichier script s&rsquo;il existe<\/li>\n<li><strong>Parameters<\/strong> \u2013 le texte du champ Param\u00e8tres<\/li>\n<li>args \u2013 les param\u00e8tres sous forme de liste (i.e. pour les \tparam\u00e8tres \u00ab\u00a0toto titi tata\u00a0\u00bb, et le script Groovy \t\u00ab\u00a0args.each { println it }\u00a0\u00bb, on a \u00ab\u00a0titi &lt;retour \t\u00e0 la ligne&gt; toto &lt;retour \u00e0 la ligne&gt; tata &lt;retour \u00e0 \tligne&gt;\u00a0\u00bb<\/li>\n<li><strong>SampleResult<\/strong> \u2013 la r\u00e9f\u00e9rence vers l&rsquo;objet correspondant \taux donn\u00e9es de r\u00e9ponse de l&rsquo;\u00e9l\u00e9ment courant (voir ci-dessous)<\/li>\n<li><strong>ctx<\/strong> \u2013 JMeterContext\u00a0: le contexte de JMeter<\/li>\n<li><strong>vars<\/strong> &#8211; JMeterVariables &#8211;  acc\u00e8s aux variables de JMeter. \ti.e. vars.get(\u00ab\u00a0VAR1\u00a0\u00bb); vars.put(\u00ab\u00a0VAR2&Prime;,\u00a0\u00bbvalue\u00a0\u00bb); \tvars.remove(\u00ab\u00a0VAR3\u00a0\u00bb); vars.putObject(\u00ab\u00a0OBJ1\u00a0\u00bb,new \tObject());<\/li>\n<li><strong>props<\/strong> &#8211; JMeter Properties &#8211; acc\u00e8s aux propri\u00e9t\u00e9s de \tJMeter. i.e. props.get(\u00ab\u00a0START.HMS\u00a0\u00bb); \tprops.put(\u00ab\u00a0PROP1&Prime;,\u00a0\u00bb1234\u00a0\u00bb);<\/li>\n<li> <strong> OUT<\/strong> \u2013 System.out\u00a0: Sortie standard \u2013 i.e. \tOUT.println(\u00ab\u00a0message\u00a0\u00bb)<\/li>\n<\/ul>\n<p>Bon, maintenant, passons \u00e0 un script d&rsquo;exemple\u00a0:<\/p>\n<pre>\/\/ R\u00e9cup\u00e9ration d'un variable JMeter\r\n\/\/def myVar = vars.get(\"MA_VARIABLE\")\r\n\/\/ Mon premier parametre\r\ndef monPremier = args[0]\r\n\/\/ R\u00e9cup\u00e9ration de l'objet correspondant au r\u00e9sultat de cet \u00e9chantillon\r\ndef sr = SampleResult\r\n\/\/ D\u00e9finition des donn\u00e9es de requ\u00eate (onglet Requ\u00eate dans Arbre de r\u00e9sultat)\r\nsr.setSamplerData(\"Voici la requete !\")\r\n\r\n\/\/ Egalement, on change le statut de la r\u00e9ponse \u00e0 SUCCES\r\nsr.setSuccessful(true)\r\nsr.setResponseCode(\"200\")\r\nsr.setResponseMessage(\"OK\")\r\n\/\/ Ici on profite de la sortie standard, pour afficher quelques messages\r\nOUT.println(Label)\r\n\/\/ OUT n'est pas obligatoire\r\nprintln \"Les arguments sont : \"\r\nargs.each { println it }\r\n\r\n\/\/ D\u00e9finition des donn\u00e9es de r\u00e9ponse (onglet Donn\u00e9es de r\u00e9ponse dans l'Arbre de r\u00e9sultat)\r\ndef maResponse = \"\\n\\nVoici la reponse ! et le premier argurment est \" + monPremier\r\nsr.setResponseData(maResponse)\r\n<\/pre>\n<p>La capture de l&rsquo;\u00e9chantillon BSF de test\u00a0:<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"Echantillon BSF avec du Groovy\" src=\"\/wp-content\/images\/jmeter-32-groovy\/03_groovy_bsf.png\" alt=\"\" width=\"955\" height=\"482\" \/><\/p>\n<p>On passe \u00e0 l&rsquo;ex\u00e9cution, voici les r\u00e9sultats \u00e0 travers l&rsquo;Arbre de r\u00e9sultats :<\/p>\n<p><span style=\"text-decoration: underline;\">Onglet R\u00e9sultat de l&rsquo;\u00e9chantillon :<\/span><\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"R\u00e9sultat Onglet 1\" src=\"\/wp-content\/images\/jmeter-32-groovy\/04_groovy_bsf.png\" alt=\"\" width=\"483\" height=\"294\" \/><\/p>\n<p><span style=\"text-decoration: underline;\">Onglet Requ\u00eate :<\/span><\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"Onglet Requ\u00eate Groovy\" src=\"\/wp-content\/images\/jmeter-32-groovy\/05_groovy_bsf.png\" alt=\"\" width=\"514\" height=\"319\" \/><\/p>\n<p><span style=\"text-decoration: underline;\">Onglet Donn\u00e9es de r\u00e9ponses :<\/span><\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid black;\" title=\"Onglet Donn\u00e9es de r\u00e9ponse Groovy\" src=\"\/wp-content\/images\/jmeter-32-groovy\/06_groovy_bsf.png\" alt=\"\" width=\"511\" height=\"271\" \/><\/p>\n<p><span style=\"text-decoration: underline;\">Sur la sortie standard, on a\u00a0:<\/span><\/p>\n<pre>Echantillon BSF\r\nLes arguments sont :\r\ntoto\r\ntiti\r\ntata<\/pre>\n<p>Et voil\u00e0 pour notre premier petit script Groovy fonctionne dans notre JMeter.<\/p>\n<p>Plus d&rsquo;info sur le langage Groovy, <a href=\"http:\/\/groovy.codehaus.org\/Getting+Started+Guide\">c&rsquo;est ici<\/a><\/p>\n<p>Dans un prochain billet, on fera quelque chose de plus costaud avec le Groovy.<\/p>\n<p>.\/<\/p>\n","protected":false},"excerpt":{"rendered":"<p>JMeter dispose de plusieurs \u00e9l\u00e9ments \u00ab\u00a0BSF\u00a0\u00bb pour Bean Scripting Framework. Ce cadre de travail (framework), fait par la Fondation Apache, permet de faire un pont entre le Java de JMeter et un code script dans un autre langage de programmation. Plus pr\u00e9cis\u00e9ment ces \u00e9l\u00e9ments BSF permettent d&rsquo;avoir acc\u00e8s \u00e0 un certain nombre d&rsquo;objets internes de &hellip; <a href=\"https:\/\/blog.milamberspace.net\/index.php\/2011\/03\/11\/jmeter-et-groovy-exemple-d-echantillon-bsf-groovy-834.html\" class=\"more-link\">Continuer la lecture de <span class=\"screen-reader-text\">JMeter et Groovy\u00a0: exemple d&rsquo;\u00e9chantillon BSF\/Groovy<\/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],"tags":[257,365,330],"class_list":["post-834","post","type-post","status-publish","format-standard","hentry","category-apache","category-jmeter","tag-bsf","tag-groovy","tag-jmeter"],"_links":{"self":[{"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/posts\/834","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=834"}],"version-history":[{"count":9,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/posts\/834\/revisions"}],"predecessor-version":[{"id":857,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/posts\/834\/revisions\/857"}],"wp:attachment":[{"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/media?parent=834"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/categories?post=834"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/tags?post=834"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}