Terheléses tesztelés mint CI-szolgáltatás a fejlesztők számára

Terheléses tesztelés mint CI-szolgáltatás a fejlesztők számára

A gyakran előforduló probléma, amivel a többtermékes szoftvergyártók szembesülnek, az a mérnökök — fejlesztők, tesztelők és infrastruktúra-adminisztrátorok — kompetenciáinak duplikálása majdnem minden csapatban. Ez a költséges mérnökökre, a terheléses tesztelés szakterületének specialistáira is vonatkozik.

Ahelyett, hogy közvetlen feladataikkal foglalkozna, és egyedi tapasztalatukat felhasználva felépítenék a terheléses tesztelési folyamatot, kiválasztanák a módszert, az optimális metrikák értékeit és megírnák az automatizált teszteket a terhelési profilokhoz, a mérnököknek gyakran nulláról kell felépíteniük a tesztinfrastruktúrát, beállítaniuk a terhelési eszközöket, beintegrálniuk azokat a CI-rendszerekbe, valamint konfigurálniuk a megfigyelést és a jelentések publikálását.

Néhány, a tesztelés során felmerülő szervezeti probléma megoldása, amelyeket a Positive Technologies alkalmaz, megtalálható a másik cikkben. Ebben a cikkben az „terheléses tesztelés mint szolgáltatás” (load testing as a service) koncepció segítségével a terheléses tesztek integrálásának lehetőségeit mutatom be a CI-pipeline-ba. Megtudhatja, hogyan és milyen terhelési forrás Docker image-ek használhatók a CI-pipeline-ban; hogyan csatlakoztathatók a terhelési források a saját CI-projektjéhez a build sablon segítségével; hogyan néz ki egy demopipeline a terheléses tesztek futtatására és az eredmények publikálására. A cikk hasznos lehet a szoftvertesztelők és a CI automatizálók számára, akik elgondolkodtak terhelési rendszerük architektúráján.

A koncepció lényege

A terheléses tesztelés mint szolgáltatás koncepciója lehetővé teszi az Apache JMeter, Yandex.Tank és saját keretrendszereink terhelési eszközeinek integrálását bármilyen folyamatos integrációs rendszerbe. A bemutató példa a GitLab CI-re vonatkozik, de az elvek általánosan alkalmazhatók minden CI-rendszerre.

A terheléses tesztelés mint szolgáltatás egy központosított szolgáltatás a terheléses tesztelés lebonyolítására. A terheléses teszteket dedikált ügynöki pultokban indítják, az eredmények publikálása automatikusan történik a GitLab Pages, Influx DB és Grafana vagy tesztjelentési rendszerekbe (TestRail, ReportPortal stb.). Az automatizálás és a skálázás a lehető legegyszerűbben valósul meg — a GitLab CI projektbe egy egyszerű gitlab-ci.yml sablon hozzáadásával és paraméterezésével.

A megközelítés előnye abban rejlik, hogy az összes CI-infrastruktúra, a terhelési ügynökök, a terhelési forrást képező Docker-képek, a tesztelési folyamatok és a jelentések publikálása egy központosított automatizálási részleg (DevOps mérnökök) által van támogatva, így a terheléses tesztelési mérnökök az értékelések kidolgozására és az eredmények elemzésére tudják összpontosítani erőfeszítéseiket, anélkül hogy az infrastruktúra kérdéseivel foglalkoznának.

Az egyszerűség kedvéért tekintsük úgy, hogy a célzott tesztelendő alkalmazás vagy szerver előre telepítve és konfigurálva van (ehhez automatizált szkriptek használhatók, mint például Python, SaltStack, Ansible stb.). Ekkor a terheléses tesztelés mint szolgáltatás koncepciója három lépésre bontható: előkészítés, tesztelés, jelentések közzététele. További részletek a diagramon (minden kép kattintható):

Terheléses tesztelés mint CI-szolgáltatás a fejlesztők számára

Alapvető fogalmak és definíciók a terheléses tesztelésben

