TSM - Alegerea corectă a frameworkului de automatizare pentru REST API-uri

Alexandru Belean - Senior Software Engineer @ Cognizant Softvision

Începi să lucrezi la un proiect nou și trebuie să construiești o nouă arhitectură a unui framework de testare automată a REST API-urilor. Dar… ești neinițiat în această "lume" și nu știi de unde să începi. Stai și te întrebi: care este cel mai bun framework și cel mai bun limbaj de programare pe care să-l folosesc?

Exact această întrebare mi-am pus-o și eu. Acum, vă voi prezenta unele frameworkuri din experiența mea, punctând pentru fiecare în parte punctele tari și cele slabe .

Ceea ce trebuie luat în considerare este că toate aceste frameworkuri ce vor fi menționate mai jos, trebuie să intre în consonanță cu _frameworkul customizat al proiectului. Am avut parte de câteva provocări privind integrarea fiecăruia cu soluția noastră customizată. Dar toate aceste provocări pot fi apreciate, de fapt, în cheia frumuseții construirii și implementării unei noi arhitecturi software.

jMeter

Când am început să lucrez la proiectul meu actual, frameworkul de automatizare folosit pentru testarea de REST API-uri a fost jMeter. Fiecare tester sau developer este informat sau ar trebui să fie, în legătură cu avantajele jMeter.

jMeter este o aplicație foarte puternică pentru load/performance/stress/capacity testing. Dar, de asemenea, este și foarte eficientă pe partea de testare a REST API-urilor, deoarece este foarte adaptabil. Alegerea jMeter ca principal framework de testare automată este o alegere bună, dacă proiectul este de mici dimensiuni. În cazul în care lucrezi la un proiect mare, cu foarte multe endpointuri, sau cu foarte multe environmenturi și cu o aplicație de Integrare Continuă pentru rularea testelor, toate acestea pot cauza foarte multe probleme.

De ce ar trebui să folosesc jMeter? Această întrebare are foarte multe răspunsuri. Unul din cele mai convingătoare răspunsuri este că jMeter este chiar ușor de folosit și are Interfață Grafică cu Utilizatorul. De asemenea, jMeter are o comunitate matură, unde poți găsi răspunsuri la toate întrebările tale. Acesta este primul punct forte pentru jMeter.

Alt punct forte pentru jMeter este "modularizarea". Poți să creezi fragmente de teste și să le reutilizezi în alte suite (jMeter Test plans) utilizând "Include module" controller. Utilizând acest stil de creare al frameworkului de testare, se poate parametriza fiecare caz de testat și poți rula oricare caz de testat dorit, nu toate testele în același timp. Dar dacă ai multe module, pot apărea câteva probleme.

Un mare alt avantaj de luat în considerare este că jMeter este open source. Se pot crea pluginuri pentru el. Se poate scrie cod nativ în Java în foarte multe dintre utilitățile puse la dispoziție. Având posibilitatea de a scrie cod Java îți oferă multe oportunități pentru o mai bună tratare a excepțiilor sau afirmațiilor(assertions).

Acum să luăm în considerare și posibilele probleme care pot apărea. Să zicem că avem 5 suite cu câte 100 de cazuri de testat (minim 100 de cereri HTTP) cu cel puțin 2 afirmații (codul răspunsului și corpul răspunsului). Trebuie să rulăm aceste suite pe 5 environmenturi de testat diferite. Rulând fiecare suită în parte, nu cauzează nicio problemă. Problemele apar când le rulezi pe toate 5, în paralel. jMeter folosește foarte multă memorie și procesorul, dacă REST API-urile returnează multe date care trebuie procesate. Se poate observa că suitele rulează foarte, foarte încet. Acesta ar fi primul punct slab pentru jMeter.

Afirmam că având multe module, pot apărea probleme. Dacă imporți 100 de fragmente de test într-o suită, acea suită va încărca fragmentele foarte, foarte încet, din cauză că este folosit procesorul și memoria la capacitate maximă. Un alt efect este încetinirea rulării testelor.

