Gatling vs JMeter vs Grinder: Usporedba alata za ispitivanje opterećenja

1. Uvod

Odabir pravog alata za posao može biti zastrašujući. U ovom uputstvu pojednostavit ćemo to usporedbom tri alata za testiranje učitavanja web aplikacija - Apache JMeter, Gatling i The Grinder - s jednostavnim REST API-jem.

2. Učitajte alate za testiranje

Prvo, hajde da brzo pregledamo neke pozadine svake.

2.1. Gatling

Gatling je alat za testiranje opterećenja koji stvara test skripte u Scali. Gatlingov snimač generira testne skripte Scala, ključnu značajku Gatlinga. Za više informacija pogledajte naš vodič za uvod u Gatling.

2.2. JMeter

JMeter je Apacheov alat za ispitivanje opterećenja. Pruža lijep GUI koji koristimo za konfiguraciju. Jedinstvena značajka nazvana logički kontroleri daje veliku fleksibilnost za postavljanje testova u GUI-u.

Posjetite naš uvod u JMeter za snimke zaslona i više objašnjenja.

2.3. Brusilica

I naš posljednji alat, The Grinder, nudi više skriptnih mehanizama temeljenih na programiranju od druga dva i koristi Jython. Međutim, The Grinder 3 ima funkcionalnost za snimanje skripti.

Brusilica se također razlikuje od druga dva alata omogućavanjem procesa konzole i agenata. Ova funkcionalnost pruža mogućnost procesa agenta tako da se testovi učitavanja mogu povećati na više poslužitelja. Izričito se reklamira kao alat za ispitivanje opterećenja napravljen za programere da pronađu mrtve točke i usporavanja.

3. Postavljanje test kutije

Dalje, za naš test trebamo API. Naša API funkcionalnost uključuje:

  • dodati / ažurirati zapis o nagradama
  • pogledajte zapis o jednoj / svim nagradama
  • povežite transakciju sa zapisom o nagradama kupaca
  • pregledajte transakcije za evidenciju nagrada kupaca

Naš scenarij:

Trgovina ima nacionalnu prodaju s novim kupcima koji se vraćaju i kojima trebaju računi za nagrade kupaca da bi uštedjeli. API nagrade provjerava račun kupaca za nagrade prema korisničkom ID-u. Ako ne postoji račun za nagrade, dodajte ga, a zatim povežite s transakcijom.

Nakon toga ispitujemo transakcije.

3.1. Naš REST API

Idemo na brzinu istaknuti API pregledavanjem nekih kvara metode:

@PostMapping (path = "/ rewards / add") public @ResponseBody RewardsAccount addRewardsAcount (@RequestBody RewardsAccount body) @GetMapping (path = "/ rewards / find / {customerId}") public @ResponseBody Neobvezno findCustomer (@PathVariadble Integer) @PostMapping (path = "/ transactions / add") public @ResponseBody Transaction addTransaction (@RequestBody Transaction transaction) @GetMapping (path = "/ transakcije / findAll / {rewardId}") public @ResponseBody Iterable findTransactions (@PathVariable Integer rewardId) 

Obratite pažnju na neke veze, poput upita za transakcije prema ID-u nagrade i dobivanju računa nagrada prema ID-u kupca. Ti odnosi prisiljavaju malo logike i raščlanjivanja odgovora za stvaranje našeg testnog scenarija.

Testirana aplikacija također koristi H2 bazu podataka u memoriji za trajnost.

Srećom, svi naši alati to prilično dobro podnose, neki bolje od drugih.

3.2. Naš plan ispitivanja

Dalje, trebaju nam testne skripte.

