Introducere în testarea iOS cu UI Automation

apr. 17, 2021
admin

Imaginați-vă că puteți scrie scripturi care să interacționeze automat cu aplicația iOS și să puteți verifica rezultatele. Cu UI Automation puteți. UI Automation este un instrument pus la dispoziție de Apple pentru a efectua un nivel mai ridicat de testare a aplicației dvs. iOS, dincolo de tot ceea ce se poate realiza cu XCTest.

1. Testarea cutiei albe față de testarea cutiei negre

S-ar putea să fi auzit comparația dintre testarea cutiei albe și testarea cutiei negre în ceea ce privește modul în care se poate testa un software. Dacă nu sunteți familiarizați cu aceste concepte, permiteți-mi să vă explic cum funcționează.

White Box Testing

Imaginați-vă că există o bucată de software care rulează în interiorul unei cutii. Cu testarea cutiei albe, puteți să vedeți în interiorul cutiei și să vă uitați la toate piesele mărunte ale modului în care funcționează software-ul, iar apoi să luați decizii educate cu privire la modul de testare a software-ului. De asemenea, puteți avea cârlige de nivel mai profund în software din testele pe care le scrieți.

Testarea unităților este testarea cutiei albe. Atunci când scrie teste unitare, testerul are acces la nivel fin la codul testat. Testerul poate scrie, de fapt, teste care valorifică software-ul testat la nivelul metodei sau al unității.

În dezvoltarea de software iOS folosim cadrul XCTest pentru a realiza acest tip de testare. Aruncați o privire la un alt tutorial pe care l-am scris despre cum să începeți cu XCTest.

Black Box Testing

În testarea cutiei negre, cutia este opacă. Cel care testează nu poate vedea în interiorul cutiei. Testerul nu poate accesa și nu știe nimic despre implementarea codului de bază pentru a scrie teste. În schimb, testerul este forțat să folosească aplicația așa cum ar face-o un utilizator final, interacționând cu aplicația și așteptând răspunsul acesteia, verificând rezultatele.

Există cel puțin două moduri de a executa acest tip de testare.

  • Un tester care execută în mod repetat și manual un număr de pași predefiniți și verifică vizual rezultatele.
  • Utilizarea unor instrumente specializate pentru a testa aplicația cu API-uri care se comportă similar cu modul în care interacționează un om.

În dezvoltarea aplicațiilor iOS, Apple oferă un instrument numit UI Automation pentru a efectua testarea cutiei negre.

2. Ce este UI Automation?

UI Automation este un instrument pe care Apple îl furnizează și îl întreține pentru testarea automatizată, de nivel superior, a aplicațiilor iOS. Testele sunt scrise în JavaScript, respectând un API definit de Apple.

Scrierea testelor poate fi ușurată dacă vă bazați pe etichete de accesibilitate pentru elementele de interfață utilizator din aplicația dumneavoastră. Nu vă faceți griji totuși, dacă nu le aveți definite, există alternative disponibile.

Apif de automatizare a interfeței UI nu are formatul tipic bazat pe xUnit pentru scrierea testelor. O diferență față de testarea unitară este că testerul trebuie să înregistreze manual succesele și eșecurile. Testele UI Automation sunt rulate din instrumentul Automation din cadrul instrumentului Instruments care vine cu instrumentele de dezvoltare Apple. Testele pot fi rulate în simulatorul iOS sau pe un dispozitiv fizic.

3. Scrierea testelor de automatizare UI

Pasul 1: Deschideți proiectul de probă

Am actualizat proiectul de probă utilizat în tutorialul anterior privind testarea iOS cu câteva elemente suplimentare de interfață utilizator care oferă câteva cârlige utile pentru adăugarea testelor de automatizare UI. Descărcați proiectul de pe GitHub. Deschideți proiectul și rulați aplicația pentru a vă asigura că totul funcționează conform așteptărilor. Ar trebui să vedeți o interfață utilizator similară cu cea prezentată mai jos.

Înainte de a scrie teste, nu ezitați să încercați aplicația de probă pentru a vă familiariza cu funcționalitatea acesteia. În calitate de utilizator, puteți introduce text în câmpul de text și atingeți butonul pentru a vedea o etichetă pe ecran care afișează șirul inversat, introdus.