A terheléses tesztelési vizsgálatok során igyekszünk betartani az ISTQB szabványait és metodológiáját,, megfelelő terminológiát és ajánlott metrikákat használva. Röviden összefoglalom a terheléses tesztelés alapvető fogalmait és definícióit.

Terhelési ügynök (load agent) — egy virtuális gép, amelyen futtatni fogják az alkalmazást, amely a terhelést képezi (Apache JMeter, Yandex.Tank vagy egy egyedi terhelési modul).

Tesztelési cél (target) — a szerveren található szerver vagy alkalmazás, amely terhelésnek lesz kitéve.

Tesztelő szcenárió (test case) — egy paraméterezett lépésekből álló halmaz: felhasználói műveletek és a várt reakciók ezen műveletekre, a rögzített hálózati kérésekkel és válaszokkal, a megadott paraméterek függvényében.

Terhelési profil vagy terv (profile) — ehhez tízszer kevesebb hardver szükséges. az ISTQB metodológia szerint (4.2.4. pont, 43. oldal) a terhelési profilok meghatározzák a konkrét teszthez kritikus fontosságú metrikákat és a terhelési paraméterek változásának lehetőségeit a teszt folyamán. A profilok példáit a képen láthatja.

Terheléses tesztelés mint CI-szolgáltatás a fejlesztők számára

Teszt (test) — egy előre meghatározott paraméterkészletű szcenárió.

Teszt terv (test-plan) — tesztek és terhelési profilok együttesen.

Tesztfutás (testrun) — egy teszt egy iterációja egy teljesen megvalósított terhelési szcenárióval és a kapott jelentéssel.

Hálózati kérés (request) — egy HTTP-kérés, amely az ügynöktől a célhoz kerül elküldésre.

Hálózati válasz (response) — HTTP-válasz, amelyet a célküldözőnek küldenek.
HTTP válaszkód (HTTP responses status) — az alkalmazás kiszolgálótól származó szabványos válaszkód.
Tranzakció (transaction) — a "lekérdezés — válasz" teljes ciklusa. A tranzakció akkor kezdődik, amikor a lekérdezés (request) elküldése megtörténik, és akkor ér véget, amikor a válasz (response) fogadása befejeződik.

A tranzakció állapota (transactions status) — a "lekérdezés – válasz" ciklus sikeresen befejeződött-e. Ha a ciklus során bármilyen hiba történt, akkor az egész tranzakció sikertelennek számít.

Válaszidő (latency) — az idő, amely a lekérdezés (request) elküldésének befejezése és a válasz (response) fogadásának megkezdése között eltelt.

Teljesítmény metrikák (metrics) — a terhelési tesztelés során meghatározott jellemzők a terhelt szolgáltatás és a terhelési ügynök vonatkozásában.

Fő metrikák a terhelési paraméterek mérésére

Néhány leggyakrabban használt és ajánlott a módszertanban ISTQB (34. és 52. old.) a metrikák az alábbi táblázatban találhatók. Hasonló metrikák az ügynök és a cél esetében egy sorban szerepelnek.

Metrikák a terhelési ügynöknél
A tesztelést igénylő célrendszer vagy alkalmazás metrikái

Mennyiség  vCPU és memória RAM,
Lemez — a terhelési ügynök "hardveres" jellemzői
CPU, Memória, lemezhasználat — a processzor, memória és lemez terhelésdinamikája
a tesztelés során. Általában százalékban van mérve a
maximálisan elérhető értékek

Hálózati áteresztőképesség (Network throughput) (terhelési ügynöknél) — a hálózati interfész áteresztőképessége
a szerveren,
ahol a terhelési ügynök telepítve van.
Általában bájt per másodperc (bps) értékben van mérve
Hálózati áteresztőképesség (Network throughput)(célon) — a cél szerveren lévő hálózati interfész áteresztőképessége. Általában bájt per másodperc (bps) értékben van mérve
Virtuális felhasználók

