Știm deja că milioane de oameni din întreaga lumea folosesc telefoane mobile și tablete, iar numărul utilizatorilor este într-o creștere continuă, ceea ce determină și o creștere exponențială în piata aplicatiilor mobile. Companiile dezvoltatoare de aplicatii mobile trebuie să se asigure că produsele livrate sunt de bună calitate și se diferențiază, pentru a avea un feedback cat mai bun din partea utilizatorilor. Acest lucru devine o provocare, având în vedere diversitatea tipurilor de device-uri mobile și a sistemelor de operare. Pentru a asigura o acoperire cât mai largă și eficientă, testarea acestor aplicații trebuie automatizată. De aceea este nevoie de o soluție cât mai generică și care să acopere cât de mult posibil testarea aplicației.
În ultima perioadă, cel mai mare trend în testarea aplicațiilor mobile pe o gamă largă de device-uri și sisteme de operare, este testarea în cloud, care suportă atât testare manuală cât și cea automata. Dar această variantă este și foarte costisitoare, iar de cele mai multe ori bugetul proiectului nu permite această abordare.
Există un număr destul de mare de servicii de testare în Cloud care pot fi folosite pentru testarea automată a aplicațiilor mobile. Amintim printre aceștea Testdroid, SauceLabs, AWS Device Farm, Browserstack. Fiecare provider dispune de sute sau mii de dispozitive mobile începând de la produse low-end și până la telefoane/tablete de top. Detaliile tehnice din spatele acestor soluții sunt diferite de la provider la provider, astfel, testele scrise pentru unul din provideri nu vor fi 100% compatibile cu un alt provider, în cazul în care se dorește schimbarea provider-ului.
Prețurile pentru aceste servicii diferă de la un furnizor la altul sau de la un abonament la altu. Există și abonamente ieftine, care s-ar încadra în bugetul proiectelor, dar acestea nu ofera nici 10% din potențialul unui abonament complet și din testele noastre, s-au dovedit aproape inutilizabile pe termen lung sau pentru o testare eficientă a aplicației. Abonamentele complete oferă multe functionalități care ar putea asigura testarea eficientă, dar prețul acestora este undeva de la câteva sute de dolari pe lună până la câteva mii pentru un abonament enterprise.
Din cauza acestor costuri foarte mari, ne-am decis să căutăm o soluție proprie, prin care să înlocuim, pe cât posibil, necesitatea testării în cloud. Evident acest lucru nu este posibil 100%. Pentru o soluție mai complexă și mai eficientă, asemănătoare soluțiilor enterprise existente, e nevoie de o investiție mare și consistentă de timp și de resurse, iar testarea pe emulatoare nu este deloc relevantă pentru a avea rezultate reale (device-urile reale se comportă diferit față de emulatoare, iar viteza de execuție diferă considerabil).
Planul nostru a fost să încercăm să găsim o soliție alternativă practică, prin care să asigurăm un serviciu de testare suficient de bun și pe un număr diferit de device-uri. Evident, nu am reinventat roata, și nici nu am încercat acest lucru. Soluția propusă necesită în continuare utilizarea de device-uri fizice, dar nu mai este nevoie de platforma de cloud care impune un anumit mod de a scrie și executa testele, nu mai este nevoie ca device-urile să se afle fizic în locația unde este proiectul si nici nu este nevoie să trimitem aplicațiile testate unui 3rd party. Totul se testeză în rețeaua internă, fără a avea probleme de securitate.
Pentru început, am încercat să ne axăm pe cele mai populare sisteme de operare mobile: Android și iOS. Am pornit de la o idee mică, să avem un framework generic, pe care să îl putem folosi ca bază la testarea aplicațiilor mobile.
Din momentul în care am decis care este gama de device-uri care va avea nevoie de acoperire, ne-am îndreptat atenția spre alegerea unui tool de automatizare. După o perioada de testare a mai multor soluții, am ales Appium.
Appium este un tool open-source, pentru testarea aplicatiilor mobile de tip nativ, hibrid sau web. Este construit și bazat pe Selenium, dar se axează pe testarea aplicațiilor mobile.
Pentru început, am pornit cu construcția unui framework generic, cu care să testăm local aplicații iOS și Android. Am creat un framework generic, folosind JAVA și TestNG, pe care l-am folosit pe câteva proiecte pentru testarea mobilă local (mașina pe care se scriu testele este și mașina care le execută).
Următorul pas a fost să integrăm soluția într-un CI machine, pentru a ne integra în procesul de Continous Integration din cadrul proiectelor.
Pentru a putea executa remote testele s-a creat un serviciu REST alcatuit din 2 componente:
Un server care este deploy-at într-un server web (cu un UI, care afișează lista de device-uri vizibile)
Clienți locali (Agenți), care se rulează pe mașinile unde se vor executa teste (sub forma unor jar-uri)
Server-ul așteaptă call-uri de la client și afișează pe un UI informația primită.
Clienții caută în mod repetat (o dată/minut) device-urile conectate la mașina pe care rulează și sunt pregatite pentru execuția testelor. Aceștia trimit informatia către server, care la rândul lui afișează informația primită.
Informația constă în identificatorii de locație (IP-uri) cât și caracteristicile device-urilor care sunt pregătite pentru execuția testelor.
La bază, Appium suportă execuție remote, atât timp cât există un server Appium care rulează la URL-ul destinație. Pentru asta, componenta din cadrul testelor apelează serviciul REST, cu un call de genul "este un device cu caracteristicile <…> liber pentru testare?", iar în funcție de răspuns, componenta decide dacă va executa sau nu testele.
În cazul unui răspuns pozitiv, server-ul oferă informațiile necesare pentru execuția testelor componentei Java din framework-ul de testare, iar acesta, la rândul lui, trimite către REST un request de execuție. Serviciul REST pornește server-ul de Appium la IP-ul unde va urma execuția, iar, dupaă ce acest server este pornit, se execută și testele pe device-ul dorit aflat în locatia remote.
După ce execuția se finalizează, componenta Java din framework-ul de testare trimite un call către REST, de oprire a server-ului Appium de la locația remote, iar rezultatele acestei execuții vor fii vizibile local, pe mașina de unde s-a inițiat request-ul de rulare al testelor.
Deocamdată, solutia remote suportă doar un singur sistem de operare mobil și anume Android. Testele au fost executate cu succes în diferite locatii și pe mai multe device-uri simultan.
Planul este ca pe viitor să oferim suport și pentru iOS, iar, într-un final toată execuția să fie localizată într-un UI (start execuție -> raport final) astfel eliminând și mașina locală care pornește execuția. Ne dorim să dezvoltăm și să eficientizăm cât mai mult soluțiile, pentru a facilita procesul și a oferi în continuare servicii de calitate.
de Mihai Varga
de Călin Diniș , Mihai Tentis