Testarea aplicației native React (partea 1)

(21 decembrie 2020)

Introducere

Majoritatea dezvoltatorilor consideră că testarea este plictisitoare și este greu să scrii, dar știi ce? Este nevoie de multă abilitate și experiență pentru a ști cum să scrii teste semnificative și care pot fi întreținute. Cunoștințele pe care le obțineți din învățarea cum să vă testați codul vor schimba, de asemenea, modul în care scrieți codul în curs de dezvoltare. Acest articol ar trebui să vă ajute să începeți călătoria dvs. de testare.

Liniile directoare pentru o mai bună testare

Acestea sunt câteva dintre liniile directoare pe care le-am învățat după ce am cercetat modul în care alți dezvoltatori își testează codul. Urmarea acestor linii directoare mi-a făcut mai ușor să scriu și să mențin teste în întreaga bază de cod.

1. Nu testați implementarea codului dvs.

Pentru a înțelege de ce este important acest lucru, să trecem printr-un scenariu. Să presupunem că ați scris o funcție care ia n ca intrare și scoate rezultatul adăugării primului n numere.

Să presupunem că testați getSumOfFirstN pentru n=2 afirmând că add se numește 2 times cu argumentele (0, 2) și respectiv (2, 1) și ieșirea getSumOfFirstN este 3.

Ulterior, veți afla că există o modalitate mai bună de a găsi suma primelor n numerele și rescrieți codul de mai sus.

Testul dvs. va începe să se întrerupă, deoarece nu mai apelați la add

Acesta a fost un exemplu simplu și y s-ar putea să pară contra-intuitiv, dar am văzut mulți dezvoltatori făcând exact acest tip de testare în care greșeala nu este atât de ușor de văzut.

2. Nu lăsați testele să devină o altă datorie tehnologică

Testarea este importantă, dar trebuie, de asemenea, să transmiteți codul părților interesate relevante la timp. Dacă ori de câte ori scrieți o caracteristică nouă sau modificați una existentă, aceasta vă rupe vechile cazuri de testare sau ajungeți să cheltuiți o cantitate semnificativă din timpul alocat pentru a remedia cazurile de testare vechi, mai degrabă decât pentru a construi caracteristicile necesare, atunci în cele din urmă veți ajunge să ștergeți toate vechile teste și riscați eșecul proiectului în producție.

Respectarea acestor instrucțiuni ar trebui să vă ajute să vă asigurați că testele dvs. sunt fie ușor de reparat, fie nu se întrerup deloc la modificarea bazei de cod.

3. Când testați interfața de utilizare, scrieți testele într-un mod care simulează comportamentul real al utilizatorului.

Să presupunem că testați dacă acest buton a fost redat și a funcționat conform așteptărilor sau nu, gândiți-vă mai întâi la modul în care utilizatorul ar găsi și interacționa cu acest buton. Sper că vor vedea textul „Trimiteți” și apoi vor apăsa pe el și așa este exact ceea ce am simula. În cazul nostru de testare, vom căuta mai întâi textul „Trimiteți” și apoi vom simula evenimentul „onPress” pe acesta și apoi vom afirma orice ar fi trebuit să facă.

În unele cazuri, s-ar putea să nu fie ușor de identificat în mod unic componenta pe care doriți să o vizați și, în acest caz, puteți utiliza testID prop, dar nu uitați că nu veți simula comportamentul complet al utilizatorului dacă utilizați testID deoarece utilizatorii nu vizează componente pe baza testID.

De ce este important acest lucru? De ce trebuie să încercăm să simulăm cât mai mult comportamentul utilizatorului atunci când testăm interfața de utilizare? Acest lucru se datorează faptului că, în cele din urmă, va fi un om care va interacționa cu interfața dvs. de utilizare și nu cu un computer și, dacă văd că un „Hello” este redat în butonul dvs. mai degrabă decât un „Submit”, cazul dvs. de test ar trebui să eșueze, deoarece acesta este un lucru care poate arunca utilizatorul final.

4. Funcțiile pure sunt mai ușor de testat decât funcțiile impure

