Gatling vs JMeter vs The Grinder: Comparaison des outils de test de charge

1. Introduction

Choisir le bon outil pour le travail peut être décourageant. Dans ce didacticiel, nous allons simplifier la tâche en comparant trois outils de test de charge d’application Web - Apache JMeter, Gatling et The Grinder - à une simple API REST.

2. Outils de test de charge

Tout d’abord, passons rapidement en revue le contexte de chacun.

2.1. Gatling

Gatling est un outil de test de charge qui crée des scripts de test dans Scala. ** L’enregistreur de Gatling génère les scripts de test Scala, une fonction essentielle de Gatling.

2.2. JMeter

JMeter est un outil de test de charge par Apache. Il fournit une interface graphique agréable que nous utilisons pour la configuration. Une fonctionnalité unique appelée contrôleurs logiques offre une grande flexibilité pour la configuration des tests dans l’interface graphique.

Visitez notre didacticiel Intro to JMeter pour des captures d’écran et davantage d’explications.

2.3. Le moulin

Et notre dernier outil, The Grinder , fournit un moteur de script plus basé sur la programmation que les deux autres et utilise Jython. Cependant, The Grinder 3 a des fonctionnalités pour l’enregistrement de scripts.

Le broyeur diffère également des deux autres outils en permettant des processus de console et d’agent. Cette fonctionnalité offre la possibilité à un processus d’agent de sorte que les tests de charge puissent être déployés sur plusieurs serveurs. Il est spécifiquement présenté comme un outil de test de charge conçu pour permettre aux développeurs de trouver des impasses et des ralentissements. **

3. Configuration du cas de test

Ensuite, pour notre test, nous avons besoin d’une API. Notre fonctionnalité API comprend:

  • ajouter/mettre à jour un enregistrement de récompenses

  • voir un/toutes les récompenses

  • lier une transaction à un enregistrement de récompenses client

  • afficher les transactions pour un enregistrement de récompenses client

  • Notre scénario: **

Un magasin organise une vente à l’échelle nationale avec de nouveaux clients et des clients fidèles qui ont besoin de comptes clients pour obtenir des économies. L’API de récompenses vérifie le compte de récompenses client à l’aide de l’ID client _. _ Si aucun compte de récompenses n’existe, ajoutez-le, puis créez un lien vers la transaction.

Après cela, nous interrogeons les transactions.

3.1. Notre API REST

Voyons brièvement l’API en consultant quelques-uns des talons de méthode:

@PostMapping(path="/rewards/add")
public @ResponseBody RewardsAccount addRewardsAcount(@RequestBody RewardsAccount body)

@GetMapping(path="/rewards/find/{customerId}")
public @ResponseBody Optional<RewardsAccount> findCustomer(@PathVariable Integer customerId)

@PostMapping(path="/transactions/add")
public @ResponseBody Transaction addTransaction(@RequestBody Transaction transaction)

@GetMapping(path="/transactions/findAll/{rewardId}")
public @ResponseBody Iterable<Transaction> findTransactions(@PathVariable Integer rewardId)

Notez certaines relations, telles que la recherche de transactions par identifiant de récompense et l’obtention du compte de récompenses par identifiant client __. __Ces relations obligent à une certaine logique et à une analyse des réponses pour la création de notre scénario de test.

  • Heureusement, nos outils le traitent tous assez bien, certains mieux que d’autres. **

3.2. Notre plan de test

Ensuite, nous avons besoin de scripts de test.

Pour obtenir une comparaison équitable, nous allons exécuter les mêmes étapes d’automatisation pour chaque outil:

  1. Générer des identifiants de compte client aléatoires

  2. Publier une transaction

  3. Analyser la réponse pour l’identifiant client aléatoire et l’identifiant de transaction

  4. Requête pour un identifiant de compte client avec l’identifiant client

  5. Analyser la réponse pour l’identifiant du compte de récompenses

  6. S’il n’y a pas d’identifiant de compte rewards, ajoutez-en un avec un article.

  7. Publiez la même transaction initiale avec l’identifiant des récompenses mis à jour à l’aide du

identifiant de transaction . Requête pour toutes les transactions par identifiant de compte de récompenses