— a terhelési forgatókönyveket megvalósító virtuális felhasználók számaés
leutánozzák a valós felhasználók cselekedeteit
Virtuális felhasználók állapota
, Megfelelt/Nem felelt meg/Összes — a virtuális felhasználók sikeres éssikertelen státuszainak száma a terhelési forgatókönyvek során, valamint azok összes száma.
Általában elvárható, hogy minden felhasználó sikeresen el tudja végezni
minden feladatát, amelyet a terhelésprofilban megadtak.

Bármilyen hiba azt jelenti, hogy a valós felhasználó sem tudja
megoldani a feladatát a rendszer használata során.
Kérések másodpercenként (perce)
— a hálózati kérések száma másodpercenként (vagy percenként).

Fontos jellemzője a terhelési ügynöknek: mennyi kérést tud generálni.— количество сетевых запросов в секунду (или минуту).

Важная характеристика нагрузочного агента: сколько он может генерировать запросов.
Valójában ez a virtuális felhasználók általi alkalmazáslekérés szimulálása.
Felelős másodpercenként (percenként)
— a hálózati válaszok száma másodpercenként (vagy percenként).

Fontos jellemzője a célzott szolgáltatásnak: mennyit sikerült
generálni és küldeni a kérdésekre adott válaszokból,
terhelési ügynök

HTTP válaszok állapota— a különböző válaszkódok száma
az alkalmazás szerverétől, amelyeket a terhelési ügynök kapott.
Például a 200 OK sikeres lekérést jelent,
míg a 404 — hogy az erőforrás nem található

Késleltetés (válaszidő) — az az időtartam,
amely a kérés befejezése és a válasz fogadása között telik el.
Általában milliszekundumban (ms) mérik.

Tranzakciós válaszidő— egy teljes tranzakció időtartama,
a "kérés — válasz" ciklus befejezése.
Ez az idő a kérés (request) elküldésének kezdetétől,
a válasz (response) fogadásának befejezéséig tart.

A tranzakció időtartamát más módokon is mérhetjük: a minimumot,
maximumot, átlagot és például a 90. percentilis értéket számítják.
A minimum és maximum értékek a rendszer teljesítményének szélsőséges
állapotait mutatják.
A kilencvenedik percentilis a leggyakrabban használt,
mivel a legtöbb felhasználót jelzi,
akik kényelmesen dolgoznak a rendszer teljesítményének határán.
Tranzakciók másodpercenként (percenként)

— a teljes tranzakciók száma másodpercenként (percenként),
azaz hány kérdést volt képes a rendszer fogadni és
feldolgozni, és hány választ adott.
Valójában ez a rendszer áteresztő képessége.
Tranzakciók állapota

, Sikerült / Nem sikerült / Összesen — a szám sikeres, sikertelen és az összes tranzakció esetében.
Valós felhasználók számára a sikertelen

tranzakció valójában azt jelentheti,
hogy a rendszer terhelés alatt nem működik.
A terheléses tesztelés alapelvei

A terheléses tesztelés alapelvei nagyon egyszerűek és három fő szakaszból állnak, amelyeket már említettem:

Előkészítés — Teszt — Jelentés , vagyis a tesztelési célok és a terhelési források paramétereinek meghatározása, majd a terhelési tesztek végrehajtása, végül pedig a tesztelésről szóló jelentés elkészítése és közzététele.Megjegyzések a sémához:

Terheléses tesztelés mint CI-szolgáltatás a fejlesztők számára

QA.Egység — szakértő a terheléses tesztelés terén,

  • Cél — a célalkalmazás, amelynek teljesítményét terhelés alatt szeretnénk megtudni.
  • Entitások, szakaszok és lépések klasszifikátora a sémában

Szakaszok és lépések

Mi történik
Что происходит
Mi van a bemenet alatt
Mi van a kimenet alatt

Prepare: készítési fázis a teszteléshez

LoadParameters
Feladat és inicializálás
felhasználó által
terhelési paraméterek,
mérők kiválasztása és
tesztterv előkészítése
(terhelési profil)
Felhasználói paraméterek az
terhelés-ügynök inicializálásához
Tesztterv
A tesztelés célja

VM
Virtuális gép felhőben történő telepítése
a kívánt jellemzőkkel
VM paraméterek a terhelés-ügynök számára
Automatizálási szkriptek
VM létrehozásához
Beállított VM
Env
felhőben