Pasul 2: Crearea unui test de automatizare a interfeței de utilizator

Acum că sunteți familiarizat cu aplicația eșantion, este timpul să adăugați un test de automatizare a interfeței de utilizator. UI Automation este un instrument care poate fi găsit în Instruments. Pentru a rula aplicația de probă în Instruments, selectați Product > Profile din meniul Xcode. Selectați Automation (Automatizare) din lista de instrumente.

Se va deschide fereastra principală Instruments (Instrumente) cu un singur instrument gata de execuție, instrumentul Automation (instrumentul Automation execută cazuri de testare UI Automation). Veți vedea, de asemenea, o zonă în jumătatea de jos a ferestrei care arată ca un editor de text. Acesta este editorul de scripturi. Acesta este locul în care veți scrie testele UI Automation. Pentru acest prim test, urmați instrucțiunile de mai jos, adăugând fiecare linie la script în editorul de script.

Începeți prin a stoca o referință la câmpul text într-o variabilă.

var inputField = target.frontMostApp().mainWindow().textFields();

Setați valoarea câmpului text.

inputField.setValue("hi");

Verificați că valoarea a fost setată cu succes și, dacă a fost, treceți testul. Eșuați testul dacă nu a fost.

În timp ce acest test este destul de banal, el are valoare. Tocmai am scris un test care testează prezența unui câmp de text la lansarea aplicației și care testează dacă un șir aleatoriu poate fi setat ca valoare a câmpului de text. Dacă nu mă credeți, scoateți câmpul text din storyboard și executați testul. Veți vedea că nu reușește.

Acest test demonstrează trei elemente importante pentru scrierea testelor de automatizare a interfețelor utilizator. În primul rând, vă arată cum să accesați un element simplu de interfață utilizator, câmpul de text. Mai exact, accesăm un dicționar al tuturor câmpurilor text din vizualizarea de bază a aplicației prin target.frontMostApp().mainWindow().textFields() și apoi găsim câmpul text care ne interesează căutându-l pe cel cu cheia Input Field. Această cheie este, de fapt, eticheta de accesibilitate a câmpului text. În acest caz, ea este definită în storyboard. De asemenea, putem seta eticheta de accesibilitate în cod folosind proprietatea accessibilityLabel pe NSObject.

Accesul la fereastra principală a aplicației, la aplicația cea mai frontală și la țintă este obișnuit atunci când lucrăm cu UI Automation. Vă voi arăta cum să faceți acest lucru mai ușor și mai puțin verbos mai târziu în acest tutorial.

În al doilea rând, acest lucru vă arată că puteți interacționa cu elementele interfeței cu utilizatorul de pe ecran. În acest caz, setăm valoarea câmpului de text, imitând interacțiunea utilizatorului cu aplicația prin introducerea de text în câmpul de text.

Și în al treilea rând, exemplul arată, de asemenea, o tehnică de verificare a ceea ce se întâmplă în aplicație. Dacă valoarea este setată cu succes, testul trece. Dacă valoarea nu este setată, testul eșuează.

Pasul 3: Salvarea testelor

În timp ce scrierea testelor în editorul de scripturi este convenabilă, devine rapid greoaie și dificil de întreținut. Dacă părăsiți Instruments, orice modificări nesalvate sunt eliminate. Trebuie să salvăm testele pe care le scriem. Este suficient să copiați și să lipiți testul într-un document nou în editorul de text preferat și să îl salvați. Puteți găsi testele create în acest tutorial în proiectul de probă în Jumblify/JumblifyTests/AutomationTests.js.

Pentru a rula testul, selectați fila din mijloc în panoul din dreapta, lângă editorul de scripturi, și selectați Add > Import.

Vă va fi solicitat să selectați scriptul de importat. Navigați la scriptul salvat și importați-l. Puteți modifica în continuare scriptul în editorul de scripturi. Orice modificare va fi salvată automat în fișierul extern pe care l-ați creat.

Etapa 4: Atingerea unui buton

