Alkalmazás tesztelés Apache JMeter-rel
Időt és pénzt spórolhat a vállalat azzal, ha már a fejlesztés korai szakaszában teljesítmény szempontjából teszteli az adott alkalmazást, legyen szó webszolgáltatásról, adatbázisról, szerveroldali rendszerekről. A teljesítmény teszteléshez az egyik legjobb megoldásnak a nyílt forráskódú, Java-alapú teljesítménytesztelő eszköz, az Apache JMeter számít, amelyet a LogiNet a közép- és nagyvállalati környezetben tesztelt, alkalmazott.
A fejlesztés korai szakaszában a teljesítmény tesztelés kulcsfontosságú ahhoz, hogy időben kiderüljön, milyen megbízhatóan tud működni az adott rendszer végfelhasználói környezetben. A hangsúly tehát azon van, hogy az alkalmazás, webszolgáltatás milyen teljesítményt mutat a változó munkaterhelési és forgalmi szintek esetén. Ez segít abban, hogy még időben észlelni lehessen a problémákat, megelőzhetőek legyenek a váratlan terhelés miatti esetleges leállások, amelyek kijavítása így még kisebb költséggel elvégezhető.
A teszteléshez számos eszköz közül választhatunk, licenszköteles, illetve nyílt forráskódú szoftverek közül egyaránt. Az egyik legjobb megoldásnak a JMeter számít: az ingyenes és nyílt forráskódú terhelés- és teljesítmény tesztelő eszközt az Apache Foundation fejleszti. Alkalmas különböző típusú alkalmazások, webszolgáltatások, adatbázisok és egyéb szerveroldali rendszerek teljesítményének tesztelésére. A segítségével lehetőség van a válaszidők, terhelési kapacitás, és egyéb teljesítmény mutatók mérésére, az alkalmazások teljesítményének optimalizálására.
Milyen előnyei vannak a JMeter-nek?
- Széles körű támogatás. A JMeter egyszerűen, a hivatalos weboldalról letölthető. Támogatja a különböző protokollokat és technológiákat, beleértve az HTTP, HTTPS, JDBC, FTP, JMS, LDAP, SOAP, és sok mást, így sokféle rendszer és alkalmazás tesztelésére alkalmas.
- Felhasználói forgalom szimulációja. Segítségével lehetőség van a felhasználói forgalom szimulálására, azaz hogyan reagálna egy alkalmazás egyidejűleg több felhasználóra, vagy mekkora terhelést bírna el egy adott szerver.
- Funkcionális tesztelés. A JMeter nem csak a teljesítményt, hanem a funkcionális működést is tesztelni képes. Ez azt jelenti, hogy lehetőség van HTTP kérések, adatbázis lekérdezések, vagy más típusú kérések automatizált tesztelésére.
- Grafikus felhasználói felület (GUI). A JMeter egy grafikus felhasználói felülettel rendelkezik, ami lehetővé teszi a tesztek könnyű konfigurálását, futtatását és eredményeinek elemzését. Emellett lehetőség van a parancssori mód használatára is a tesztek automatizálásához.
- Bővíthetőség. A JMeter moduláris struktúrával rendelkezik, ami lehetővé teszi a funkcionalitásának kiterjesztését és testreszabását a felhasználói igényeknek megfelelően.
Hogyan végezzük a performancia tesztet?
- Tesztkörnyezet meghatározás. Mielőtt elkezdenénk az adott rendszer tesztelését, az ügyféllel közösen célszerű meghatározni, milyen tesztkörnyezetben folyjon a tesztelés. Ide sorolható többek között, hogy mit tudunk a felhasználókról, hogyan és honnan fogják elérni a rendszert? Milyen fizikai kapcsolatuk van (kapcsolat sebessége stb.)? Milyen kliens oldali alkalmazással teszik ezt? Milyen hardware-rel rendelkezik a szerver, illetve a kliens? Milyen processzorral, memóriával dolgoznak?
- Kilépési feltétel meghatározása. Érdemes meghatározni a kilépési pontokat a teljesítmény mutatók segítségével, azaz mikor tekintjük befejezettnek az egész folyamatot. Ilyen konkrétumok lehetnek, mint például 1000 felhasználót „bírjon el” a weboldal, azaz elfogadható válasz időn belül még elérhető legyen, vagy, hogy 500 felhasználói után is 40 ms alatt legyen a válaszidő.
- Tesztek megtervezése. A tesztek megtervezésénél meg kell határozni a teljes tesztforgatókönyvet: milyen felhasználókat fogunk ráereszteni a rendszerre? Milyen felhasználói esetet szimuláljunk? Milyen tesztadatokkal fogunk dolgozni? Mivel fogjuk ezeket generálni? Itt tervezünk meg minden részletet a későbbi megvalósításhoz.
- Tesztkörnyezet konfigurálása. Ahhoz, hogy egy rendszert terhelésnek vessük alá, elő kell készítenünk a tesztkörnyezetet. Itt érdemes az éles környezethez leginkább hasonló, jó esetben megegyező környezetet létrehozni annak érdekében, hogy a teszt megfelelő adatokkal szolgáljon. Ki kell választani a megfelelő monitorozó eszközöket/toolokat.
Teszt létrehozása
Thread Group hozzáadása a Test Plan-hez. Ennek keretében állíthatók be a paraméterek, mint a felhasználók száma, a felfutási idő (pl. teljes terhelést 10 perc alatt érje el), összesen hány iterációt fusson, illetve mennyi ideig fusson.Ha ezzel megvagyunk, ez alá tudjuk felvenni a kéréseket (pl. HTTP Request), ahhoz pedig, hogy láttuk a futás eredményét, listenert kell hozzáadni.
JMeter funkciói
Különböző controllerek alá tudjuk szervezni a tesztet, annak megfelelően, hogy milyen milyen logikát szeretnénk megvalósítani. Így lehet If Controller, Loop Controller, While Controller, Switch Controller, Transaction Controller, Random Controller, Once Only Controller, ForEach Controller.
Az Assertion a JMeter egyik alapvető funkciója, ami lehetővé teszi a válaszok automatikus ellenőrzését a teszt során. Ezt a Request-ek alá tudjuk szervezni. A Response Assertion lehetővé teszi a válaszok ellenőrzését a teszt során, és ellenőrzi, hogy a válaszok tartalmazzák-e a várt mintát, vagy kifejezést. A JSON tesztelésére van egy külön JSON Assertion, ami lehetővé teszi a JSON Response-ok ellenőrzését.
A Timer akkor hasznos, ha szabályozni szeretnénk a kérések közötti időzítést a tesztek során. Segítségükkel szimulálni lehet a valós körülmények közötti váratlan kérések közötti késlekedéseket. A különböző Request-ek vagy Request csoportok közé tudjuk be tudjuk tenni, hogy például 20 mp-et várjon a következő Request előtt, vagy random várjon valamennyi időt, vagy meg tudjuk adni, hogy például 10 és 20 mp között valamilyen random időpontot várjon, mielőtt a következő Request-et meghívja.
A Pre-Processor-ok olyan elemek, amelyek előkészítő műveleteket végeznek a Sampler-ek előtt. Segítségükkel lehetőség van adatok előkészítésére, változók beállítására, HTTP kérések előtti beállításokra, stb. Különböző nyelveken tudjuk írni ezeket. A JMeter számos Pre-Processor típust kínál (pl. User Parameters Pre-Processor, JSR223 Pre-Processor, BeanShell Pre-Processor), amelyek mindegyike különböző célokra használható. A Pre-Processor-okat általában a Sampler elemek alatt helyezik el a teszttervben, ami lehetővé teszi a specifikus előkészítő műveletek végrehajtását az adott Sampler előtt.
A Post-Processor hasonló a Pre-Processor-okhoz, ezek a Sampler után végzik a feldolgozó műveleteket. Segítségükkel lehetőség van a válaszok feldolgozására, adatok kinyerésére, változók beállítására. A JMeter számos Post-Processor típust kínál, melyek mindegyike különböző célokra használható, például a válaszokból adatok kinyerésére (pl. Regular Expression Extractor, JSON Extractor, XPath Extractor). A Post-Processor-okat általában a Sampler elemek alatt helyezik el a teszttervben, ami lehetővé teszi a specifikus feldolgozási műveletek végrehajtását az adott Sampler után. A leggyakoribb felhasználása a Post-Processoroknak az adatkinyerés a válaszokból, például a Regular Expression Extractor segítségével lehetőség van egy HTML vagy JSON válaszból kinyerni bizonyos adatokat.
A Config Element-ek esetében különböző típusok vannak. Így például a HTTP Request Default, a User Defined Variables, a HTTP Cookie Manager, a HTTP Header Manager, a CSV Data Set Config.
A Test Fragment elem egy speciális típusú vezérlő, amely a Test Plan-ben a Thread Group elemmel azonos szinten található. Ez abban különbözik a Thread Grouptól, hogy akkor kerül végrehajtásra, ha egy Module Controller vagy egy Include Controller hivatkozik rá. Ez az elem kizárólag a tesztterveken belüli kód újrafelhasználására szolgál.
Lehet bővíteni a JMeter-t plugin-okkal, ezt a plugins-manager.jar oldalról lehet megtenni, saját tesztjeinkben tudjuk használni.
Lehetőség van felvenni az oldal működését, azaz rögzíteni a HTTP vagy HTTPS forgalmat - ez a Test Script Recorder eszköz, amellyel létrehozhatunk JMeter tesztterveket. A létrehozott tesztterveket tovább lehet finomítani a tesztelendő funkcionalitásnak megfelelően.
A teszt futtatásra több lehetőség is van:
- GUI mód: ebben a módban könnyen elkészíthetők, szerkeszthetők és futtathatók a tesztek a felhasználóbarát felületen keresztül.
- A parancssoros (CLI) mód lehetővé teszi a tesztek automatizálását és futtatását parancssorból. Ez különösen hasznos lehet a CI / CD folyamatokban.
- A JMeter tesztek egy vagy több gépen is futtathatók, amelyek lehetnek a tesztelő szerverek. Ebben a módban a tesztek részei szét vannak osztva és párhuzamosan futnak, ami növelheti a terhelést és jobb teljesítményt eredményezhet.
Eredmények elemzése
Két fontos mérőszámot kapunk a tesztek eredményének (csv) feldolgozását követően:
- Áteresztő képesség (Throughput): a rendszer, folyamat képességét jelenti arra, hogy mennyi adatot vagy folyamatot tud átengedni vagy kezelni egy adott idő alatt.
- Hibaarány (Error): összes request-ből mennyi lett hibás a teszt futása alatt
Lehetőség van HTML riport generálására, ezt GUI felületről de CLI módból is meg tudjuk tenni.
Riport tartalma:
- Összefoglaló: Eredmények rövid összefoglalása
- Projekt összefoglaló: Rövid leírása a tesztelt szoftvernek
- Mérési módszertan: Mérési módszertan részletes ismertetése
- Eredmények: Futtatások alakulása, értékelése; áteresztő képesség és hibaarányok elemzése
- Szerver oldali mérések (szerver monitorozó alkalmazásokból grafikonok (pl.: grafana): CPU, Memória, Disk
Példák JMeter tesztekre
Az egyik nagyvállalati ügyfelünk esetében a teszt célja az volt, hogy meghatározzuk, a vállalat által megadott körülbelül háromszoros forgalomnövekedés milyen terhelés növekedéssel jár, és ezáltal milyen szerver kapacitás növelés szükséges. A valós forgalmat és a teszt eredményeit együttesen vizsgálva azt az eredményt kaptuk, hogy szükséges az adatbázis szerverek teljesítmény növelése, és egy plusz webszerver beállítása.
Egy másik nagyvállalati ügyfelünknél a megörökölt load teszt javítása, továbbfejlesztése, több funkcióval történő kiegészítése történt meg. Több teszt is készült, ami az alkalmazás különböző részeit tesztelte.