OS beállítása és
környezet előkészítése
a terhelés-ügynök működéséhez
Környezet paraméterei a
terhelés-ügynök számára
környezetbeállítások
VM létrehozásához
Előkészített környezet:
OS, szolgáltatások és alkalmazások,
amelyek szükségesek a működéshez
LoadAgents
környezetbeállítások

A terhelés-ügynök telepítése, beállítása és paraméterezése.
Vagy a Docker-kép letöltése
előre beállított terhelésforrással
Terhelésforrás Docker-kép
(JMeter, JM vagy saját keretrendszer)
Beállítási paraméterek
Kész és működésre kész terhelés-ügynök
Test: a terhelési tesztek végrehajtásának szakasza. A források terhelés-ügynökök, amelyek a GitLab CI dedikált ügynökvölgyeiben kerültek telepítésre
környezetbeállítások
A terhelés-ügynök indítása
a kiválasztott teszttervvel

és terhelési paraméterekkel

Betöltés
Felhasználói paraméterek
az inicializáláshoz
Futtatási naplók
terhelési tesztekhez
Rendszernaplók
környezetbeállítások
Tesztterv
A tesztelés célja
A cél és a terhelés-ügynök mutatóinak dinamikája
RunAgents
A terhelés-ügynök által végrehajtott
tesztforgatókönyvek

a terhelési profillal
A terhelés-ügynök interakciója
a tesztelési céllal
a következő szerint
A 'nyers' naplók gyűjtése
a terhelési tesztelés során:
a terhelés-ügynök tevékenységéről készült feljegyzések,
Tesztterv
A tesztelés célja

Naplófájlok
a tesztelési cél állapotáról
és a VM-ről, amelyen fut a ügynök
A nyers mutatók gyűjtése a tesztelés során
A cél mutatóinak dinamikája
és a terhelés-ügynök

A cél és a terhelés-ügynök mutatóinak dinamikája
RunAgents
A terhelés-ügynök által végrehajtott

Metrikák
Report: a tesztelési jelentés készítési szakasza

Generator
A begyűjtött

terhelési rendszer és

monitoring rendszer nyers
mutatóinak és naplóinak feldolgozása
Jelentés készítése
emberi olvasásra alkalmas formátumban,
lehetőséggel
elemzések elemeivel
A mutatók dinamikája
a cél és a terhelés-ügynök
Feldolgozott 'nyers' naplók
A cél és a terhelés-ügynök mutatóinak dinamikája
RunAgents
A terhelés-ügynök által végrehajtott
olyan formátumban, amely alkalmas
külső tárolókba történő kiadásra
Statikus jelentés a terhelésről,
mely alkalmas az emberi elemzésre
A jelentés közzététele
a terhelési
tesztelésről külső

Publish
szolgáltatásban
Feldolgozott 'nyers'
тестировании во внешнем
сервисе
Обработанные «сырые»
napló formátumban, amely alkalmas
külső
tárhelyekre
A külső
tárhelyen tárolt jelentések a
terhelésről, amelyek alkalmasak
emberi elemzésre

Terhelési források csatlakoztatása a CI sablonban

Lépjünk a gyakorlati részre. Szeretném bemutatni, hogyan valósítottuk meg a terheléses tesztelés szolgáltatásként néhány projektünkben a Positive Technologies cégünknél.

Először DevOps mérnökeink létrehoztak a GitLab CI-ben egy külön ügynökpultot a terhelési tesztek futtatásához. Annak érdekében, hogy ne keverjük össze őket más sablonokban, például a build ügynökökkel, címkéket adtunk ezeknek az ügynököknek, címkék: load. Bármilyen más érthető címke is használható. Ezeket a regisztráció során állítjuk be GitLab CI Runners. Hogyan tudhatjuk meg a szükséges hardvererőforrást? A terhelési ügynökök jellemzőit - elegendő számú vCPU, RAM és lemez - az alapján lehet kiszámítani, hogy az ügynökön futnia kell Dockernek, Python-nak (a Yandex.Tank számára), a GitLab CI ügynöknek, Javának (az Apache JMeter számára). A JMeter-hez ajánlott legalább 512 MB RAM-ot használni Java alatt, és a felső határként