Să actualizăm testul nostru pentru a testa interacțiunea cu butonul. Testul nostru adaugă deja text în câmpul de text, așa că trebuie doar să adăugăm cod pentru a atinge butonul. Să ne gândim mai întâi cum să găsim butonul în vizualizare astfel încât să poată fi apăsat. Există cel puțin trei moduri de a realiza acest lucru și fiecare abordare are compromisurile sale.

Apropiere 1

Puteți atinge programatic o coordonată (X, Y) de pe ecran. Facem acest lucru cu următoarea linie de cod:

target.tap({x: 8.00, y: 50.00});

Desigur, nu am nicio idee dacă acestea sunt chiar coordonatele butonului de pe ecran și nu am de gând să-mi fac griji în legătură cu asta, deoarece această abordare nu este instrumentul potrivit pentru această sarcină. O menționez doar ca să știți că există. Folosirea metodei tap de pe target pentru a atinge un buton este predispusă la erori, deoarece este posibil ca acel buton să nu se afle întotdeauna la acea coordonată specifică.

Abordare 2

De asemenea, este posibil să găsiți butonul căutând în matricea de butoane a ferestrei principale, similar cu modul în care am accesat câmpul de text în primul test. În loc să accesăm butonul direct folosind o cheie, putem prelua o matrice de butoane din fereastra principală și să codificăm dur un index al matricei pentru a obține o referință la buton.

target.frontMostApp().mainWindow().buttons().tap();

Această abordare este puțin mai bună. Nu codificăm dur o coordonată, dar codificăm dur un index de matrice pentru a găsi butonul. Dacă se întâmplă să adăugăm un alt buton pe pagină, s-ar putea ca acest test să fie întrerupt din greșeală.

Abordarea 3

Aceasta mă aduce la a treia modalitate de a găsi butonul pe pagină, folosind etichete de accesibilitate. Utilizând o etichetă de accesibilitate, putem accesa direct butonul la fel cum am găsi un obiect într-un dicționar folosind o cheie.

target.frontMostApp().mainWindow().buttons().tap();

Cu toate acestea, dacă adăugați linia de mai sus la script și îl rulați, veți primi o eroare.

Acest lucru se datorează faptului că nu am definit încă eticheta de accesibilitate pentru buton. Pentru a face acest lucru, treceți la Xcode și deschideți storyboard-ul proiectului. Găsiți butonul în vizualizare și deschideți Inspectorul de identitate din dreapta (View > Utilities > Identity Inspector). Asigurați-vă că Accesibilitatea este activată și setați eticheta butonului la Jumblify Button.

Pentru a rula din nou testul, va trebui să rulați aplicația din Xcode selectând Product > Run (Produs > Executare) și apoi să faceți din nou profilul aplicației selectând Product > Profile (Produs > Profil). Acest lucru rulează testele și fiecare test ar trebui să treacă acum.

Pasul 5: Verificarea șirului încurcat

După cum am menționat mai devreme, aplicația noastră primește un șir de text ca intrare și, atunci când utilizatorul apasă pe buton, afișează șirul inversat. Trebuie să adăugăm încă un test pentru a verifica dacă șirul de intrare este inversat corect. Pentru a verifica dacă UILabel este completat cu șirul corect, trebuie să ne dăm seama cum să facem referire la UILabel și să verificăm șirul pe care îl afișează. Aceasta este o problemă frecventă atunci când se scriu teste de automatizare, și anume, să ne dăm seama cum să facem referire la un element din aplicație pentru a face o afirmație asupra acestuia.

Există o metodă pe aproape fiecare obiect din UI Automation API, logElementTree. Această metodă înregistrează elementele imbricate ale unui anumit element. Acest lucru este foarte util pentru a înțelege ierarhia elementelor din aplicație și ajută să ne dăm seama cum să țintim un anumit element.

Să vedem cum funcționează acest lucru prin înregistrarea arborelui de elemente al ferestrei principale. Aruncați o privire la următoarea linie de cod.

target.frontMostApp().mainWindow().logElementTree();

Adăugarea acestei linii la scriptul de testare are ca rezultat următoarea ieșire:

După cum puteți vedea, există un subelement UIAStaticText al lui UIAWindow și puteți vedea, de asemenea, că acesta are un nume de ih, care se întâmplă să fie și șirul inversat pe care trebuie să-l verificăm. Acum, pentru a finaliza testul nostru, trebuie doar să adăugăm cod pentru a accesa acest element și a verifica dacă este prezent.