Examinons de plus près l’étape 4 pour chaque outil. Et assurez-vous de consulter https://github.com/eugenp/tutorials/tree/master/testing-modules/load-testing-comparison/src/main/resources/scripts à partir de l’exemple des trois scripts terminés].

3.3. Gatling

Pour Gatling, la familiarité avec Scala ajoute une aubaine pour les développeurs puisque l’API de Gatling est robuste et contient de nombreuses fonctionnalités.

L’API de Gatling adopte une approche DSL constructeur, comme nous pouvons le voir à l’étape 4:

.exec(http("get__reward")
  .get("/rewards/find/${custId}")
  .check(jsonPath("$.id").saveAs("rwdId")))
.pause(1)

Il convient de noter que Gatling prend en charge JSON Path lorsque nous devons lire et vérifier une réponse HTTP. Ici, nous allons récupérer l’identifiant de la récompense et l’enregistrer dans l’état interne de Gatling. Notez la pause d’une seconde. Cette vérification nécessaire empêche l’échec de la demande dépendante suivante. L’appel check et saveAs n’ont pas bloqué les requêtes exec suivantes.

En outre, le langage d’expression de Gatling facilite le corps de la requête dynamique. Chaînes:

.body(StringBody(
  """{
    "customerRewardsId":"${rwdId}",
    "customerId":"${custId}",
    "transactionDate":"${txtDate}"
  }""")).asJson)

Enfin notre configuration pour cette comparaison. Les 10 exécutions définies comme une répétition du scénario entier, __atOnceUsers __method définissent les threads/utilisateurs

val scn = scenario("RewardsScenario")
  .repeat(10) {
  ...
  }
  setUp(
    scn.inject(atOnceUsers(100))
  ).protocols(httpProtocol)

3.4. JMeter

  • JMeter génère un fichier XML après la configuration de l’interface graphique. ** Le fichier contient des objets spécifiques à JMeter avec des propriétés définies et leurs valeurs, par exemple:

<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Add Transaction" enabled="true">
<JSONPostProcessor guiclass="JSONPostProcessorGui" testclass="JSONPostProcessor" testname="Transaction Id Extractor" enabled="true">

Découvrez les attributs testname , ils peuvent être étiquetés si nous les reconnaissons correspondant aux étapes logiques ci-dessus. La possibilité d’ajouter des enfants, des variables et des étapes de dépendance donne à JMeter la souplesse que lui confèrent les scripts. De plus, nous avons même défini la portée de nos variables!

Notre configuration pour les exécutions et les utilisateurs dans JMeter utilise ThreadGroups et un LoopController :

<stringProp name="LoopController.loops">10</stringProp>
<stringProp name="ThreadGroup.num__threads">100</stringProp>

Voir l’intégralité du fichier jmx comme référence . Bien que possible, écrire des tests en XML sous forme de fichiers .jmx n’a aucun sens avec une interface graphique complète.

3.5. Le moulin

Sans la programmation fonctionnelle de Scala et de l’interface graphique, notre script Jython pour The Grinder est plutôt basique. Ajoutez quelques classes Java système et nous aurons beaucoup moins de lignes de code.

customerId = str(random.nextInt());
result = request1.POST("http://localhost:8080/transactions/add",
  "{"'"customerRewardsId"'":null,"'"customerId"'":"+ customerId + ","'"transactionDate"'":null}")
txnId = parseJsonString(result.getText(), "id")

Cependant, moins de lignes de code de configuration de test sont compensées par le besoin de davantage de code de maintenance de chaîne, tel que l’analyse de chaînes JSON. De même, l’API HTTPRequest offre de nombreuses fonctionnalités.

Avec The Grinder, nous définissons des threads, des processus et des valeurs dans un fichier de propriétés externe:

grinder.threads = 100
grinder.processes = 1
grinder.runs = 10
  • Notre script Jython complet pour The Grinder ressemblera à this .** .

4. Essais

4.1. Test d’exécution

Les trois outils recommandent d’utiliser la ligne de commande pour les tests de charge importante.

Gatling exige seulement que JAVA HOME et GATLING HOME soient définis.

Pour exécuter Gatling, nous utilisons:

GATLING__HOME\bin\gatling.bat

JMeter a besoin d’un paramètre pour désactiver l’interface graphique pour le test, comme demandé lors du démarrage de l’interface graphique pour la configuration:

jmeter-n.cmd -t -l TestPlan.jmx -e -o[path to output folder]----

Comme Gatling, The Grinder nécessite la définition de __JAVA__HOME__ et __GRINDERPATH__. Cependant, il a également besoin de quelques propriétés supplémentaires:

[source,powershell,gutter:,true]

set GRINDERPROPERTIES="%GRINDERPATH%\grinder.properties" set CLASSPATH="%GRINDERPATH%\lib\grinder.jar";%CLASSPATH%

Comme indiqué ci-dessus, nous fournissons un fichier __grinder.properties__ pour une configuration supplémentaire, telle que des threads, des exécutions, des processus et des hôtes de la console.

Enfin, nous amorçons la console et les agents avec:

[source,powershell,gutter:,true]

java -classpath %CLASSPATH% net.grinder.Console

[source,powershell,gutter:,true]

java -classpath %CLASSPATH% net.grinder.Grinder %GRINDERPROPERTIES%

====  4.2. Résultats de test

Chacun des tests a effectué dix analyses avec 100 utilisateurs/threads. Décrivons quelques points saillants:

[cols=",^,^,^,^,^",]

| ============================================== ====================== | | **  Requêtes retenues **  | **  Erreurs **  | **  Durée totale du test **  | **  Temps de réponse moyen (ms) **  | **  Débit de pointe **

| **  Gatling **  | 4100 requêtes | 100 (soft) **  | 31 | 64.5 | 132 req/s

| **  JMeter **  | 4135 Requêtes | 0 | 35 | 81 | 1080 req/s

| **  Le moulin **  | 5000 requêtes | 0 | 5.57 | 65.72 | 1284 demandes | s ========================================

Un coup d’œil montre que The Grinder est 6 fois plus rapide que les deux autres outils pour un test complet. Les deux autres ont enregistré le même temps à environ 30 secondes. La même étape entre The Grinder et Gatling, créant 100 threads, a pris 1544ms et 16ms respectivement.

Et bien que The Grinder soit à haute vitesse, il entraîne un temps de développement supplémentaire et une diversité de données de sortie moindre.

Remarque complémentaire Gatling a 100 défaillances «logicielles» en raison de la vérification logique d’un identifiant de récompense inexistant. Les autres outils ne considèrent pas l'échec conditionnel comme une erreur. Cette limitation est intégrée à l'API Gatling.

[[test-summary]]

===  5. Résumé

Il est maintenant temps d’examiner globalement chacun des outils de test de charge.

[cols="^,^,^,^",]

| ===================================== | | **  Gatling **  | **  JMeter **  | **  The Grinder **  | Projet et communauté | 9 | 9 | 6 | Performances | 7 | 7 | 10 | Scriptability/API | 7 | 9 | 8 | UI | 8 | 8 | 5 | Rapports | 9 | 7 | 6 | Intégration | 7 | 9 | 7 | **  Résumé **  | **  7.8 **  | **  8.2 **  | **  7 **  | ================== ===================

**  Gatling: **

**  Outil de test de charge solide et poli qui produit de superbes rapports avec

Scala Scripting
**  Niveaux de support Open Source et Enterprise pour le produit

**  JMeter: **

**  API robuste (via l'interface graphique) pour le développement de scripts de test sans codage

Champs obligatoires
**  Support Apache Foundation et intégration parfaite avec Maven

**  Le moulin: **

**  Outil de test de performance rapide pour les développeurs utilisant Jython

**  L'évolutivité inter-serveur offre encore plus de potentiel pour des tests volumineux

En bref, si la vitesse et l’évolutivité sont nécessaires, utilisez The Grinder.

Si de superbes graphiques interactifs vous aident à démontrer un gain de performance pour plaider en faveur d'un changement, utilisez Gatling.

JMeter est l'outil de la logique métier complexe ou une couche d'intégration comportant de nombreux types de messages. Dans le cadre de Apache Software Foundation, JMeter fournit un produit mature et une grande communauté.

===  6. Conclusion

En conclusion, on constate que les outils ont des fonctionnalités comparables dans certains domaines et brillant dans d’autres. Le bon outil pour le bon travail est la sagesse familière qui fonctionne dans le développement de logiciels.

Enfin, l’API et les scripts sont disponibles sur https://github.com/eugenp/tutorials/tree/master/testing-modules/load-testing-comparison[on Github].