a rendelkezésre álló memória 80%-a Ezért tapasztalataink alapján javasoljuk, hogy a terhelési ügynököknél legalább: 4 vCPU, 4 GB RAM és 60 GB SSD legyen. A hálózati kártya sávszélessége a terhelési profil követelményei alapján kerül meghatározásra..

Nálunk főként két terhelési forrást használunk – az Apache JMeter és a Yandex.Tank Docker képeit.

Yandex.Tank

– ez a Yandex nyílt forráskódú eszköze a terheléses tesztelés lebonyolítására. A moduláris architektúráján alapuló, nagy teljesítményű aszinkron, hit-alapú HTTP kérésgenerátor, a Phantom áll a középpontjában. A Tank beépített monitorozást kínál a tesztelt szerver erőforrásairól SSH protokollon keresztül, képes automatikusan leállítani a tesztet adott feltételek mellett, és az eredményeket konzolra és grafikonokra is ki tudja adni, emellett saját modulokat is csatlakoztathatunk a funkcionalitás bővítéséhez. Egyébként használtuk a Tankot, amikor ez még nem volt mainstream. A „ Yandex.Tank és a terheléses tesztelés automatizálása„ címen olvashatjuk a történetet, hogyan végeztünk terheléses tesztelést 2013-ban azPT Appllication Firewall – a cégünk egyik terméke. Apache JMeter

Apache JMeter — ez egy nyílt forráskódú eszköz terheléses teszteléshez, amelyet az Apache fejlesztett. Egyaránt jól használható statikus és dinamikus webalkalmazások tesztelésére. A JMeter hatalmas mennyiségű protokollt és interakciós módot támogat az alkalmazásokkal: HTTP, HTTPS (Java, NodeJS, PHP, ASP.NET stb.), SOAP / REST Webszolgáltatások, FTP, TCP, LDAP, SMTP(S), POP3(S) és IMAP(S), adatbázisok JDBC-n keresztül, képes shell parancsokat végrehajtani és Java objektumokkal dolgozni. A JMeter rendelkezik IDE-vel a teszttervek létrehozásához, hibakereséséhez és végrehajtásához. CLI is rendelkezésre áll bármilyen Java-kompatibilis operációs rendszer parancssorában (Linux, Windows, Mac OS X). Az eszköz képes dinamikusan HTML-jelentést generálni a tesztelésről.

A vállalatunkon belüli használhatóság érdekében, hogy a tesztelők maguk is módosíthassák és hozzáadhassák a környezetet, Docker képek terhelési forrásokhoz készítünk GitLab CI alatt, amelyek a belső docker registry-be publikálódnak az Artifactory-ba.Így gyorsabban és egyszerűbben csatlakoztathatók a terheléses teszteléseket lebonyolító pipeline-okhoz. Hogyan végezheti el a docker push-t a registry-be a GitLab CI segítségével — nézze meg a utasítást.

A Yandex.Tank alap Docker fájlja ez volt:

Dockerfile 
1 | FROM direvius/yandex-tank
2 | ENTRYPOINT [""]

Az Apache JMeter számára pedig ez:

Dockerfile 
1 | FROM vmarrazzo/jmeter
2 | ENTRYPOINT [""]

A folyamatos integrációs rendszerünk felépítéséről a "A fejlesztési folyamatok automatizálása: hogyan valósítottuk meg a DevOps ötleteket a Positive Technologies-nél».

Template és pipeline

A terheléses teszteléshez készült sablon példája elérhető a demo-load. A readme-fájlban olvasható el a sablon használati utasítása. Magában a sablonban (fájl .gitlab-ci.yml) megjegyzések vannak arról, hogy egyes lépések milyen feladatokért felelnek.