De ce trebuie să verificăm doar dacă elementul UIAStaticText este prezent? Deoarece numele elementului este șirul inversat al șirului de intrare, verificarea prezenței sale confirmă faptul că șirul a fost inversat corect. Dacă elementul nu există atunci când se face referire la nume – șirul inversat – atunci înseamnă că șirul nu a fost inversat corect.

4. Scărpinarea suprafeței

Există atât de multe alte moduri în care un utilizator final poate interacționa cu un dispozitiv iOS în timp ce utilizează aplicația dumneavoastră. Acest lucru înseamnă că există multe alte moduri în care puteți utiliza UI Automation pentru a simula aceste interacțiuni. Decât să încerc să capturez o listă cuprinzătoare a acestor interacțiuni, vă voi îndruma către documentația de referință UI Automation.

Pentru fiecare tip de obiect cu care puteți interacționa, puteți vizualiza lista de metode disponibile pentru acel obiect. Unele metode sunt pentru recuperarea atributelor despre obiect, în timp ce altele sunt pentru a simula interacțiunea tactilă, cum ar fi flickInsideWithOptions pe UIAWindow.

Înregistrarea unei sesiuni

În timp ce încercați să testați aplicații din ce în ce mai complicate cu UI Automation, veți descoperi că uneori este destul de plictisitor să folosiți în mod repetat logElementTree pentru a găsi elementul pe care îl căutați. Acest lucru devine, de asemenea, plictisitor și complex pentru aplicațiile cu o ierarhie de vizualizare sau navigare complexă. În aceste cazuri, puteți utiliza o altă caracteristică a Instruments pentru a înregistra un set de interacțiuni cu utilizatorul. Ceea ce este și mai grozav este că Instruments generează codul JavaScript de automatizare a interfeței de utilizator care este necesar pentru a reproduce interacțiunile înregistrate. Iată cum îl puteți încerca singur.

În Instruments și cu instrumentul Automation selectat, căutați butonul de înregistrare din partea de jos a ferestrei.

Dacă faceți clic pe butonul de înregistrare, Instruments va începe o sesiune de înregistrare, așa cum se arată în captura de ecran de mai jos.

Instruments va lansa aplicația dvs. în simulatorul iOS și veți putea interacționa cu ea. Instruments va genera un script bazat pe interacțiunile dvs. în timp real. Încercați-l. Rotiți simulatorul iOS, atingeți în locuri aleatorii, efectuați un gest de glisare etc. Este o modalitate foarte utilă de a ajuta la explorarea posibilităților de automatizare a interfețelor utilizator.

Evitarea unei baze de cod monolitic

După cum probabil vă puteți imagina, dacă vom continua să adăugăm mai multe teste la fișierul de testare pe care l-am creat prin aceeași metodă, acesta va deveni rapid greu de întreținut. Ce putem face pentru a preveni ca acest lucru să se întâmple. În testele mele, fac două lucruri pentru a rezolva această problemă:

  • Un test pentru o funcție: Acest lucru implică faptul că testele pe care le scriem trebuie să se concentreze pe o anumită parte a funcționalității. Îi dau chiar și un nume adecvat, cum ar fi testEmptyInputField.
  • Gruparea testelor aferente într-un singur fișier: De asemenea, grupez testele conexe în același fișier. Astfel, codul dintr-un singur fișier rămâne ușor de gestionat. De asemenea, acest lucru facilitează testarea unor bucăți separate de funcționalitate prin executarea testelor într-un fișier specific. În plus, puteți crea un script principal în care să apelați funcțiile sau testele pe care le-ați grupat în alte fișiere de testare.

În următorul fragment de cod, importăm un fișier JavaScript și acest lucru ne pune la dispoziție funcțiile din acel fișier JavaScript.

#import "OtherTests.js"

Concluzie

În acest tutorial, ați învățat valoarea testării la nivel superior și modul în care UI Automation poate ajuta la umplerea acestui gol. Este un alt instrument din setul de instrumente care vă ajută să vă asigurați că livrați aplicații fiabile și robuste.

.

Lasă un răspuns

Adresa ta de email nu va fi publicată.