<?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>Jmeter on Java &amp; Moi</title><link>https://javaetmoi.com/tags/jmeter/</link><description>Recent content in Jmeter on Java &amp; Moi</description><generator>Hugo</generator><language>fr</language><lastBuildDate>Sat, 22 Feb 2014 09:28:31 +0000</lastBuildDate><atom:link href="https://javaetmoi.com/tags/jmeter/feed.xml" rel="self" type="application/rss+xml"/><item><title>Memory Leak du client CXF</title><link>https://javaetmoi.com/2014/02/memory-leak-client-cxf-attachment/</link><pubDate>Sat, 22 Feb 2014 09:28:31 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=977</guid><description>&lt;p&gt;Les tests de charge d’une nouvelle fonctionnalité m’a récemment permis de détecter un comportement inattendu de &lt;strong&gt;CXF&lt;/strong&gt; s’apparentant à une &lt;strong&gt;fuite mémoire&lt;/strong&gt;. Fusion de Celtix et de XFire, le &lt;a href="http://cxf.apache.org/"&gt;framework CXF&lt;/a&gt; propose une implémentation cliente et serveur de web services SOAP et REST. Le comportement suspect concerne la partie &lt;strong&gt;cliente&lt;/strong&gt; d’un &lt;strong&gt;web service SOAP&lt;/strong&gt; avec &lt;strong&gt;pièce-jointes&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Les symptômes ont été observés dans les conditions suivantes. Un tir de charge avec JMeter simule l’upload de fichiers de 4 Mo. Trente utilisateurs connectés simultanément uploadent des fichiers PDF. D’une durée de 5mn, le scénario fonctionnel mettant en jeu l’upload de fichiers est réitéré pendant 3h. A l’issu du tir, aucune erreur technique ou fonctionnelle n’est remontée. Par contre, l’analyse de l’empreinte mémoire est suspecte : non seulement cette nouvelle fonctionnalité a nécessité davantage de mémoire que lors des tirs précédents, mais surtout : &lt;strong&gt;la mémoire n’est jamais libérée&lt;/strong&gt;, même après l’expiration des sessions utilisateurs.&lt;/p&gt;
&lt;p&gt;&lt;a href="wp-content/uploads/2014/02/2014-02-cxf-attachments-memory-leak-2.jpg"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="2014-02-cxf-attachments-memory-leak-2"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2014/02/2014-02-cxf-attachments-memory-leak-2.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="2014-02-cxf-attachments-memory-leak-2"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2014/02/2014-02-cxf-attachments-memory-leak-2.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></channel></rss>