Jedinica 6 / 11

Generiranje testova s umjetnom inteligencijom: testovi jedinica, sučelja i automatizacije

Dobici:

  • Sposobnost izrade jediničnih, integracijskih i korisničkih testova s umjetnom inteligencijom u skladu s piramidom testiranja i pokrivanje ograničenja i situacija pogreške, kao i sretne scenarije
  • Sposobnost uklanjanja praznih/beskorisnih testova i pretjeranog pokrivanja provjerom da li svaki generirani test zapravo potvrđuje ponašanje
  • Osiguravanje da test uhvati pogrešku i spriječi ga da popravi pogrešku govoreći umjetnoj inteligenciji što kod treba učiniti

Pisanje koda je pola posla; Druga polovica je dokazivanje da kod radi ispravno. Mobilne aplikacije susreću se sa stotinama različitih uređaja, veličina zaslona, ​​verzija operativnog sustava i ponašanja korisnika. Nemoguće je sve to testirati ručno; Zato je automatizirano testiranje (kod za testiranje koda — testiranje koje se izvodi bez ljudskog klika) okosnica mobilne kvalitete. Umjetna inteligencija je nevjerojatno učinkovita u pisanju testova jer je pisanje testova upravo onakva vrsta obrasca koji voli: provjera valjanosti određenog ponašanja za određene ulaze. U ovoj jedinici naučit ćemo kako ubrzati jedinično testiranje, testiranje sučelja i automatizaciju s AI, ali osigurati kvalitetu testa kroz ljudske oči.

Piramida testiranja: što testirati i koliko

Zdrava strategija testiranja nalikuje piramidi. 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 integracijsko testiranje (testiranje kako više dijelova radi zajedno). Na vrhu postoji minimalno UI/end-to-end testiranje (testiranje se vrši klikom na zaslon kao što to radi korisnik); realni su, ali spori i krhki. AI pomaže na svakom sloju, ali najveća vrijednost je u bazi: brza izrada jediničnih testova poslovne logike.

Vrsta testa

Opseg

brzina

AI učinkovitost

jedinično testiranje

Pojedinačna funkcija/klasa

vrlo brzo

vrlo visoko

integracija

međusloj

srednji

visoka

UI / end-to-end

Cijeli tok zaslona

sporo

Srednje (lomljivo)

Savjet: kada kažete umjetnoj inteligenciji da "generira testove za ovu funkciju", izričito tražite rubne slučajeve: prazan unos, nula, negativan broj, vrlo velika vrijednost, mrežna pogreška. AI lako stvara sretan put; Prave greške skrivaju se u granicama i iskaču ako ih ne želite tamo.

Koraci pisanja testova s AI

  1. Definirajte ponašanje koje će se testirati. "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. Zatražite granična stanja. Sretan scenarij + pogreška + prijelomne točke.
  4. Upravljanje lažnim objektima. Vanjske ovisnosti kao što su mreža i baza podataka emuliraju se za testiranje (mock — kontrolirani mock umjesto stvarne usluge).
  5. Pokrenite test i potvrdite. Prolazi li test, potvrđuje li išta uistinu smisleno?

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

Oprez: samo zato što AI može proizvesti ne znači da je test točan. Ponekad AI prihvaća trenutno (možda neispravno) ponašanje koda kao "ispravno" i u skladu s tim piše testove. Takvo testiranje ispravlja grešku, a ne otkriva je. Vi određujete što test očekuje; Recite umjetnoj inteligenciji što treba raditi, a ne što kod radi.

Mjera pokrivenosti testa i pogreška

Pokrivenost testa (koji postotak koda pokreću testovi) korisna je, ali pogrešna metrika. 90% pokrivenosti znači da je 90% koda izvršeno; ali nije potvrđeno da te linije rade ispravno. Test koji pokreće liniju i ne provjerava rezultat povećava opseg, ali ne pruža sigurnost. Cilj nisu velike brojke, već značajna potvrda. Pomoću umjetne inteligencije možete brzo povećati, ali provjerite je li svaki test zapravo testira ponašanje.

tri mini kućišta

Slučaj 1 — Uhvaćena situacija na granici. AI je zamoljen za testove za funkciju prijenosa novca u bankarskoj aplikaciji, a posebno su dodani scenariji "negativan iznos" i "više od stanja". Test je otkrio da prijenos nije blokiran negativnim iznosom; to bi bila velika sigurnosna ranjivost u proizvodnji. Zatvoreno dodavanjem jednolinijske kontrole. Lekcija: granični testovi su najvrjedniji testovi.

Slučaj 2 — Lažni test. Jedan je tim s olakšanjem povećao pokrivenost na 85% s 40 jediničnih testova koje je izradio AI. Tijekom 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 nula. Testovi su revidirani i ponovno napisani sa stvarnim provjerama. Lekcija: brojke pokrivenosti mogu lagati.

Slučaj 3 — Ubrzano testiranje korisničkog sučelja. Tim za e-trgovinu napisao je XCUITest skriptu tijeka dodavanja u košaricu s umjetnom inteligencijom u 20 minuta; Da se piše rukom, trajalo bi pola dana. AI je pogodio identifikatore elemenata zaslona; Tim ih je spojio sa stvarnim kodom i popravio ih. Brzina nacrta je stvarna, ali provjera identifikatora ljudski je posao.

Slab upit / Jak upit

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

Snažni prompt: "Proizvedite jedinične testove za ovu Kotlin funkciju s JUnit5 + MockK. Funkcija: prijenos novca (iznos, izvor, cilj). Ponašanja za testiranje (što bi kod trebao RADITI):- Valjani prijenos mora biti uspješan- Negativan ili nulti iznos mora biti odbijen- Iznos veći od stanja mora biti odbijen- Mrežna pogreška mora izazvati odgovarajuću iznimku. Svaki test treba potvrditi samo jednu stvar, njihova imena trebaju biti opisna, ismijavati vanjsku uslugu. Nemojte napiši praznu tvrdnju."

Predlošci koji se mogu kopirati

Predložak jediničnog testa: "Generiraj jedinične testove [JUnit/XCTest] za ovu funkciju za [jezik]. Očekivano ponašanje: [što učiniti]. Uključi: sretan scenarij, nulti unos, prijelomne točke, slučaj pogreške. Neka svaki test provjeri jedno ponašanje; koristi smislenu tvrdnju; ismijavaj. [kod]"

Predložak testiranja korisničkog sučelja: "Napišite test korisničkog sučelja sljedećeg tijeka s [Espresso/XCUITest]: [korisnički tijek korak po korak]. Odaberite elemente zaslona s ID-om pristupačnosti, upotrijebite ID umjesto teksta. Dodajte strategiju čekanja. Podsjetite me da uskladim ID-ove elemenata sa stvarnim kodom."

Predložak revizije testiranja: "Provjerite ove testove: 1) Provjeravaju li stvarno izlaz/ponašanje ili su nulti? 2) Pokrivaju li ograničene slučajeve? 3) Ispravljaju li pogreške u kodu ili očekuju li ispravno ponašanje? Označite i ojačajte slabe testove. [testovi]"

Predložak optimizacije pokrivenosti: "Identificirajte neprovjerene dijelove ove klase i predložite smislene testove. Dajte prioritet putovima sa stvarnim rizikom, a ne samo brojem pokrivenosti. [kod]"

Uobičajene greške

  • Samo testiram sretan scenarij. Pogreške se pohranjuju u graničnim stanjima; Tražite ih otvoreno.
  • Prihvaćanje praznog/beskorisnog testa. Testovi tipa assertTrue(true) povećavaju opseg i ne pružaju nikakvu zaštitu.
  • Neka AI provjeri što kod radi. Testiranje treba očekivati ​​što bi kod trebao učiniti; inače ispravlja grešku.
  • Zamijenili broj opsega za tu svrhu. 90% pokrivenost ne znači i 90% točnost.
  • Povezivanje s tekstom u testiranju korisničkog sučelja. Test je pokvaren kada se tekst promijeni; Koristite stabilni identifikator (id).
  • Neispravno postavljanje mokova. "Jedinički test" koji poziva stvarnu uslugu bit će spor i krt.

Ukratko

Testiranje je okosnica mobilne kvalitete, a AI je vrlo učinkovit u ovom području, posebno u jediničnom testiranju. Slijedite piramidu testiranja: mnogo jedinica, srednja integracija, malo testiranja korisničkog sučelja. Izričito pitajte AI za sretan scenarij, kao i za ograničenje slučajeva i putanje pogreške. Uvjerite se da svaki generirani test zapravo potvrđuje ponašanje; Prazni testovi i prenapuhana pokrivenost dovode u zabludu. Što je najvažnije, recite umjetnoj inteligenciji što kod treba raditi, a ne što radi, tako da test uhvati grešku, a ne da je popravi.

Zadatak aplikacije

Zatražite testove od umjetne inteligencije pomoću "predloška za testiranje jedinice" za funkciju poslovne logike (npr. izračun popusta ili provjeru valjanosti obrasca) i izričito odredite granične slučajeve (nula, negativno, preveliko). Pokrenite generirane testove, a zatim izvršite reviziju istih testova pomoću "Predloška revizije testiranja". Pronađite barem jedan slab test, pojačajte ga i provjerite hvataju li testovi stvarnu pogrešku funkcije (dodavanjem malog buga).

popis za provjeru

  • [ ] Odabrao sam odgovarajući sloj za testnu piramidu (jedinica prioriteta)
  • [ ] Htio sam ograničenja i slučajeve pogreške osim sretnog scenarija
  • [ ] Provjerio sam sadrži li svaki test smislenu tvrdnju
  • [ ] Rekao sam umjetnoj inteligenciji što kod treba raditi, a ne što radi
  • [ ] Usredotočio sam se na stvarne putove rizika, a ne na broj pokrića
  • [ ] Koristio sam stabilni identifikator u testovima korisničkog sučelja, nisam se vezao za tekst