Site icon Blog Zenika

Reporting dans JMeter avec BIRT

Lors des tests de performance d’une application, la partie la plus importante concerne bien sûr l’analyse des résultats obtenus. Un bon outil de test se doit donc de disposer de composants permettant la génération et l’exploitation de ces résultats. Tel est le cas de JMeter.
JMeter est un outil open source qui permet de faire du stress/load/performance testing sur différentes sortes d’applications dont des applications web, des applications de base de données, des web services, des annuaires LDAP, des applications de messagerie basées sur POP et IMAP. Il permet de simuler de la charge sur un serveur afin de tester la résistance et les performances de celui-ci selon différents types et quantités de charges.
JMeter propose de base des composants permettant de générer des rapports ainsi que des graphes de résultats. Cependant, ces composants ne sont pas très aboutis en terme de rendus et de paramétrage.
Cette limitation a poussé des développeurs à créer des scripts « custom » (en Perl, Python etc.) pour générer des graphiques plus ergonomiques et plus exploitables visuellement à partir des logs des résultats de JMeter.
Pour notre part, nous avons utilisé BIRT pour la génération de rapports JMeter. Lors de nos posts précédents, nous avions également parlé de cet outil. De par nos retours d’expérience sur le sujet, BIRT s’affirme comme étant l’un des outils de reporting Open source les plus aboutis du marché.

Présentation de BIRT

BIRT est un outil de reporting open source très performant destiné aux applications Web ou Desktop. De plus, BIRT possède une intégration native aux technologies Java / JEE.
Cet outil générique possède deux grandes forces : la diversité des sources de données que l’on peut y connecter et la diversité des rapports générés. En effet, d’une part, BIRT peut prendre en entrée plusieurs types de sources de données dont des fichiers CSV, des fichiers XML, des sources de données JDBC ainsi que des Web Services. D’autre part, il peut aussi produire des rapports en différents formats tel que le PDF, HTML, XLS, PPT, PostScript.
BIRT est disponible en version complète contenant tout l’environnement de développement Eclipse en plus de BIRT ou une version light contenant juste le strict minimum pour « designer » des rapports. Dans notre cas, la version light est amplement suffisante.

Utilisation de BIRT pour la génération de rapports dans JMeter

Lors du lancement des tests de charge, JMeter journalise les résultats des tests dans des fichiers .jtl.

  1. <?xml version=« 1.0 » encoding=« UTF-8 »?>
  2. <testResults version=« 1.2 »>
  3. <httpSample t=« 1733 » lt=« 1282 » ts=« 1132021485561 » s=« true » lb=« sample1 » rc=« 200 » rm=« OK » tn=« Thread Group 1-1 » dt=« text »/>
  4. <httpSample t=« 431 » lt=« 120 » ts=« 1132021485992 » s=« true » lb=« sample1 » rc=« 200 » rm=« OK » tn=« Thread Group 1-1 » dt=« text »/>
  5. <httpSample t=« 240 » lt=« 100 » ts=« 1132021486232 » s=« true » lb=« sample1 » rc=« 200 » rm=« OK » tn=« Thread Group 1-1 » dt=« text »/>
  6. <httpSample t=« 130 » lt=« 110 » ts=« 1132021486362 » s=« true » lb=« sample1 » rc=« 200 » rm=« OK » tn=« Thread Group 1-1 » dt=« text »/>
  7. <httpSample t=« 321 » lt=« 120 » ts=« 1132021486683 » s=« true » lb=« sample2 » rc=« 200 » rm=« OK » tn=« Thread Group 1-1 » dt=« text »/>
  8. <httpSample t=« 200 » lt=« 100 » ts=« 1132021486883 » s=« true » lb=« sample1 » rc=« 200 » rm=« OK » tn=« Thread Group 1-1 » dt=« text »/>
  9. <httpSample t=« 771 » lt=« 120 » ts=« 1132021487654 » s=« true » lb=« sample2 » rc=« 200 » rm=« OK » tn=« Thread Group 1-1 » dt=« text »/>
  10. <httpSample t=« 310 » lt=« 100 » ts=« 1132021487964 » s=« true » lb=« sample1 » rc=« 200 » rm=« OK » tn=« Thread Group 1-1 » dt=« text »/>
  11. <httpSample t=« 571 » lt=« 111 » ts=« 1132021488535 » s=« true » lb=« sample2 » rc=« 200 » rm=« OK » tn=« Thread Group 1-1 » dt=« text »/>
  12. <httpSample t=« 241 » lt=« 120 » ts=« 1132021488776 » s=« true » lb=« sample1 » rc=« 200 » rm=« OK » tn=« Thread Group 1-1 » dt=« text »/>
  13. <httpSample t=« 360 » lt=« 120 » ts=« 1132021489136 » s=« true » lb=« sample2 » rc=« 200 » rm=« OK » tn=« Thread Group 1-1 » dt=« text »/>
  14. <httpSample t=« 411 » lt=« 120 » ts=« 1132021489547 » s=« true » lb=« sample1 «  rc=« 200 » rm=« OK » tn=« Thread Group 1-1 » dt=« text »/>
  15. <httpSample t=« 340 » lt=« 110 » ts=« 1132021489897 » s=« true » lb=« sample2 » rc=« 200 » rm=« OK » tn=« Thread Group 1-1 » dt=« text »/>
  16. </testResults>

Les fichiers jtl sont en fait de simples fichiers XML générées à partir des résultats des samples. BIRT pouvant générer directement des graphiques avec des fichiers XML en entrée, nous allons utiliser ces fichiers comme datasource.

Syntaxe JTL

Tout d’abord il est intéressant de s’intéresser aux données « logguées » par JMeter dans les fichiers jtl.

  1. <httpSample t=« 340 » lt=« 110 » ts=« 1132021489897 » s=« true » lb=« sample2 » rc=« 200 » rm=« OK » tn=« Thread Group 1-1 » dt=« text »/>

Un élément httpSample représente un résultat d’une requête JMeter. Il dispose des attributs suivants :

Ce sont les attributs du fichier jtl ci-dessus qui seront utilisés par BIRT pour la génération des rapports de tests.

Création du rapport BIRT et connexion à la DataSource

Pour commencer, il suffit de créer un rapport vierge « Blank Report » dans un projet de rapport (« Report Project ») via le menu File/New/Report.
Une fois les résultats de tests générés dans un fichier .jtl, il ne reste qu’à connecter ces sources de données au rapport BIRT. Une DataSource de type XML doit donc être créée et doit être liée avec le fichier .jtl qui n’est autre qu’un simple fichier XML. Pour créer une DataSource, il faut tout simplement faire un clic-droit sur l’item DataSource dans la vue DataExplorer ensuite laissez vous guider.

Définition des jeux de données

Avant même de créer des graphes, nous devons d’abord définir les données sur lesquelles nous allons travailler. Cette définition de jeux de données vise à mettre en place ce qu’on appelle en BIRT : un DataSet.
L’ajout d’un DataSet se fait de la même manière qu’une DataSource avec un clic-droit sur l’item DataSet de la vue DataExplorer. Grâce à la DataSet, nous allons mapper les lignes et les colonnes provenant des sources de donneés.

Création d’un graphe

Maintenant que la DataSet a été mise en place, nous pouvons créer un graphe. Prenons un exemple simple, affichons le temps de réponse pour chaque requête envoyée selon sa date d’estampillage. La création d’un graphe se fait, via un glisser-déposer du « Report Item » « Chart » situé dans la vue Palette. Ensuite, il suffit de se laisser guider par l’interface qui permet de mettre en place un graphe en trois étapes :

Choix du type de graphe

La première étape consiste à choisir le type de graphe que l’on voudrait représenter : dans notre cas, nous sélectionnons une courbe.

Sélection des données

En choisissant la DataSet précédemment créée dans « Use Data from », il est possible de sélectionner les champs « timestamp » et « latency » pour les afficher respectivement sur l’axe des abscisses et des ordonnées.

Mise en forme du graphe

BIRT offre la possibilité d’agir sur divers paramètres pour rendre plus le graphe plus lisible et impactant : titre, légende, axe des abscisses, axe des ordonnées, données représentées sur la courbe. Par exemple, nous pouvons afficher les coordonnées des points de la courbe et afficher les labels de l’axe des abscisses à la verticale.

Voici le résultat obtenu :
Mais on peut aussi obtenir d’autres types de graphiques :
Le graphe ci-dessus, par exemple, donne une comparaison entre le temps d’attente moyen avant l’envoi d’une requête (attribut t du jtl) et le temps de réponse moyen (attribut lt du jtl), pour chaque requête.
Grâce à BIRT, il est possible d’avoir divers rendus de ce rapport tel qu’en PDF ou encore en HTML.
Afin d’obtenir des graphiques consolidés, il conviendrait d’introduire une étape intermédiaire afin de pré-agréger ces données XML brutes. Par exemple, une simple transformation XSLT pourrait être appliquée ou encore ces mêmes données pourraient être stockées dans une base de données relationnelle qui permettrait des regroupements plus aisés par SQL.

Quitter la version mobile