Enota 6 / 11

Generiranje testov z umetno inteligenco: testi enot, vmesnikov in avtomatizacije

Dobički:

  • Sposobnost izdelave testov enote, integracije in uporabniškega vmesnika z umetno inteligenco v skladu s piramido testiranja in pokrivanje situacij omejitev in napak ter srečnih scenarijev
  • Sposobnost izločanja praznih/neuporabnih testov in napihnjene pokritosti s preverjanjem, ali vsak ustvarjen test dejansko potrjuje vedenje
  • Zagotavljanje, da test ujame napako in prepreči, da bi jo popravil, tako da AI pove, kaj naj naredi koda

Pisanje kode je polovica dela; Druga polovica je dokaz, da koda deluje pravilno. Mobilne aplikacije se srečujejo s stotinami različnih naprav, velikosti zaslonov, različic operacijskega sistema in vedenja uporabnikov. Vsega tega je nemogoče preizkusiti ročno; Zato je avtomatizirano testiranje (koda za testiranje kode – testiranje, ki poteka brez človeškega klika) hrbtenica mobilne kakovosti. Umetna inteligenca je neverjetno učinkovita pri pisanju testov, saj je pisanje testov natanko takšna vrsta vzorčnega dela, ki mu je všeč: preverjanje določenega vedenja za specifične vnose. V tej enoti se bomo naučili, kako pospešiti testiranje enot, testiranje vmesnikov in avtomatizacijo z AI, vendar zagotoviti kakovost testa skozi človeške oči.

Testna piramida: kaj testirati in koliko

Strategija zdravega testiranja je podobna piramidi. Baza vključuje veliko število enotnih testov (hitro testiranje, ki testira posamezno funkcijo ali razred v izolaciji); so hitri in poceni. Na sredini je manj integracijskega testiranja (testiranje, kako več delov deluje skupaj). Na vrhu je minimalno testiranje uporabniškega vmesnika/od konca do konca (testiranje se opravi s klikom na zaslon, kot to počne uporabnik); so realistični, a počasni in krhki. Umetna inteligenca pomaga na vseh ravneh, vendar je največja vrednost v osnovi: hitra izdelava testov enote poslovne logike.

Vrsta testa

Področje uporabe

hitrost

Učinkovitost AI

testiranje enote

Ena funkcija/razred

zelo hitro

zelo visoko

integracija

vmesni sloj

srednje

visoka

UI / od konca do konca

Pretok na celotnem zaslonu

počasi

Srednje (lomljivo)

Namig: Ko umetni inteligenci naročite, naj "generira teste za to funkcijo", izrecno zahtevajte robne primere: prazen vnos, nič, negativno število, zelo velika vrednost, omrežna napaka. AI zlahka ustvari srečno pot; Prave napake se skrivajo v mejah in skočijo ven, če jih tam nočeš.

Koraki pisanja testov z AI

  1. Določite vedenje, ki ga želite testirati. "Ta funkcija bi morala dati ta izhod temu vhodu."
  2. Določite okvir. JUnit + MockK v sistemu Android, XCTest v sistemu iOS, Espresso (Android) ali XCUITest (iOS) za uporabniški vmesnik.
  3. Vprašajte za mejna stanja. Vesel scenarij + napaka + prekinitvene točke.
  4. Upravljanje lažnih predmetov. Zunanje odvisnosti, kot sta omrežje in baza podatkov, so emulirane za testiranje (mock — nadzorovana mock namesto dejanske storitve).
  5. Izvedite test in preverite. Ali je test uspešen, ali potrdi kaj resnično pomembnega?

Peti korak je kritičen. AI včasih ustvari neuporabne teste, ki "vedno uspejo"; na primer test, ki ne preverja ničesar ali preverja lastne lažne podatke. Uspešen izpit in dragocen izpit sta različni stvari.

Pozor: Samo zato, ker lahko AI proizvaja, še ne pomeni, da je test pravilen. Včasih AI sprejme trenutno (morda napačno) vedenje kode kot "pravilno" in temu primerno napiše teste. Takšno testiranje odpravi napako, namesto da bi jo ujelo. Vi določite, kaj test pričakuje; Povejte AI, kaj naj naredi, ne kaj počne koda.

Mera pokritosti testa in zmota

Pokritost testa (kakšen odstotek kode izvajajo testi) je uporabna, a zavajajoča metrika. 90 % pokritost pomeni, da je bilo izvedenih 90 % kode; vendar ni bilo preverjeno, da te linije delujejo pravilno. Preizkus, ki zažene vrstico in ne preveri rezultata, poveča obseg, vendar ne zagotovi varnosti. Cilj niso visoke številke, ampak smiselna validacija. Z umetno inteligenco lahko hitro povečate obseg, vendar poskrbite, da vsak test dejansko preizkusi vedenje.

trije mini kovčki

Primer 1 – Ujet položaj na meji. Od umetne inteligence so zahtevali teste za funkcijo prenosa denarja v bančni aplikaciji, posebej pa sta bila dodana scenarija "negativen znesek" in "več kot stanje". Test je pokazal, da prenos ni bil blokiran z negativnim zneskom; to bi bila velika varnostna ranljivost v proizvodnji. Zaprto z dodajanjem enovrstičnega kontrolnika. Lekcija: mejni testi so najbolj dragoceni testi.