Să facem un rezumat cu punctele forte și punctele slabe. Ca puncte forte reamintim că este ușor de utilizat, are Interfață grafică, rulează cod nativ Java și este modular. Iar ca puncte slabe ar fi consumul mare de procesor și memorie, în cazul în care se rulează foarte multe teste în paralel de pe aceeași mașină.

Pe proiectul nostru foloseam jMeter pentru REST API-uri, dar când numărul de teste a ajuns la ordinul sutelor am început să avem problemele menționate mai sus.

Care a fost următoarea noastră mișcare? Să căutăm o nouă soluție de automatizare, un nou framework.

jUnit

Fiecare inginer software în Java a auzit despre jUnit. Acesta este un framework de testare pentru limbajul de programare Java și este foarte important în dezvoltarea test driven development.

jUnit este foarte puternic, dar și el are avantaje și dezavantaje în folosirea lui ca framework principal pentru testare. Are cereri HTTP implementate direct în framework. Aceasta este o particularitate de necontestat, recunoscută a jUnit-ului, dar care are limitările ei. URL-ul trebuie să fie o variabilă constantă (finală), deci nu mai putem vorbi de parametrizare. Acesta este un foarte mare inconvenient, dar care nu ne- împiedicat să reîncepem căutările.

RobotFramework

De la Java la Python. Aceasta este o cale foarte, foarte lungă… Dar orice are un punct de început. Acesta a fost al nostru.

RobotFramework este un framework de automatizare care este, de fapt, un înveliș peste librăria Selenium 2. El este keyword driver development framework implementat în Python. Poți să scrii metode în Python sau Java și să le imporți în proiect, iar apoi să le folosești drept keyword-uri. Așadar, în loc să apelezi o metodă getSomething(param), apelezi pur și simplu "getSomething param" - acesta fiind keywordul.

Fiind implementat în Python și Selenium 2, acesta este foarte eficient în automatizarea interfețelor, dar nu în segmentul de REST API-uri. Acesta este un aspect sensibil, din pricina scopului nostru. Trebuia să decidem dacă începem să scriem noi metode pentru testarea de API-uri sau să folosim alt framework. A trebuit să alegem alt framework, dar nu ne-am oprit în a folosi RobotFramework. Îl valorificăm pentru unele teste de automatizare al interfețelor.

Dacă începi un nou proiect de automatizare și ești nou în acest domeniu, acesta este cel mai ușor framework de folosit. Un punct forte pentru RobotFramework în acest caz.

RestAssured

Înapoi la Java. RestAssured este un framework de automatizare foarte productiv, scris în Java. Prin design este dedicat testării de cereri HTTP, deci de REST API-uri. Pentru noi acesta a fost o importantă calitate. Așa că am început să-l folosim.

Dacă limbajul tău de programare principal este Java, atunci RestAssured este cel mai bun framework de automatizare pentru REST API-uri.

Sintaxa este ca la BDD - given() -> when() -> then():

Doar atât de puține cuvinte despre acest framework. De ce? Vă las pe voi să descoperiți frumusețea lui.

Concluzii

Această concluzie se fundamnetează doar pe punctul nostru de vedere. Unii vor alege să folosească RobotFramework pentru automatizarea de REST API-uri, alții vor alege cererile HTTP implementate direct în limbajul de programare etc. Fiecare inginer software are preferințele lui în alegerea limbajului de programare, a framework-ului și a celorlalte resurse necesare.

Așadar, din perspectiva noastră, cel mai bun framework pentru automatizarea REST API-urilor este RestAssured. Este ușor de folosit, modular și poți manipula cererile HTTP în orice fel dorești.

Dacă ai în plan să începi un nou proiect pentru testarea automată a REST API-urilor și nu știi de unde să începi, ar trebui să începi prin a citi despre RestAssured și despre un framework de rulat teste, cum ar fi jUnit sau testNG. RestAssured și jUnit sunt perechea perfectă la început de drum pentru oricine.