A sablon nagyon egyszerű, és bemutat három lépést a terheléses tesztelés során, amelyek fentebb a diagramon láthatók: előkészítés, tesztelés és jelentés publikálása. Ezt a stages: Prepare, Test és Report.

  1. Fázis Prepare kell használni a tesztelési célok előzetes beállítására vagy elérhetőségük ellenőrzésére. A terhelési források környezetét nem szükséges beállítani, ezek előre elkészítve docker képekként vannak, és elérhetők a docker registry-ben: elegendő, ha megadja a szükséges verziót a Test lépésnél. De lehetőség van az újragyártására is, hogy saját módosított képeket készítsen.
  2. Fázis Teszt A terhelési források meghatározására, tesztek futtatására és a tesztelési artefaktumok megőrzésére használható. Bármilyen terhelési forrás választható: Yandex.Tank, Apache JMeter, saját vagy mind együttesen. A nem kívánt források egyszerűen kikapcsolhatók a job megjegyzésbe tétele vagy törlése által. Belépési pontok a terhelési források számára:

    Megjegyzés: Az építési konfigurációs sablon a CI-rendszerrel való interakció beállítására szolgál, és nem tartalmazza a tesztek logikáját. A tesztekhez meg kell adni a belépési pontot, ahol a vezérlő bash-script található. A tesztek indításának módját, a jelentések létrehozását és a tesztforgatókönyveket a QA mérnököknek kell megvalósítaniuk. A bemutató példában mindkét terhelési forrás esetén a Yandex főoldalának alapvető tesztje található. A forgatókönyvek és a tesztek paraméterei a könyvtárban találhatók ./tests.

  3. A szakaszban Jelentés le kell írni a tesztelési eredmények külső tárolókba, például GitLab Pages-be történő közzétételének módjait, amelyeket a Teszt szakaszban kaptunk. A GitLab Pages számára szükséges, hogy a tesztelés befejezése után a ./public könyvtár nem legyen üres, és legalább egy index.html fájlt tartalmazzon. A GitLab Pages szolgáltatás működésének sajátosságairól itt olvashat a linken.

    Példák, hogyan exportálhat adatokat:

    A közzététel beállításához szükséges utasítások:

A bemutató példában a terheléses tesztek és két terhelési forrás (a nem kívánt letiltható) csővezeték így néz ki:

Terheléses tesztelés mint CI-szolgáltatás a fejlesztők számára

Az Apache JMeter képes önállóan létrehozni HTML-jelentést, ezért érdemes ezt GitLab Pages-en keresztül a beépített eszközökkel megőrizni. Itt látható az Apache JMeter jelentése:

Terheléses tesztelés mint CI-szolgáltatás a fejlesztők számára

A bemutató példában a Yandex.Tank esetében csak a hamis szöveges jelentés látható a GitLab Pages részben. A tesztelés során a Tank képes az eredményeket InfluxDB-be menteni, ahonnan például Grafanába is ki lehet őket ábrázolni (a beállítás a fájlban található ./tests/example-yandextank-test.yml). Itt látható, hogyan néz ki a Tank jelentése Grafanában:

Terheléses tesztelés mint CI-szolgáltatás a fejlesztők számára

Összefoglaló

A cikkben a "terhelés tesztelés mint szolgáltatás" (load testing as a service) koncepcióját ismertem. A fő gondolat az előre beállított terhelési ügynökök, a terhelési források Docker-képeinek, a jelentési rendszerek és a GitLab CI-ben egy egyszerű .gitlab-ci.yml sablon alapján összegyűjtött pipeline használatában rejlik. (példa a linken). Mindezt egy kis automatizálási mérnöki csapat támogatja, és a termékcsapatok igényeire alapján másolható. Remélem, ez segíteni fog Önnek hasonló megoldás előkészítésében és megvalósításában a vállalatában. Köszönöm a figyelmét!

P. S. Szeretnék köszönetet mondani kollégáimnak, Sergey Kurbanovnak és Nikolai Yusevnek, a load testing as a service koncepció megvalósításához nyújtott technikai segítségükért cégünknél.

Szerző:: Timur Gilmullin — a Positive Technologies fejlesztési technológiai és folyamatvezető helyettese

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster