Unitate 6 / 11

Generarea de teste cu inteligență artificială: teste de unitate, interfață și automatizare

Câștiguri:

  • Abilitatea de a produce teste unitare, de integrare și de IU cu inteligență artificială în conformitate cu piramida de testare și de a acoperi situații limită și de eroare, precum și scenarii fericite
  • Capacitatea de a elimina testele goale/inutile și acoperirea umflată prin verificarea faptului că fiecare test generat validează de fapt un comportament
  • Asigurarea că testul prinde eroarea și îl împiedică să remedieze eroarea, spunând AI ce ar trebui să facă codul

Scrierea codului este jumătate din muncă; Demonstrarea că codul funcționează corect este cealaltă jumătate. Aplicațiile mobile întâlnesc sute de dispozitive diferite, dimensiuni de ecran, versiuni ale sistemului de operare și comportamente ale utilizatorilor. Este imposibil să testați toate acestea manual; De aceea, testarea automată (codul de testare a codului — testarea care rulează fără un clic uman) este coloana vertebrală a calității mobile. Inteligența artificială este incredibil de eficientă la scrierea testelor, deoarece scrierea testelor este exact tipul de lucru care îi place: validarea unui comportament specific pentru anumite intrări. În această unitate, vom învăța cum să accelerăm testarea unitară, testarea interfeței și automatizarea cu AI, dar să asigurăm calitatea testului prin ochi umani.

Piramida de testare: ce să testați și cât de mult

O strategie de testare sănătoasă seamănă cu o piramidă. Baza include un număr mare de teste unitare (testare rapidă care testează o singură funcție sau clasă în mod izolat); sunt rapide si ieftine. La mijloc se află mai puține teste de integrare (testarea modului în care mai multe părți funcționează împreună). În partea de sus există un minim de testare UI/end-to-end (testarea făcută făcând clic pe ecran așa cum o face utilizatorul); sunt realiste, dar lente și fragile. AI ajută la fiecare nivel, dar cea mai mare valoare se află la bază: producerea rapidă a testelor unitare ale logicii de afaceri.

Tipul testului

Domeniul de aplicare

viteza

Eficiența AI

testarea unitară

Funcție/clasă unică

foarte repede

foarte sus

integrare

strat intermediar

mediu

înalt

UI / end-to-end

Toate fluxurile pe ecran

lent

Mediu (fragil)

Sfat: când îi spuneți AI să „genereze teste pentru această funcție”, cereți în mod explicit cazuri de margine: intrare goală, nul, număr negativ, valoare foarte mare, eroare de rețea. AI produce o cale fericită cu ușurință; Adevăratele greșeli se ascund în granițe și sar afară dacă nu le vrei acolo.

Etapele scrierii testelor cu AI

  1. Definiți comportamentul de testat. „Această funcție ar trebui să ofere această ieșire acestei intrări.”
  2. Specificați cadrul. JUnit + MockK pe Android, XCTest pe iOS, Espresso (Android) sau XCUITest (iOS) pentru UI.
  3. Cereți stări limită. Scenariu fericit + eroare + puncte de întrerupere.
  4. Gestionați obiectele simulate. Dependențe externe, cum ar fi rețeaua și baza de date, sunt emulate pentru testare (falsă — simulare controlată în loc de serviciul propriu-zis).
  5. Rulați testul și verificați. Testul trece, confirmă ceva cu adevărat semnificativ?

Al cincilea pas este critic. AI produce uneori teste inutile care „trec întotdeauna”; de exemplu, un test care nu verifică nimic sau își verifică propriile date false. Un test de promovare și un test valoros sunt lucruri diferite.

Atenție: Doar pentru că AI poate produce nu înseamnă că testul este corect. Uneori, AI acceptă comportamentul curent (poate defectuos) al codului ca fiind „corect” și scrie teste în consecință. O astfel de testare remediază eroarea, mai degrabă decât să-l prindă. Tu decizi la ce se așteaptă testul; Spuneți AI ce ar trebui să facă, nu ce face codul.

Testați măsura de acoperire și eroare

Acoperirea testului (ce procent de cod este rulat de teste) este o măsură utilă, dar înșelătoare. O acoperire de 90% indică faptul că 90% din cod a fost executat; dar nu s-a verificat că acele linii funcționează corect. Un test care rulează o linie și nu verifică rezultatul umflă domeniul de aplicare, dar nu oferă securitate. Scopul nu este un număr mare, ci o validare semnificativă. Puteți crește rapid cu AI, dar asigurați-vă că fiecare test testează de fapt un comportament.

trei mini cutii

Cazul 1 — Situație la frontieră prinsă. AI i s-a cerut teste pentru o funcție de transfer de bani într-o aplicație bancară și, în special, au fost adăugate scenarii „sumă negativă” și „mai mult decât soldul”. Testul a relevat că transferul nu a fost blocat cu o sumă negativă; aceasta ar fi o vulnerabilitate majoră de securitate în producție. Închis prin adăugarea unui control cu ​​o singură linie. Lecția: testele la limită sunt cele mai valoroase teste.

Cazul 2 – Test fals. O echipă a fost uşurată să crească acoperirea la 85% cu 40 de teste unitare produse de AI. În timpul inspecției, s-a văzut că majoritatea testelor nu au verificat de fapt nicio ieșire, ci doar au apelat funcția și au scris assertTrue(true). Acoperirea a fost mare, dar protecția a fost zero. Testele au fost revizuite și rescrise cu validări reale. Lecție: numerele de acoperire pot minți.

Cazul 3 — Testarea UI a fost accelerată. O echipă de comerț electronic a scris un script XCUITest al fluxului de adăugare în coș cu AI în 20 de minute; Dacă ar fi scris de mână, ar dura o jumătate de zi. AI ghicit identificatori de elemente de ecran; Echipa le-a potrivit cu codul real și le-a reparat. Viteza de proiectare este reală, dar verificarea identificatorului este muncă umană.

Prompt slab / Prompt puternic

Prompt slab: „Scrieți un test pentru această funcție”.

Prompt puternic: „Produceți teste unitare pentru această funcție Kotlin cu JUnit5 + MockK. Funcție: transfer de bani (sumă, sursă, țintă). Comportamente de testat (ce ar trebui să FACĂ codul):- Transferul valid trebuie să aibă succes- Suma negativă sau zero trebuie respinsă- Suma mai mare decât soldul trebuie respinsă- Eroare de rețea trebuie să arunce o excepție adecvată. nu scrie o afirmație goală.”

Șabloane copiabile

Șablon de testare unitară: „Generează [JUnit/XCTest] teste unitare pentru această funcție pentru [limbă]. Comportament așteptat: [ce trebuie făcut]. Includeți: scenariu fericit, intrare nulă, puncte de întrerupere, caz de eroare. Lăsați fiecare test să verifice un singur comportament; utilizați o afirmație semnificativă; simulare [cod]"

Șablon de testare a interfeței de utilizare: „Scrieți un test de interfață cu următorul flux cu [Espresso/XCUITest]: [fluxul utilizatorului pas cu pas]. Selectați elementele ecranului cu codul de accesibilitate, utilizați id-ul în loc de text. Adăugați o strategie de așteptare. Amintește-mi să potrivesc ID-urile elementului cu codul real."

Șablon de auditare de testare: „Examinați aceste teste: 1) Verifică de fapt o ieșire/comportament sau sunt nule? 2) Acoperă cazuri limită? 3) Remediază erori codul sau se așteaptă la un comportament corect? Semnalează și consolidează testele slabe. [teste]"

Șablon de optimizare a acoperirii: „Identificați părțile netestate ale acestei clase și sugerați teste semnificative. Prioritizați căile cu risc real, nu doar numărul de acoperiri. [cod]”

Greșeli comune

  • Testează doar scenariul fericit. Erorile sunt stocate în stări limită; Cereți-le deschis.
  • Acceptarea unui test gol/inutil. Testele de tip assertTrue(true) umflă domeniul de aplicare și nu oferă nicio protecție.
  • AI-ul verifică ce face codul. Testarea ar trebui să se aștepte la ce ar trebui să facă codul; în caz contrar, remediază eroarea.
  • Numărul domeniului de aplicare este greșit pentru scop. Acoperire de 90% nu înseamnă precizie de 90%.
  • Conectarea la text în testarea UI. Testul este întrerupt când textul se schimbă; Utilizați un identificator stabil (id).
  • Configurarea incorect de batjocură. „Testul unitar” care apelează serviciul efectiv va fi lent și fragil.

În concluzie

Testarea este coloana vertebrală a calității mobile, iar AI este foarte eficientă în acest domeniu, în special în testarea unitară. Urmați piramida de testare: multe unități, integrare medie, puțină testare a UI. Solicitați în mod explicit AI pentru scenariul fericit, precum și cazurile limită și căile de eroare. Asigurați-vă că fiecare test generat validează efectiv un comportament; Testele goale și acoperirea umflată sunt înșelătoare. Cel mai important, spuneți AI-ului ce ar trebui să facă codul, nu ce face, astfel încât testul să detecteze eroarea, nu să o rezolve.

Sarcina de aplicare

Solicitați teste de la AI utilizând „Șablonul de test unitar” pentru o funcție logică de afaceri (de exemplu, calculul reducerii sau validarea formularului) și specificați în mod explicit cazurile limită (nule, negative, prea mari). Rulați testele generate, apoi auditați aceleași teste cu „Șablonul de auditare de testare”. Găsiți cel puțin un test slab, întăriți-l și testați dacă testele surprind o eroare reală a funcției (prin adăugarea unui mic bug).

lista de verificare

  • [ ] Am selectat stratul potrivit pentru piramida de testare (unitate prioritară)
  • [ ] Am vrut cazuri limită și de eroare pe lângă scenariul fericit
  • [ ] Am verificat că fiecare test conține o afirmație semnificativă
  • [ ] Am spus AI ce ar trebui să facă codul, nu ce face
  • [ ] M-am concentrat pe căile de risc reale, nu pe numărul de acoperiri
  • [ ] Am folosit un identificator stabil în testele UI, nu m-am legat de text