Primer 2 – Lažni test. Ena ekipa je z olajšanjem povečala pokritost na 85 % s 40 testi enot, ki jih je izdelal AI. Med pregledom je bilo ugotovljeno, da večina testov dejansko ni preverila nobenega izhoda, samo poklicali so funkcijo in zapisali assertTrue(true). Pokritost je bila visoka, zaščita pa nična. Testi so bili prenovljeni in na novo napisani z resničnimi validacijami. Lekcija: številke pokritosti lahko lažejo.

Primer 3 – pospešeno testiranje uporabniškega vmesnika. Ekipa za e-trgovino je v 20 minutah napisala skript XCUITest toka dodajanja v voziček z AI; Če bi bilo napisano na roko, bi trajalo pol dneva. AI je uganil identifikatorje elementov zaslona; Ekipa jih je primerjala s pravo kodo in jih popravila. Hitrost osnutka je resnična, vendar je preverjanje identifikatorja človeško delo.

Šibek poziv/močan poziv

Šibek poziv: "Napišite preizkus za to funkcijo."

Zmogljiv poziv: "Izdelajte teste enote za to funkcijo Kotlin z JUnit5 + MockK. Funkcija: denarni prenos (znesek, vir, cilj). Vedenje za testiranje (kaj naj naredi koda): - Veljaven prenos mora biti uspešen - Negativen ali ničelni znesek mora biti zavrnjen - Znesek, večji od stanja, mora biti zavrnjen - Omrežna napaka mora sprožiti ustrezno izjemo. Vsak test mora preveriti samo eno stvar, njihova imena morajo biti opisna, zasmehovati zunanjo storitev. Ne napiši prazno trditev."

Kopirane predloge

Predloga za preizkus enote: "Ustvari teste enote [JUnit/XCTest] za to funkcijo za [jezik]. Pričakovano vedenje: [kaj storiti]. Vključuje: srečen scenarij, ničelni vnos, prekinitvene točke, primer napake. Naj vsak preizkus preveri posamezno vedenje; uporabi smiselno trditev; posmeh. [koda]"

Predloga za testiranje uporabniškega vmesnika: "Napišite preizkus uporabniškega vmesnika naslednjega toka z [Espresso/XCUITest]: [uporabniški tok korak za korakom]. Izberite elemente zaslona z ID-jem za ljudi s posebnimi potrebami, uporabite ID namesto besedila. Dodajte strategijo čakanja. Opomni me, da uskladim ID-je elementov z dejansko kodo."

Testna revizijska predloga: "Preglejte te teste: 1) Ali dejansko preverjajo izhod/vedenje ali so ničelni? 2) Ali pokrivajo mejne primere? 3) Ali odpravljajo napake v kodi ali pričakujejo pravilno vedenje? Označite in okrepite šibke teste. [testi]"

Predloga za optimizacijo pokritosti: "Identificirajte nepreizkušene dele tega razreda in predlagajte smiselne preizkuse. Dajte prednost potem z dejanskim tveganjem, ne le številu pokritosti. [koda]"

Pogoste napake

  • Samo preizkušam srečen scenarij. Napake so shranjene v mejnih stanjih; Vprašajte jih odkrito.
  • Sprejemanje praznega/neuporabnega testa. Preizkusi tipa assertTrue(true) povečajo obseg in ne zagotavljajo zaščite.
  • Umetna inteligenca mora preveriti, kaj koda počne. Testiranje bi moralo pričakovati, kaj naj naredi koda; drugače popravi napako.
  • Napačna številka obsega za namen. 90% pokritost ne pomeni 90% natančnosti.
  • Povezovanje z besedilom pri testiranju uporabniškega vmesnika. Test se pokvari, ko se besedilo spremeni; Uporabite stabilen identifikator (id).
  • Nepravilna nastavitev mokov. "Preizkus enote", ki kliče dejansko storitev, bo počasen in krhek.

Če povzamem

Testiranje je hrbtenica mobilne kakovosti in umetna inteligenca je na tem področju zelo učinkovita, zlasti pri testiranju enot. Sledite testni piramidi: veliko enot, srednja integracija, malo testiranja uporabniškega vmesnika. Umetno inteligenco izrecno vprašajte za srečen scenarij ter omejitev primerov in poti napak. Prepričajte se, da vsak ustvarjen test dejansko potrdi vedenje; Prazni testi in napihnjena pokritost so zavajajoči. Najpomembneje je, da AI povejte, kaj naj koda počne, ne kaj počne, tako da test ujame napako, ne pa jo popravi.

Aplikacijska naloga

Zahtevajte teste od umetne inteligence z uporabo »predloge za preizkus enote« za funkcijo poslovne logike (npr. izračun popusta ali preverjanje obrazca) in izrecno navedite omejitvene primere (ničelen, negativen, prevelik). Zaženite ustvarjene teste, nato pa dajte iste teste revidirati s "Predlogo za revizijo preizkusa". Poiščite vsaj en šibak test, ga okrepite in preizkusite, ali testi ujamejo dejansko napako funkcije (z dodajanjem majhne napake).

kontrolni seznam

  • [ ] Izbral sem ustrezno plast za testno piramido (prioritetna enota)
  • [ ] Poleg srečnega scenarija sem želel primere omejitev in napak
  • [ ] Preveril sem, da vsak preizkus vsebuje smiselno trditev
  • [ ] AI sem povedal, kaj naj koda naredi, ne kaj počne
  • [ ] Osredotočil sem se na dejanske poti tveganja, ne na število kritij
  • [ ] Uporabil sem stabilni identifikator v testih uporabniškega vmesnika, nisem se povezal z besedilom