<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>MilamberSpace - JMeter &#187; fonctionnel</title>
	<atom:link href="http://blog.milamberspace.net/index.php/tag/fonctionnel/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.milamberspace.net</link>
	<description>Apache JMeter (surtout) mais aussi GNU/Linux, OpenSource, l&#039;Informatique, etc.</description>
	<lastBuildDate>Sun, 05 Feb 2012 09:51:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>JMeter : Exemple de script BeanShell pour enregistrer des données dans un fichier</title>
		<link>http://blog.milamberspace.net/index.php/2009/03/13/jmeter-exemple-de-script-beanshell-pour-enregistrer-des-donnees-dans-un-fichier-241.html</link>
		<comments>http://blog.milamberspace.net/index.php/2009/03/13/jmeter-exemple-de-script-beanshell-pour-enregistrer-des-donnees-dans-un-fichier-241.html#comments</comments>
		<pubDate>Fri, 13 Mar 2009 23:07:51 +0000</pubDate>
		<dc:creator>Milamber</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[JMeter]]></category>
		<category><![CDATA[Test fonctionnel]]></category>
		<category><![CDATA[BeanShell]]></category>
		<category><![CDATA[fonctionnel]]></category>
		<category><![CDATA[scripts]]></category>

		<guid isPermaLink="false">http://blog.milamberspace.net/?p=241</guid>
		<description><![CDATA[Un petit billet dans un but pédagogique, pour montrer un exemple de script BeanShell pour enregistrer des données dans un fichier texte. Soit le plan de test suivant : Dans ce plan de test, on extrait avec l&#8217;extracteur d&#8217;expressions régulières des données de la page reçue, (ici un NOMBRE). On ajoute &#8216;au passage&#8217; une assertion [...]]]></description>
			<content:encoded><![CDATA[<p style="">Un petit billet dans un but pédagogique, pour montrer un exemple de script BeanShell pour enregistrer des données dans un fichier texte.</p>
<p style="">Soit le plan de test suivant :</p>
<p style=" text-align: center;"><img class="aligncenter" title="Plan de test Beanshell exemple" src="/wp-content/images/jmeter14-img/01-jmeter-beanshell-plan-de-test.png" alt="" width="278" height="154" /></p>
<p style="">Dans ce plan de test, on extrait avec l&#8217;extracteur d&#8217;expressions régulières des données de la page reçue, (ici un NOMBRE).</p>
<p style=" text-align: center;"><img class="aligncenter" title="Jmeter RegExp" src="/wp-content/images/jmeter14-img/02-jmeter-regexp.png" alt="" width="464" height="228" /></p>
<p style="">On ajoute &#8216;au passage&#8217; une assertion de réponse qui est là pour s&#8217;assurer que l&#8217;expression regexp a réussie (on vérifier si on (re)trouve le NOMBRE précédemment cherché dans la page).</p>
<p style=" text-align: center;"><img class="aligncenter" title="Assertion" src="/wp-content/images/jmeter14-img/03-jmeter-beanshell-assertion.png" alt="" width="382" height="314" /></p>
<p style="">Et pour finir, on a un élément post-processeur BeanShell qui exécuter un bout de code Java pour faire l&#8217;enregistrement de la variable NOMBRE dans un fichier.</p>
<p style=" text-align: center;"><img class="aligncenter" title="Exemple de scripts BeanShell pour JMeter" src="/wp-content/images/jmeter14-img/04-jmeter-beanshell-script.png" alt="" width="524" height="370" /></p>
<p style="">
<p style=""><span id="more-241"></span>Le code du BeanShell (du Java donc) est le suivant :</p>
<pre style="">if (prev.isSuccessful()) {
    String nombre = vars.get("NOMBRE");
    try {
        BufferedWriter out = new BufferedWriter(new FileWriter("/tmp/nombre.csv",true));
        out.write(nombre +"\n");
        out.close();
    } catch (IOException e) {}
}</pre>
<p>Quelques commentaires :</p>
<ul>
<li>Le test sur le <em>prev.isSuccessful() </em>afin d&#8217;enregistrer seulement les échantillons réussis,</li>
<li>Le <em>vars.get(&laquo;&nbsp;NOMBRE&nbsp;&raquo;);</em> pour récupérer dans une variable Java le contenu de la varialbe JMeter NOMBRE,</li>
<li>Le reste pour écrire dans un fichier.</li>
</ul>
<p style="">Et voilà.</p>
<p style=""><span style="text-decoration: underline;"><em>Pré-requis :</em></span> pour exécuter des scripts <a href="http://beanshell.org/">BeanShell</a> avec JMeter, il faut récupérer le <a href="http://beanshell.org/bsh-2.0b4.jar">fichier JAR du BeanShell</a>, et le déposer dans le répertoire jmeter_home/lib (ou dans le classpath)</p>
<p style=""><em><span style="text-decoration: underline;">Nota</span></em> : JMeter propose d&#8217;une part la possibilité d&#8217;enregistrer directement dans le fichier CSV ou JTL de résultats (via la fonctionnalités des « <a href="http://jakarta.apache.org/jmeter/usermanual/listeners.html#sample_variables">samples_variables</a> »), et d&#8217;autre part d&#8217;enregistrer l&#8217;ensemble des données de réponses (via le récepteur « <a href="http://jakarta.apache.org/jmeter/usermanual/component_reference.html#Save_Responses_to_a_file">Sauvegarder les réponses vers un fichier</a> »), cependant, il est parfois intéressant de pouvoir récupérer quelques variables durant un test JMeter, faire des opérations dessus et/ou créer un fichier de données pré-formaté à la volée.</p>
<p style="">./</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.milamberspace.net/index.php/2009/03/13/jmeter-exemple-de-script-beanshell-pour-enregistrer-des-donnees-dans-un-fichier-241.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>JMeter : Trouver le bon élément dans une liste avec les expressions régulières et en mode ligne unique</title>
		<link>http://blog.milamberspace.net/index.php/2009/03/08/jmeter-trouver-le-bon-element-dans-une-liste-avec-les-expressions-regulieres-et-en-mode-ligne-unique-227.html</link>
		<comments>http://blog.milamberspace.net/index.php/2009/03/08/jmeter-trouver-le-bon-element-dans-une-liste-avec-les-expressions-regulieres-et-en-mode-ligne-unique-227.html#comments</comments>
		<pubDate>Sun, 08 Mar 2009 08:53:53 +0000</pubDate>
		<dc:creator>Milamber</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[JMeter]]></category>
		<category><![CDATA[Tests de charges]]></category>
		<category><![CDATA[fonctionnel]]></category>
		<category><![CDATA[ORO]]></category>
		<category><![CDATA[regexp]]></category>

		<guid isPermaLink="false">http://blog.milamberspace.net/?p=227</guid>
		<description><![CDATA[Voici un billet pour parler des expressions régulières (regexp) avec JMeter. L&#8217;élément Extracteur d&#8217;expressions régulières est très utile dans les scénario JMeter pour extraire des données de la réponse reçues suite à une requête. Par contre, il n&#8217;est pas toujours facile d&#8217;avoir (de trouver) la bonne regexp&#8230; J&#8217;ai mis quelques heures pour trouver cette regexp [...]]]></description>
			<content:encoded><![CDATA[<p>Voici un billet pour parler des expressions régulières (regexp) avec JMeter. L&#8217;élément Extracteur d&#8217;expressions régulières est très utile dans les scénario JMeter pour extraire des données de la réponse reçues suite à une requête. Par contre, il n&#8217;est pas toujours facile d&#8217;avoir (de trouver) la bonne regexp&#8230;</p>
<p>J&#8217;ai mis quelques heures pour trouver cette regexp qui était nécessaire pour la préparation d&#8217;un scénario de test de charges JMeter. J&#8217;ai même adapté un petit programme Java/Swing testeur de regexp style Java pour qu&#8217;il devienne un programme testeur de regexp Jakarta ORO, celui du JMeter, ceci afin de tester plus vite les différentes regexp.</p>
<p>Commençons, soit le texte de réponse d&#8217;une requête HTTP (utilisant en fait SOAP/XML-RPC) suivant :</p>
<pre>&amp;lt;ClientBean&gt;
&amp;lt;id&gt;765432&amp;lt;/id&gt;
&amp;lt;code&gt;1.87665308&amp;lt;/code&gt;
&amp;lt;nom&gt;JAMES BOND&amp;lt;/nom&gt;
&amp;lt;statutNumAppel&gt;Inactif&amp;lt;/statutNumAppel&gt;
&amp;lt;/ClientBean&gt;
&amp;lt;ClientBean&gt;
&amp;lt;id&gt;765432&amp;lt;/id&gt;
&amp;lt;code&gt;1.33333333&amp;lt;/code&gt;
&amp;lt;nom&gt;LARGO WINCH&amp;lt;/nom&gt;
&amp;lt;statutNumAppel&gt;Inactif&amp;lt;/statutNumAppel&gt;
&amp;lt;/ClientBean&gt;
&amp;lt;ClientBean&gt;
&amp;lt;id&gt;765432&amp;lt;/id&gt;
&amp;lt;code&gt;1.87999999&amp;lt;/code&gt;
&amp;lt;nom&gt;BENGAMIN GATES&amp;lt;/nom&gt;
&amp;lt;statutNumAppel&gt;Actif&amp;lt;/statutNumAppel&gt;
&amp;lt;/ClientBean&gt;
&amp;lt;ClientBean&gt;
&amp;lt;id&gt;765432&amp;lt;/id&gt;
&amp;lt;code&gt;1.23334444&amp;lt;/code&gt;
&amp;lt;nom&gt;EMMA PEAL&amp;lt;/nom&gt;
&amp;lt;statutNumAppel&gt;Inactif&amp;lt;/statutNumAppel&gt;
&amp;lt;/ClientBean&gt;</pre>
<p><em>Cette liste est dynamique (on n&#8217;a pas toujours 4 éléments, celui ayant le statut d&#8217;actif n&#8217;est pas toujours à cette position (ici 3ème) et les valeurs bien entendues changent pour chaque requête du test).</em></p>
<p>Comment faire pour extraire le code « 1.87999999 » correspondant au même ID 765432 pour chaque élément de cette liste, et qui est celui « Actif » ? Le tout avec une expression régulière JMeter ?<span id="more-227"></span></p>
<p>Avant de commencer, je rappelle que l&#8217;analyseur d&#8217;expressions régulières de JMeter est <a href="http://jakarta.apache.org/oro/" target="_blank">Jakarto ORO</a>. Celui-ci fourni un moteur qui reproduit le comportement du moteur d&#8217;expressions régulières de Perl v5.003. On peut donc se référer à la <a title="Documentation Perl" href="http://perldoc.perl.org/perl.html" target="_blank">documentation de Perl</a> pour comprendre les expressions régulières.</p>
<p><strong><span style="color: #003366;"><em>NB. Depuis la version 2.4 de JMeter, le récepteur Arbre de résultats propose une vue Testeur de RegExp qui permet de tester une expression régulière directement sur la réponse de la requête reçue.</em></span></strong></p>
<p>Pour revenir à notre question. Tout d&#8217;abord, il faut passer en <strong>mode ligne unique</strong> au niveau de l&#8217;analyseur de regexp, pour cela, on utilise un « modificateur » Perl. Un <em>modifier</em> sert à changer le comportement de l&#8217;analyseur.</p>
<p>Le modificateur « ligne unique» est à ajouter dans l&#8217;expression régulière. Aussi, on place en début de la regexp, la chaîne suivante : « <strong>(?s)</strong> »</p>
<p>Maintenant, avec le<span style="color: #ff00ff;"> <strong>(?s)</strong></span>, les caractères de fin de ligne « <strong>\n</strong> » sont considérés comme n&#8217;importe quel caractère, (symbolisé par le point « . » dans une regexp), ce qui signifie que le texte à analyser devient un grand texte d&#8217;une seule ligne du point de vue de l&#8217;analyseur.</p>
<p>Ensuite la grosse difficulté est que l&#8217;on veut le code pour l&#8217;élément qui en <em>statutNumAppel</em> à <em>Actif</em>. La première idée de regexp est :</p>
<pre><strong><span style="color: #ff00ff;">(?s)</span><span style="color: #008000;">code&gt;(.+?)&amp;lt;/code</span><span style="color: #0000ff;">.+?statutNumAppel&gt;Actif</span></strong></pre>
<p>Malheureusement, cela ne fonctionnera pas, car on se trouve toujours avec le premier &#8216;code&#8217; (ici 1.87665308). Pourquoi, car le deuxième « <strong>.+? </strong>» va englober tous les caractères entre la première occurrence du code et le statut Actif.</p>
<p>Pour indiquer à l&#8217;analyseur de regexp que l&#8217;on veut « <em>le code qui est collé à l&#8217;Actif</em> », il faut être un peu plus explicite. Cette regexp sera la bonne <em>(après une bonne cinquantaine de tentative et relecture de la documentation des regexp)</em> :</p>
<pre><strong><span style="color: #ff00ff;">(?s)</span><span style="color: #008000;">(?:&gt;.+?&amp;lt;/code.+)</span><span style="color: #ff9900;">{0,}</span><span style="color: #0000ff;">&gt;(.+?)&amp;lt;/code.+?</span><span style="color: #800080;">Actif</span></strong></pre>
<p>Celle-ci indique :</p>
<ul>
<li>Avec le <span style="color: #008000;"><strong>(?:&gt;.+?&amp;lt;/code.+)</strong></span> on indique un groupement (grâce aux parenthèses) que l&#8217;on ne veut pas enregistrer dans une variable <em>$x$</em> à cause du <strong>?:</strong> situé au début.</li>
<li>Avec<span style="color: #ff6600;"><strong> {0,}</strong></span> on indique que l&#8217;on veut ce groupement <span style="color: #008000;"><strong>(?:&gt;.+?&amp;lt;/code.+)</strong></span> de 0 à n fois, l&#8217;analyseur doit donc rechercher <strong>toutes</strong> les occurrences du code.</li>
<li>Avec le deuxième <span style="color: #0000ff;"><strong>&gt;(.+?)&amp;lt;/code.+</strong></span> on &#8216;<em>surprend</em>&#8216; l&#8217;analyseur pour lui dire que finalement on ne veut pas toutes les occurrences, mais<strong> les occurrences N – 1</strong> dans le groupement précédent</li>
<li>Avec le <span style="color: #800080;"><strong>Actif</strong></span> on lui précise que l&#8217;on veut l&#8217;<strong>occurrence N</strong> du &#8216;code&#8217; suivie par le statut <em>Actif</em>.</li>
</ul>
<p>Et voilà, c&#8217;est &#8216;simple&#8217;, une fois que l&#8217;on a trouvé&#8230; <img src='http://blog.milamberspace.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>En complément,</p>
<p>a) JMeter est par défaut en mode multiligne (pour l&#8217;avoir <em>explicitement</em>, il faut «<strong> (?m)</strong> en début d&#8217;expression régulière.</p>
<p>b) En mode ligne unique «<strong> (?s)</strong> », le début de la ligne est représentée par l&#8217;accent circonflexe « <strong>^</strong> », et la fin de ligne par le signe dollar « <strong>$</strong> »</p>
<p><span style="text-decoration: underline;">Pour en savoir plus sur les expressions régulières au niveau JMeter :</span></p>
<ul>
<li><a href="http://jakarta.apache.org/jmeter/usermanual/regular_expressions.html" target="_self">Page d&#8217;aide sur les regexp au niveau JMeter</a></li>
<li>La <a href="http://perldoc.perl.org/perlreref.html" target="_self">page des regexp en Perl</a>, c&#8217;est la même syntaxe dans JMeter</li>
</ul>
<p><span style="text-decoration: underline;">Pour tester ses regexp en dehors de JMeter :</span></p>
<ul>
<li><a title="ORO" href="http://jakarta.apache.org/oro/demo.html" target="_self">Demonstrateur ORO</a> sur le site de Jakarta ORO</li>
</ul>
<p>./</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.milamberspace.net/index.php/2009/03/08/jmeter-trouver-le-bon-element-dans-une-liste-avec-les-expressions-regulieres-et-en-mode-ligne-unique-227.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