Funcțiile pure sunt funcții care vor da întotdeauna aceeași ieșire pentru o intrare corespunzătoare, adică dacă o funcție pură pompează 2 pentru un 1, atunci ar face întotdeauna acest lucru, în timp ce funcțiile impure ar putea fi pompate 2 la primul apel și apoi pompare 5 la cel de-al doilea apel.

Acest lucru este la îndemână de reținut atunci când scrieți cod. Funcțiile impure pot deveni mai ușor de testat dacă modulul care introduce „impuritatea” în astfel de funcții este deranjabil.

5.Utilizați dispozitive ca intrare și afirmații în testele dvs.

Să presupunem că aveți un obiect de tip angajat și că aveți diferite funcții care le operează, cum ar fi o funcție de valorificare a name, o funcție pentru a verifica dacă angajatul este sau nu adult etc.

Acum, să presupunem că luați acest obiect ca intrare în toate cazurile de testare.

Acesta este datele dvs. false sau „dispozitivul” dvs. În primul caz de testare care testează dacă funcția care scrie cu majuscule numele funcționează așa cum era de așteptat sau nu, afirmați că ieșirea acestuia este egală cu { ...employee, name: employee.name.toUpperCase() } și în al doilea caz de testare dacă funcția generează sau nu employee.age >= 18 și așa mai departe.

S-ar putea să vă întrebați ce avantaj obținem folosind dispozitivele în așa fel? Răspunsul este că vă faceți mai ușor fixarea rapidă a testelor în viitor, scriind testele în acest fel.

De ex. Ce se întâmplă dacă dorim să adăugăm o altă proprietate maritalStatus în obiectul angajatului, deoarece acum toți angajații noștri sunt obligați să își dezvăluie starea civilă. Dacă în primul nostru caz de testare, am afirmat că rezultatul este egal cu { name: "KARTIK", age: 25, sex: "Male", children: 0 } în loc de { ...employee, name: employee.name.toUpperCase() }, cazul nostru de testare se va întrerupe. De asemenea, se va sparge dacă schimbăm valoarea name cu altceva. Cu alte cuvinte, cazul nostru de testare nu ar fi deloc flexibil și, prin urmare, va avea o șansă mai mare de a se rupe din cauza modificărilor fără legătură în baza de cod.

6. Scrieți teste unitare pentru componente și funcții utilitare

Acestea sunt părți ale codului dvs. care vor fi utilizate de mai multe module. Prin urmare, trebuie să fie testate pentru toate intrările / marginile posibile, deoarece nu știți cum vor folosi celelalte module aceste funcții / componente. Prin urmare, acestea nu ar trebui să aibă un comportament neașteptat.

7. Scrieți teste de integrare pentru ecrane

Este greu să scrieți teste unitare pentru ecrane, deoarece de obicei acestea depind de un număr mare de componente și de alte biblioteci terțe, cum ar fi un magazin redux. Deci, pentru a scrie teste unitare pentru ecrane, va trebui mai întâi să batjocorești toate aceste dependențe, ceea ce înseamnă multă muncă. Acesta este motivul pentru care este mai bine să scrieți teste de integrare în acest caz.

7. Scrieți teste E2E pentru testarea codului nativ

Codul nativ nu rulează într-un mediu de glumă. Deci, pentru ao testa, va trebui să utilizați o bibliotecă precum Detox.

8. Faceți întotdeauna testarea instantaneelor ​​pentru ecrane și componente

Dacă efectuați o schimbare de stil într-o componentă care este utilizată de mai multe alte ecrane / componente, testele instantanee pentru acestea vor eșua până când nu actualizați instantaneele. Vă va ajuta să înțelegeți ce alte module au fost afectate de modificarea pe care ați făcut-o. Dacă lucrați într-o echipă, acesta îl ajută cu adevărat pe examinator în timpul revizuirilor PR să înțeleagă ce module au fost afectate de modificarea anume pe care ați făcut-o în componentă, deoarece modificările instantaneelor ​​acestor module se reflectă în PR-ul dvs.

Concluzie

Sper că ați găsit util acest articol și dacă sunteți confuz de ceea ce tocmai ați citit, atunci nu vă faceți griji. A doua parte a acestei serii va fi un tutorial despre configurarea mediului de testare în React Native cu exemple de coduri de testare a ecranelor, componentelor și funcțiilor, urmând instrucțiunile pe care le-am stabilit în această primă parte.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *