Jedinica 6 / 11

Generisanje testova sa veštačkom inteligencijom: testovi jedinica, interfejsa i automatizacije

Dobici:

  • Sposobnost izrade jediničnih, integracijskih i UI testova s umjetnom inteligencijom u skladu s piramidom testiranja i pokrivanja ograničenja i situacija greške, kao i sretnih scenarija
  • Sposobnost uklanjanja praznih/beskorisnih testova i naduvene pokrivenosti provjerom da li svaki generirani test zapravo potvrđuje ponašanje
  • Osigurati da test uhvati grešku i spriječi ga da popravi grešku govoreći AI-u šta bi kod trebao učiniti

Pisanje koda je pola posla; Dokazivanje da kod radi ispravno je druga polovina. Mobilne aplikacije se susreću sa stotinama različitih uređaja, veličina ekrana, verzija operativnog sistema i ponašanja korisnika. Nemoguće je testirati sve ovo ručno; Zato je automatsko testiranje (kod za testiranje koda — testiranje koje se izvodi bez ljudskog klika) okosnica mobilnog kvaliteta. AI je nevjerovatno efikasna u pisanju testova jer je pisanje testova upravo ona vrsta obrasca koji voli: validacija specifičnog ponašanja za određene ulaze. U ovoj cjelini naučit ćemo kako ubrzati testiranje jedinica, testiranje interfejsa i automatizaciju pomoću AI, ali osigurati kvalitetu testa ljudskim očima.

Piramida testiranja: šta testirati i koliko

Zdrava strategija testiranja liči na piramidu. Baza uključuje veliki broj jediničnih testova (brzo testiranje koje testira jednu funkciju ili klasu u izolaciji); brzi su i jeftini. U sredini je manje integracijskog testiranja (testiranje kako više dijelova rade zajedno). Na vrhu se nalazi minimalno UI/end-to-end testiranje (testiranje se vrši klikom na ekran kao što to čini korisnik); oni su realni, ali spori i krhki. AI pomaže na svakom sloju, ali najveća vrijednost je u osnovi: brza proizvodnja jediničnih testova poslovne logike.

Vrsta testa

Obim

brzina

AI efikasnost

jedinično testiranje

Jedna funkcija/klasa

vrlo brzo

veoma visoko

integracija

međusloj

srednje

visoko

UI / end-to-end

Prijenos cijelog ekrana

sporo

srednje (lomljivo)

Savjet: Kada AI kažete da "generira testove za ovu funkciju", eksplicitno zatražite rubne slučajeve: prazan unos, null, negativan broj, vrlo velika vrijednost, mrežna greška. AI lako proizvodi sretan put; Prave greške se kriju u granicama i iskaču van ako ih ne želite tamo.

Koraci pisanja testova sa AI

  1. Definirajte ponašanje koje se testira. "Ova funkcija bi trebala dati ovaj izlaz ovom ulazu."
  2. Navedite okvir. JUnit + MockK na Androidu, XCTest na iOS-u, Espresso (Android) ili XCUITest (iOS) za korisničko sučelje.
  3. Pitajte za granična stanja. Sretan scenario + greška + tačke prekida.
  4. Upravljajte lažnim objektima. Eksterne zavisnosti kao što su mreža i baza podataka se emuliraju za testiranje (mock — kontrolirani mock umjesto stvarne usluge).
  5. Pokrenite test i potvrdite. Da li test prolazi, da li potvrđuje nešto zaista značajno?

Peti korak je kritičan. AI ponekad proizvodi beskorisne testove koji "uvijek prolaze"; na primjer, test koji ništa ne potvrđuje ili provjerava vlastite lažne podatke. Položen test i vrijedan test su različite stvari.

Oprez: Samo zato što AI može proizvesti ne znači da je test ispravan. Ponekad AI prihvati trenutno (možda pogrešno) ponašanje koda kao "ispravno" i u skladu s tim piše testove. Takvo testiranje popravlja grešku umjesto da je uhvati. Vi određujete šta test očekuje; Recite AI šta treba da radi, a ne šta radi kod.

Ispitna mjera pokrivenosti i zabluda

Pokrivenost testom (koliki postotak koda pokreću testovi) je korisna, ali obmanjujuća metrika. 90% pokrivenosti označava da je 90% koda izvršeno; ali nije potvrđeno da te linije rade ispravno. Test koji pokreće liniju i ne provjerava rezultat naduvava opseg, ali ne pruža sigurnost. Cilj nisu visoki brojevi, već smislena validacija. Možete se brzo povećati pomoću AI, ali se pobrinite da svaki test zaista testira ponašanje.

tri mini kofera

Slučaj 1 — Uhvaćena granična situacija. AI je zatražen za testove za funkciju prijenosa novca u bankarskoj aplikaciji, a posebno su dodani scenariji "negativan iznos" i "više od bilansa". Test je pokazao da transfer nije blokiran negativnim iznosom; ovo bi bila velika sigurnosna ranjivost u proizvodnji. Zatvoreno dodavanjem kontrole u jednom redu. Lekcija: granični testovi su najvredniji testovi.

Slučaj 2 — Lažni test. Jedan tim je odahnuo jer je povećao pokrivenost na 85% sa 40 testova jedinica koje je proizvela AI. Tokom inspekcije, vidjelo se da većina testova zapravo nije potvrdila nikakav izlaz, samo su pozvali funkciju i napisali assertTrue(true). Pokrivenost je bila visoka, ali zaštita je bila nula. Testovi su revidirani i prepisani sa stvarnim validacijama. Pouka: brojevi pokrivenosti mogu lagati.

Slučaj 3 — Ubrzano testiranje korisničkog sučelja. Tim za e-trgovinu napisao je XCUITest skriptu toka dodavanja u korpu sa AI za 20 minuta; Da se piše rukom, trebalo bi pola dana. AI pogodio identifikatore elemenata ekrana; Tim ih je upario sa pravim kodom i popravio ih. Brzina nacrta je stvarna, ali provjera identifikatora je ljudski posao.

Slaba prompt / Jaka prompt

Slab upit: "Napišite test za ovu funkciju."

Snažan prompt: "Proizvedite jedinične testove za ovu funkciju Kotlin sa JUnit5 + MockK. Funkcija: transfer novca (iznos, izvor, cilj). Ponašanje za testiranje (šta kod treba da uradi):- Valjani transfer mora biti uspješan- Negativan ili nulti iznos mora biti odbačen- Iznos veći od stanja mora biti odbijen- Mrežna greška mora biti potvrđena samo jedna stvar, eksterna greška treba da bude odgovarajuća stvar. usluga Ne pišite praznu tvrdnju."

Predlošci koji se mogu kopirati

Predložak jediničnog testa: "Generiraj [JUnit/XCTest] jedinične testove za ovu funkciju za [jezik]. Očekivano ponašanje: [šta učiniti]. Uključuje: srećan scenario, nulti unos, tačke prekida, slučaj greške. Neka svaki test potvrdi jedno ponašanje; koristi smislenu tvrdnju; ismijavanje. [kod]"

Šablon za testiranje korisničkog sučelja: "Napišite UI test sljedećeg toka sa [Espresso/XCUITest]: [korisnički tok korak po korak]. Odaberite elemente ekrana s ID-om pristupačnosti, koristite id umjesto teksta. Dodajte strategiju čekanja. Podsjeti me da uskladim ID-ove elemenata sa stvarnim kodom."

Predložak revizije testa: "Ispitajte ove testove: 1) Da li oni zaista verificiraju izlaz/ponašanje ili su null? 2) Da li pokrivaju granične slučajeve? 3) Da li ispravljaju grešku koda ili očekuju ispravno ponašanje? Označite i pojačajte slabe testove. [testovi]"

Predložak za optimizaciju pokrivenosti: "Identifikujte netestirane dijelove ove klase i predložite smislene testove. Odredite prioritete stazama sa stvarnim rizikom, a ne samo brojem pokrivenosti. [šifra]"

Uobičajene greške

  • Samo testiram srećni scenario. Greške se pohranjuju u granična stanja; Zatražite ih otvoreno.
  • Prihvatanje praznog/beskorisnog testa. Testovi tipa assertTrue(true) naduvaju opseg i ne pružaju nikakvu zaštitu.
  • AI provjeri šta kod radi. Testiranje treba da očekuje šta kod treba da uradi; inače popravlja grešku.
  • Greška u broju opsega za tu svrhu. 90% pokrivenosti ne znači 90% tačnosti.
  • Povezivanje na tekst u UI testiranju. Test se prekida kada se tekst promijeni; Koristite stabilan identifikator (id).
  • Pogrešno postavljanje ruga. "Jedinični test" koji poziva stvarnu uslugu će biti spor i krhak.

Ukratko

Testiranje je okosnica mobilnog kvaliteta, a AI je vrlo efikasan u ovoj oblasti, posebno u jediničnom testiranju. Pratite piramidu testiranja: mnogo jedinica, srednja integracija, malo UI testiranja. Eksplicitno zatražite od AI za sretan scenario, kao i za ograničenje slučajeva i putanja grešaka. Uvjerite se da svaki generirani test zapravo potvrđuje ponašanje; Prazni testovi i naduvana pokrivenost obmanjuju. Ono što je najvažnije, recite AI šta kod treba da radi, a ne šta radi, tako da test uhvati grešku, a ne da je popravi.

Zadatak aplikacije

Zatražite testove od AI koristeći “Unit test template” za funkciju poslovne logike (npr. obračun popusta ili validacija obrasca) i eksplicitno specificirajte granične slučajeve (null, negativan, prevelik). Pokrenite generirane testove, a zatim dajte reviziju istih testova pomoću "Test audit template". Pronađite barem jedan slab test, pojačajte ga i testirajte da li testovi hvataju stvarnu grešku funkcije (dodavanjem male greške).

kontrolna lista

  • [ ] Odabrao sam odgovarajući sloj za test piramidu (prioritetna jedinica)
  • [ ] Želeo sam ograničenja i slučajeve grešaka osim srećnog scenarija
  • [ ] Provjerio sam da svaki test sadrži smislenu tvrdnju
  • [ ] Rekao sam AI šta kod treba da radi, a ne šta radi
  • [ ] Fokusirao sam se na stvarne puteve rizika, a ne na broj pokrića
  • [ ] Koristio sam stabilan identifikator u UI testovima, nisam se vezao za tekst