
Ăks probleemidest, millega tarkvarade arendajad sageli silmitsi seisavad, on inseneride - arendajate, testijate ja infrastruktuuri administraatorite - oskuste kopeerimine peaaegu igas meeskonnas. See kehtib ka kallite inseneride kohta, kes on spetsialiseerunud koormustestimisele.
Kuna nad ei saa tegeleda oma otseste kohustustega ja kasutada oma ainulaadset kogemust koormustestimise protsessi ĂŒlesehitamiseks, metodoloogia valimiseks, optimaalseid mÔÔdikute vÀÀrtusi seadmiseks ning koormuse profiilidega vastavuses automaatkatseid kirjutades, peavad insenerid sageli nullist ĂŒles seadma test infrastuktuuri, seadistama koormuse tööriistu, integreerima neid CI-sĂŒsteemidesse, seadistama jĂ€lgimise ja aruannete avaldamise.
MĂ”ningaid organisatsioonilisi probleemide lahendusi testimises, mida rakendame Positive Technologies'is, leiate . Selles artiklis rÀÀgin koormustestide integreerimise vĂ”imalusest CI-torustikku, kasutades kontseptsiooni "koormustestimine teenusena" (load testing as a service). Te peate, kuidas ja milliseid koormuse allikaid docker-pilte saab CI-torustikus kasutada; kuidas integreerida koormuse allikad oma CI-projektiga ehitusmalli kaudu; kuidas nĂ€eb vĂ€lja demo-pipeline koormustestide kĂ€ivitamiseks ja tulemuste avaldamiseks. Artikkel vĂ”ib olla kasulik tarkvaratestijate ja CI automatiseerijate jaoks, kes on mĂ”elnud oma koormussĂŒsteemi arhitektuuri ĂŒle.
Kontseptsiooni olemus
Kontseptsioon "koormustestimine teenusena" tĂ€hendab vĂ”imalust integreerida koormustööriistu Apache JMeter, Yandex.Tank ja enda raamistikud igasugusesse pideva integratsiooni sĂŒsteemi. Demona on GitLab CI, kuid esitatud pĂ”himĂ”tted kehtivad kĂ”ikide CI-sĂŒsteemide puhul.
"Koormustestimine teenusena" on tsentraliseeritud teenus koormustestimise lĂ€biviimiseks. Koormustestid kĂ€ivitatakse eraldi agentide basseinides, tulemuste avaldamine toimub automaatselt GitLab Pagesis, Influx DB-s ja Grafanas vĂ”i testide aruandluse sĂŒsteemides (TestRail, ReportPortal jne). Automatiseerimine ja skaleerimine rakendatakse vĂ”imalikult lihtsalt - lihtsalt GitLab CI projekti sisestades ja parametriseerides tavapĂ€rast gitlab-ci.yml malli.
KĂ€e eelis seisneb selles, et kogu CI-infrastruktuur, koormuse agente, koormusallika dokkeripildid, testimise ja aruandluse torud â toetab keskne automatiseerimise osakond (DevOps-insenerid), samas kui koormustestimise insenerid saavad keskenduda oma jĂ”upingutustele testide arendamisele ja nende tulemuste analĂŒĂŒsimisele, mitte tegeleda infrastruktuuri kĂŒsimustega.
Lihtsuse huvides eeldame, et sihtotstarbeline testitav rakendus vĂ”i server on eelnevalt ĂŒles seatud ja konfigureeritud (selleks vĂ”ivad olla kasutatud automatiseeritud skriptid Pythonis, SaltStackis, Ansible'is jne). Sel juhul mahub kogu koormustestimise kontseptsioon teenusena kolme etapi: valmistamine, testimine, aruannete avaldamine. Ăksikasjad on toodud skeemil (kĂ”ik pildid on klikitavad):
Peamised mÔisted ja mÀÀratlemised koormustestimises
Koormustestimise lĂ€biviimisel pĂŒĂŒame jĂ€rgida , kasutame vastavaid termineid ja soovitatud mÔÔdikuid. Toome lĂŒhikese loetelu peamistest mĂ”istetest ja mÀÀratlemistest koormustestimises.
Koormuse agent (load agent) â virtuaalne masin, millel kĂ€ivitatakse rakendus â koormuse allikas (Apache JMeter, Yandex.Tank vĂ”i kohandatud koormuse moodul).
Testimise eesmĂ€rk (target) â server vĂ”i rakendus, mis on serveris installitud ja millele koormust rakendatakse.
Testimise stsenaarium (test case) â parametreeritud sammude kogum: kasutajate toimingud ja oodatavad reaktsioonid nendele toimingutele, fikseeritud vĂ”rgu pĂ€ringutega ja vastustega sĂ”ltuvalt mÀÀratud parameetritest.
Koormuse profiil vĂ”i plaan (profile) â (p. 4.2.4, lk 43) koormuse profiilid mÀÀratlevad konkreetse testi jaoks kriitiliselt olulised mÔÔdikud ja koormuse parameetrite muutmise vĂ”imalused testi kĂ€igus. Profiilide nĂ€iteid nĂ€ete joonisel.
Test (test) â stsenaarium, millel on eelnevalt mÀÀratletud parameetrite kogum.
Testimisplaan (test-plan) â testide ja koormuse profiili kogum.
Testimisjooks (testrun) â ĂŒhe testi kĂ€ivitamise ĂŒks iteratsioon tĂ€ielikult tĂ€idetud koormuse stsenaariumiga ja saadud aruandega.
VĂ”rgu pĂ€ring (request) â HTTP-pĂ€ring, mis saadetakse agente eesmĂ€rgile.
VĂ”rgu vastus (response) â HTTP-vastus, mis saadetakse sihtpunktist agendile.
HTTP vastuse kood (HTTP responses status) â standardne vastuse kood rakenduste serverilt.
Tehing (transaction) â tĂ€iskĂ€ik "pĂ€ring â vastus". Tehing loetakse algusest, kui pĂ€ringu (request) saatmine algab, kuni vastuse (response) vastuvĂ”tmise lĂ”puni.
Tehingu staatus (transactions status) â kas Ă”nnestus edukalt lĂ”petada "pĂ€ring â vastus" tsĂŒkkel. Kui selles tsĂŒklis oli mingisugune viga, siis kogu tehing loetakse ebaĂ”nnestunuks.
Latentsusaeg (latency) â aeg pĂ€ringu (request) saatmise lĂ”pust kuni vastuse (response) vastuvĂ”tmise alguseni.
MÔÔdikud (metrics) â omadused, mida mÀÀratletakse koormustestimise kĂ€igus koormatava teenuse ja koormusagendi protsessis.
Peamised mÔÔdikud koormuse parameetrite mÔÔtmiseks
MĂ”ned kĂ”ige levinumad ja soovitatavad meetodid (lk 36, 52) mÔÔdikud on esitatud allolevas tabelis. Sarnased mÔÔdikud agendi ja sihtpunkti jaoks on esitatud ĂŒhel real.
Koormusagendi mÔÔdikud
Testitava sihtsĂŒsteemi vĂ”i rakenduse mÔÔdikud koormuse all
Kogus  vCPU ja mÀlu RAM,
Ketas â koormusagendi "rauda" omadused
CPU, MĂ€lu, ketta kasutus â protsessori, mĂ€lu ja ketta koormuse dĂŒnaamika testimise kĂ€igus. Tavaliselt mÔÔdetakse protsentides maksimaalselt kĂ€ttesaadavatest vÀÀrtustest
maksimaalselt kÀttesaadavad vÀÀrtused
VÔrguliiklus
(koormusagendil) â vĂ”rgu liidese lĂ€bilaskevĂ”ime serveris,
kus koormusagent on installitud.
Tavaliselt mÔÔdetakse baitides sekundis (bps)
(sihtpunktil) â vĂ”rgu liidese lĂ€bilaskevĂ”ime
(koormusagendil) â vĂ”rgu liidese lĂ€bilaskevĂ”imesihtserveris. Tavaliselt mÔÔdetakse baitides sekundis (bps)
Virtuaalsed kasutajad
â virtuaalsete kasutajate arv,kes viivad ellu koormusstsenaariume ja
simuleerivad reaalseid kasutaja tegevusi
Virtuaalsete kasutajate staatus
, LĂ€bimine/EbaĂ”nnestumine/Kokku â edukate jaebaĂ”nnestunud virtuaalsete kasutajate staatuste arv
koormusstsenaariumide jaoks ning nende koguarv.
Tavaliselt eeldatakse, et kÔik kasutajad suudavad tÀita
kĂ”iki oma ĂŒlesandeid, mis on toodud koormuse profiilis.
Iga viga tÀhendaks, et ka reaalne kasutaja ei saaks
oma ĂŒlesannet sĂŒsteemis lahendada.
PĂ€ringud sekundis (minuuti)
â vĂ”rgu pĂ€ringute arv sekundis (vĂ”i minutis).Oluline omadus koormusagendi jaoks: kui palju ta suudab genereerida pĂ€ringuid.
Oluline omadus koormusagendi puhul: kui palju ta saab pÀringuid genereerida.
Tegelikult on see rakendusse virtuaalsete kasutajate pöördumise simuleerimine.
Responses per second (minute)
â vĂ”rgureaktsioonide arv sekundis (vĂ”i minutis).
Sihtteenuse oluline omadus: kui palju Ônnestus
genereerida ja saata vastuseid pÀringutele
koormuse agendi poolt.
HTTP responses statusâ erinevate vastusekoodide arvu
rakenduse serverilt, mida koormuse agent sai.
NÀiteks, 200 OK tÀhistab eduka pöördumise
ja 404 â et ressurssi ei leitud.
Latency (vastuse aeg) â aeg pĂ€ringu saatmise lĂ”pust
vastuse vastuvÔtu alguseni.
Tavaliselt mÔÔdetakse millisekundites (ms).
Transaction response timeâ ĂŒhe tĂ€ieliku tehingu aeg,
tsĂŒkli "pĂ€ring â vastus" lĂ”petamine.
See on aeg pÀringu saatmise algusest
vastuse vastuvÔtu lÔpetamiseni.
Tehingu aega vÔib mÔÔta mitmel viisil: arvesse vÔetakse minimaalne,
maksimaalne, keskmine ja nÀiteks 90. percentiil.
Minimaalsed ja maksimaalsed nĂ€idud on sĂŒsteemi jĂ”udluse ÀÀrmuslikud
seisundid.
Kaupa 90. percentiil kasutatakse kÔige sagedamini,
sest see nÀitab enamiku kasutajate,
kes töötavad mugavalt sĂŒsteemi jĂ”udluse piiril.
Transactions per second (minute)
â tĂ€ielike tehingute arv sekundis (minutis), st kui palju rakendus suutis vastu vĂ”tta ja
töödelda pÀringuid ning anda vastuseid.
Tegelikult on see sĂŒsteemi lĂ€bilaskevĂ”ime.
Transactions status
, Passed / Failed / Total â edukate, ebaĂ”nnestunud ja kogutehingute arvu.
Reaalsete kasutajate jaoks tĂ€hendab ebaĂ”nnestunud tehing tegelikult sĂŒsteemi töövĂ”imetust koormuse all.
Koormustestimise pÔhimÔtteline skeem
Koormustestimise pÔhimÔtteline skeem on vÀga lihtne ja koosneb kolmest pÔhietapist, millest olen juba rÀÀkinud:
Prepare â Test â Report
, st testimise eesmÀrkide ettevalmistamine ja parameetrite seadmine koormusallikatele, seejÀrel koormustestide teostamine ja lÔpuks testimise aruande koostamine ja avaldamine.
MĂ€rkus skeemi kohta:
QA.Tester â koormustestimise ekspert, Target â sihtrakendus, mille kĂ€itumist koormuse all tuleb teada.Klassifitseerija objektide, etappide ja sammude jaoks skeemil.
Etapid ja sammud
- Mis toimub?
- Klassifitseerijate erinevad osad
Etapp 1
Etapp 2
Etapp 3
Sisend
VĂ€ljund
Prepare: testimise ettevalmistamise etapp
LoadParameters
Ălesanne ja initsialiseerimine
kasutaja poolt
koormuse parameetrid,
mÔÔdikute valimine ja
testiplaani ettevalmistamine
(koormuse profiil)
Kohandatud parameetrid
koormuse agendi initsialiseerimiseks
Testiplaan
Testimise eesmÀrk
VM
Pilves kasutuselevÔtt
virtuaalse masina
nÔutud spetsifikatsioonidega
VM-i parameetrid koormuse agendi jaoks
Automatiseerimise skriptid
VM-i loomiseks
Seadistatud VM pilves
Env
OoperisĂŒsteemi seadistamine ja keskkonna ettevalmistamine
koormuse agendi tööks
Keskkonna parameetrid
koormuse agendi jaoks
keskkonna seadistamine
Valmistatud keskkond:
Automatiseerimise skriptid
OoperisĂŒsteem, teenused ja rakendused,
milleks on vajalik
LoadAgents
Koormusagendi installimine, seadistamine ja parameetriseerimine.
Valmistatud keskkond:
VÔi allalaadimine Docker-pildist
ette seadistatud koormuse allikaga
Docker-pilt koormuse allikast
(YT, JM vÔi isekirjutatud raamistik)
Seadistusparameetrid
Seadistatud ja töövalmis
koormuse agent
Test: koormustestide sooritamise etapp. Allikateks on koormuse agendid, mis on juurutatud eraldatud agentide basseinidesse GitLab CI jaoks
Valmistatud keskkond:
Koormuse agendi kÀivitamine
valitud testiplaani
ja koormuse parameetritega
Laadi
Kohandatud parameetrid
initsialiseerimiseks
Teostamise logid
koormustestide
SĂŒsteemi logid
Valmistatud keskkond:
Testiplaan
Testimise eesmÀrk
MÔÔdikute dĂŒnaamika
sihtmÀrgi ja koormuse agendi
RunAgents
Ageneti tÀitmine
koormustestide stsenaariumitega
koormuse profiliga
Koormuse agendi interaktsioon
vastavalt
testimise eesmÀrgiga
Logid
Toored logid
Testiplaan
Testimise eesmÀrk
koormustestimise protsessis:
logikirjed koormuse agendi tegevustest,
katse sihtmÀrgi olek
ja VM, millel agent töötab
MÔÔdikud
Toored mÔÔdikud testimise kÀigus
MÔÔdikute dĂŒnaamika
sihtmÀrgi ja koormuse agendi
RunAgents
MÔÔdikute dĂŒnaamika
sihtmÀrgi ja koormuse agendi
Aruanne: testiaruande ettevalmistamise etapp
Generator
Kogutud töötlemine
koormussĂŒsteemi ja
seire sĂŒsteem toored
mÔÔdikud ja logid
Aruande koostamine
inimese loetavas formaadis,
vĂ”imalikult analĂŒĂŒsielementidega
MÔÔdikute dĂŒnaamika
sihtmÀrgi ja koormuse agendi
Töödeldud toored logid
MÔÔdikute dĂŒnaamika
sihtmÀrgi ja koormuse agendi
RunAgents
vormingus, mis sobib
vÀlistele salvestuslahendustele
Statistiline koormusaruanne,
mis sobib inimese analĂŒĂŒsimiseks
Publish
Aruande avaldamine
koormustestimise kohta
vÀlises teenuses
Koormustestimise aruande avaldamine
vÀlises teenuses
tulemus.
teenuses
Töödeldud "toor"
logid formaadis, mis sobib
vÀliseksportimiseks
salvestuskohtadesse
Salvestatud vÀlises
salvestuskojas aruanne
koormusest, sobivad
inimese analĂŒĂŒsiks
Koormusallikate ĂŒhendamine CI-mallis
Liigume praktilise osa juurde. Soovin nÀidata, kuidas oleme mÔnedes projektides ettevÔttes rakendanud koormustestimise kontseptsiooni teenusena.
Esmalt lÔid meie DevOps-insenerid GitLab CI-s eraldiseisva agentide hulga koormustestide kÀivitamiseks. Et mitte segada neid mallides teistega, nÀiteks kogumallide, hulga tÔttu, lisasime nendele agentidele sildid, : load. VÔib kasutada kÔiki muid arusaadavaid silte. Need mÀÀratakse GitLab CI Runners.
Kuidas teada vajalikku "rauda"? Koormusagentide omadused â piisav vCPU, RAM ja Disk â vĂ”ivad olla arvutatud lĂ€htudes sellest, et agendi peal peavad olema kĂ€ivitatud Docker, Python (Yandex.Tank jaoks), GitLab CI agent ja Java (Apache JMeteri jaoks). JMeteri Java jaoks soovitatakse kasutada vĂ€hemalt 512 MB RAM-i ja maksimaalselt .
Seega, lÀhtudes meie kogemusest, soovitame kasutada koormusagentide jaoks vÀhemalt: 4 vCPU, 4 GB RAM, 60 GB SSD. VÔrgukaardi lÀbilaskevÔime mÀÀratakse koormusprofiili nÔuete alusel.
Meil kasutatakse peamiselt kahte koormusallikat â Apache JMeter ja Yandex.Tank docker-pildid.
on Yandexi avatud lĂ€htekoodiga tööriist koormustestimise lĂ€biviimiseks. Selle modulaarses arhitektuuris on kĂ”rge jĂ”udlusega asĂŒnkroonne hit-based HTTP-pĂ€ringute genereerija Phantom. Tankil on sisseehitatud testitava serveri ressursside jĂ€lgimine SSH-protokolli kaudu, see suudab automaatselt lĂ”petada testi mÀÀratud tingimuste tĂ€itmisel, oskab tulemusi kuvada nii konsoolis kui ka graafikutena ning sellele saab ĂŒhendada oma mooduleid funktsionaalsuse laiendamiseks. Muide, kasutasime Tanki, kui see polnud veel ainult peavool. Artiklis "" saab lugeda ajalugu, kuidas 2013. aastal viisime lĂ€bi selle abiga koormustestimise ĂŒhe meie ettevĂ”tte toote.
â avatud lĂ€htekoodiga koormustestimise tööriist Apache'ilt. Seda saab kasutada nii staatiliste kui dĂŒnaamiliste veebirakenduste testimiseks. JMeter toetab suurt hulka protokolle ja suhtlemismehhanisme rakendustega: HTTP, HTTPS (Java, NodeJS, PHP, ASP.NET jne), SOAP / REST veebiteenused, FTP, TCP, LDAP, SMTP(S), POP3(S) ja IMAP(S), andmebaase JDBC kaudu, suudab kĂ€ivitada shell-kĂ€ske ja töötada Java-objektidega. JMeteril on IDE testiplaanide loomiseks, silumiseks ja tĂ€itmiseks. Samuti on olemas CLI tööks mis tahes Java-ĂŒhilduvas operatsioonisĂŒsteemis (Linux, Windows, Mac OS X). Tööriist suudab dĂŒnaamiliselt genereerida HTML-aruande testimise kohta.
Kasutusmugavuse tagamiseks meie ettevĂ”ttes ja selleks, et testijad saaksid ise keskkonda muuta ja lisada, oleme loonud koormuse allikate Docker-piltide kogumise GitLab CI-s, avaldades need sisemises . Nii on nende integreerimine koormustestimise torustikes kiirem ja lihtsam. Kuidas teha docker push registrisse lĂ€bi GitLab CI â vaadake .
Meie baas Docker-fail Yandex.Tank jaoks on jÀrgmine:
Dockerfile
1 | FROM direvius/yandex-tank
2 | ENTRYPOINT [""]Ja Apache JMeteri jaoks on see:
Dockerfile
1 | FROM vmarrazzo/jmeter
2 | ENTRYPOINT [""]Kuidas meie pideva integreerimise sĂŒsteem töötab, saate lugeda artiklist «».
Mall ja torustik
NÀidis mall koormustestide lÀbiviimiseks on saadaval projektis . Failis -failis leiate juhise mallist kasutamiseks. Otseses mallis (failis
) on mÀrkuseid selle kohta, mille eest vastutab samm. : stages.
- Prepare, Test ja Report Prepare
- Prepare, Test ja Report kasutatakse koormusallika mÀÀramiseks, testide kĂ€ivitamiseks ja testimise artefaktide salvestamiseks. Saate valida mistahes koormusallika: Yandex.Tank, Apache JMeter, oma vĂ”i kĂ”ik koos. Ebavajalike allikate vĂ€ljalĂŒlitamiseks piisab, kui kommenteerida vĂ”i eemaldada töökoht. Koormusallikate sisenemiskohad:
- Yandex.Tank kÀivitamise parameetrid mÀÀratakse failis.,
- Apache JMeter kÀivitamise parameetrid mÀÀratakse failis .
MĂ€rkus: kokkupaneku konfiguratsiooni mall on mĂ”eldud CI-sĂŒsteemiga suhtlemise seadistamiseks ja ei eelda testiloogika sisaldamist. Testide jaoks mÀÀratakse sisenemiskoht, kus asub juhtimisbash-skript. Testide kĂ€ivitamise viis, aruannete koostamine ja testitsenaariumid peavad olema QA-inseneride poolt ellu viidud. Demopreemia puhul kasutatakse mĂ”lema koormusallika puhul kui kĂ”ige lihtsamat testi Yandexi eeslehe pĂ€ringut. Skriptid ja testiparameetrid asuvad kataloogis .
- Etapis on vaja kirjeldada testimistulemuste avaldamise viise, mis on saadud Test etapil, vĂ€listele salvestuskohtadele, nĂ€iteks GitLab Pages'ile vĂ”i spetsiaalsetele aruandlussĂŒsteemidele. GitLab Pages'i puhul on vajalik, et testide lĂ”ppedes oleks kataloog ./public mitte tĂŒhi ja sisaldaks vĂ€hemalt faili index.html. GitLab Pages teenuse toimimise nĂŒansse saab lugeda .
NĂ€ited, kuidas andmeid eksportida:
- JMeterist ,
- Yandex.Tankist .
Avaldamise seadistamise juhised:
- HTML-statika suunamiseks ,
- InfluxDB-sse ja sealt edasi .
Demopreemia korral koosnevad koormustestide torujuhtmed kahest koormusallikast (ĂŒht neist saab vĂ€lja lĂŒlitada) jĂ€rgmistest:
Apache JMeter suudab ise genereerida HTML-aruande, seega on mÔttekas seda GitLab Pages'is tavapÀraste vahendite abil salvestada. Nii nÀeb vÀlja Apache JMeter aruanne:
Demopreemia puhul Yandex.Tank jaoks nÀete ainult GitLab Pages'i jaotis. Testimise kÀigus suudab Tank salvestada tulemusi InfluxDB andmebaasi ja sealt edasi saab neid nÀiteks kuvada Grafanas (seadistamine toimub failis ). Nii nÀeb Tanki aruanne Grafanas vÀlja:
Elulookirjeldus
Artiklis rÀÀgin ma kontseptsioonist "koormustestimine teenusena" (load testing as a service). Peamine idee on kasutada eelseadistatud koormusagentide basseinide infrastruktuuri, koormusallikate Docker-pilte, aruandesĂŒsteeme ning neid ĂŒhendavat pipelines'i GitLab CI-s, mis pĂ”hineb lihtsal mallil .gitlab-ci.yml (nĂ€ide ). KĂ”ike seda toetab vĂ€ike automatiseerimise inseneride meeskond ning seda kopeeritakse toote meeskondade nĂ”udmisel. Loodan, et see aitab teil sarnase skeemi ettevalmistamisel ja rakendamisel teie ettevĂ”ttes. AitĂ€h tĂ€helepanu eest!
P. S. Soovin vÀga tÀnada oma kolleege, Sergei Kurbanovi ja Nikolai Yusevi, tehnilise abi eest kontseptsiooni rakendamisel load testing as a service meie ettevÔttes.
Autor: â tehnoloogia ja arendusprotsesside osakonna asejuht (DevOps) ettevĂ”ttes Positive Technologies
Allikas: habr.com