Da bismo dobili poštenu usporedbu, izvest ćemo iste korake automatizacije za svaki alat:

  1. Generirajte slučajne ID-jeve korisničkih računa
  2. Objavite transakciju
  3. Analizirajte odgovor za slučajni ID kupca i ID transakcije
  4. Upit za kupca nagrađuje ID računa s ID-om kupca
  5. Analizirajte odgovor za ID računa nagrada
  6. Ako ne postoji ID računa za nagrade, dodajte ga s postom
  7. Knjižite istu početnu transakciju s ažuriranim ID-om nagrada koristeći ID transakcije
  8. Upit za sve transakcije prema ID-u računa nagrade

Pogledajmo bliže 4. korak za svaki alat. Svakako pogledajte uzorak za sve tri dovršene skripte.

3.3. Gatling

Za Gatling, poznavanje Scale daje blagodat za programere jer je Gatling API robustan i sadrži puno značajki.

Gatlingov API koristi graditeljski DSL pristup, kao što vidimo u njegovom koraku 4:

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

Posebna je pozornost Gatlingova podrška za JSON Path kada moramo pročitati i potvrditi HTTP odgovor. Ovdje ćemo preuzeti ID nagrade i spremiti ga u Gatlingovo unutarnje stanje.

Također, Gatlingov jezik izražavanja olakšava dinamičko tijelo zahtjeva Žice:

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

Na kraju naša konfiguracija za ovu usporedbu. 1000 izvođenja postavljeno je kao ponavljanje cijelog scenarija, atOnceUsers metoda postavlja niti / korisnike:

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

Cjelokupna Scala skripta vidljiva je na našem Github repo-u.

3.4. JMeter

JMeter generira XML datoteku nakon GUI konfiguracije. Datoteka sadrži JMeter specifične objekte sa postavljenim svojstvima i njihovim vrijednostima, na primjer:

Pogledajte ime testa atributi, mogu se označiti kad ih prepoznamo kako odgovaraju gornjim logičkim koracima. Sposobnost dodavanja djece, varijabli i koraka ovisnosti daje JMeteru fleksibilnost kao što pruža skriptiranje. Nadalje, čak smo postavili opseg za naše varijable!

Naša konfiguracija za pokretanja i korisnike u JMeter koristi ThreadGroups:

100

Pogledajte cijeli jmx datoteka kao referenca. Dok je to moguće, pisanje testova u XML-u kao .jmx datoteke nemaju smisla s potpuno opremljenim GUI-jem.

3.5. Brusilica

Bez funkcionalnog programiranja Scale i GUI-a, naša Jython skripta za The Grinder izgleda prilično osnovno. Dodajte neke sistemske klase Java, a mi imamo puno manje redaka koda.

customerId = str (random.nextInt ()); rezultat = zahtjev1.POST ("// localhost: 8080 / transakcije / dodaj", "{" '"customerRewardsId"' ": null," '"customerId"' ":" + customerId + "," '"actionDate "' ": null}") txnId = parseJsonString (result.getText (), "id")

Međutim, manje redaka koda za postavljanje testa uravnoteženo je potrebom za više koda za održavanje niza, poput raščlanjivanja JSON nizova. Također, HTTPRequest API ima malo funkcionalnosti.

Pomoću The Grinder definiramo niti, procesiramo i pokrećemo vrijednosti u vanjskoj datoteci svojstava:

brusilica.navoji = 100 brusilica.procesi = 1 brusilica.trke = 1000

Naša cjelovita Jython skripta za The Grinder izgledat će ovako.

4. Probna izvođenja

4.1. Izvršenje testa

Sva tri alata preporučuju upotrebu naredbenog retka za velike testove opterećenja.

Za pokretanje testova koristit ćemo Gatlingovu otvorenu verziju 3.4.0 kao samostalni alat, JMeter 5.3 i The Grinder verziju 3.

Gatling zahtijeva samo ono što imamo JAVA_KUĆA i GATLING_HOME postavljen. Za izvršenje Gatlinga koristimo:

./klapanje.š

u direktoriju GATLING_HOME / bin.

JMeter treba parametar za onemogućavanje GUI-a za test kako se traži prilikom pokretanja GUI-a za konfiguraciju:

./jmeter.sh -n -t TestPlan.jmx -l log.jtl

