<?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>Selenium on Java &amp; Moi</title><link>https://javaetmoi.com/tags/selenium/</link><description>Recent content in Selenium on Java &amp; Moi</description><generator>Hugo</generator><language>fr</language><lastBuildDate>Tue, 04 Mar 2014 09:27:15 +0000</lastBuildDate><atom:link href="https://javaetmoi.com/tags/selenium/feed.xml" rel="self" type="application/rss+xml"/><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>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>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>