Poput Gatlinga, i Grinder zahtijeva da postavimo JAVA_KUĆA i MALOPRODAJA. Međutim, treba mu još nekoliko svojstava:

izvoz CLASSPATH = / home / lore / Documents / grinder-3 / lib / grinder.jar: $ CLASSPATH export GRINDERPROPERTIES = / home / lore / Documents / grinder-3 / examples / grinder.properties

Kao što je gore spomenuto, pružamo a brusilica.svojstva datoteka za dodatnu konfiguraciju poput niti, pokretanja, procesa i hostova konzole.

Konačno, konzolu i agente pokrećemo pomoću:

java -classpath $ CLASSPATH net.grinder.Console
java -classpath $ CLASSPATH net.grinder.Grinder $ GRINDERPROPERTIES

4.2. Rezultati ispitivanja

Svaki od testova pokrenuo je 1000 pokretanja sa 100 korisnika / niti. Otpakirajmo neke najvažnije stvari:

Uspješni zahtjeviPogreškeUkupno vrijeme ispitivanjaProsječno vrijeme odziva (ms) Srednja propusnost
Gatling500000 zahtjeva0218-ih422283 zahtjeva / s
JMeter499997 Zahtjevi0237s462101 zahtjeva / s
Brusilica499997 Zahtjevi0221s432280 zahtjeva / s

Rezultati pokazuju da 3 alata imaju sličnu brzinu, a Gatling je malo izdvojio druga 2, na temelju srednje propusnosti.

Svaki alat također pruža dodatne informacije u ugodnijem korisničkom sučelju.

Gatling će generirati HTML izvješće na kraju izvođenja, koje sadrži više grafikona i statistika, za ukupno pokretanje kao i za svaki zahtjev. Evo isječka izvješća o rezultatu testa:

Kada koristimo JMeter, možemo otvoriti GUI nakon probnog rada i generirati HTML izvješće na temelju datoteke dnevnika gdje smo spremili rezultate:

JMeter HTML izvješće također sadrži raščlambu statistike po zahtjevu.

Napokon, The Grinder Console bilježi statistiku za svakog agenta i pokretanje:

Iako je The Grinder velike brzine, dolazi po cijenu dodatnog vremena razvoja i manje raznolikosti izlaznih podataka.

5. Sažetak

Sada je vrijeme da u cjelini pogledamo svaki od alata za ispitivanje opterećenja.

GatlingJMeterBrusilica
Projekt i zajednica996
Izvođenje989
Skriptibilnost / API798
UI986
Izvještaji976
Integracija797
Sažetak8.38.37

Gatling:

  • Čvrst, polirani alat za ispitivanje opterećenja koji daje lijepa izvješća s Scala skriptama
  • Razine podrške za proizvod otvorenog koda i poduzeća

JMeter:

  • Robusni API (kroz GUI) za razvoj testne skripte bez kodiranja
  • Podrška Apache Foundation i sjajna integracija s Mavenom

Brusilica:

  • Alat za brzo testiranje performansi za programere koji koriste Jython
  • Skalabilnost više poslužitelja pruža još veći potencijal za velike testove

Jednostavno rečeno, ako je potrebna brzina i skalabilnost, tada upotrijebite The Grinder.

Ako sjajni interaktivni grafovi pomažu u povećanju performansi i zalažu se za promjenu, tada upotrijebite Gatling

JMeter je alat za kompliciranu poslovnu logiku ili integracijski sloj s mnogim vrstama poruka. Kao dio Apache Software Foundation, JMeter nudi zreo proizvod i veliku zajednicu.

6. Zaključak

Zaključno, vidimo da alati imaju usporedive funkcionalnosti u nekim područjima, dok u drugima blistaju. Pravi alat za pravi posao je kolokvijalna mudrost koja djeluje u razvoju softvera.

Napokon, API i skripte mogu se naći na Githubu.


$config[zx-auto] not found$config[zx-overlay] not found