Enota 5 / 12

Testna proizvodnja in zagotavljanje kakovosti

Dobički:

  • Sposobnost testiranja enot, robnih primerov in analize vrzeli v pokritosti z AI
  • Možnost tiskanja testnih pričakovanj na podlagi specifikacije, ne trenutnega obnašanja kode
  • Možnost preizkusa, ali test dejansko ščiti z vstavljanjem napak

Pisanje testov je ena izmed nalog, ki prinašajo največjo vrednost, ki jo večina razvijalcev odlaša. Dober testni paket je dokaz, da koda deluje po pričakovanjih, in rešilna bilka za prihodnje spremembe. Težava je v tem, da se pisanje testov ponavlja in zahteva veliko časa – natanko tisto delo, kjer AI blesti. Vendar obstaja ulov: umetna inteligenca pogosto preizkuša obstoječe vedenje kode, ne vedenje, kot bi moralo biti. Obvladovanje te razlike je bistvo te enote.

V tej enoti se boste naučili testiranja enot (testiranje, ki preizkuša funkcijo samo, izolirano), testov robnih primerov in generiranja testnih podatkov z AI; odpravljanje vrzeli v pokritosti testov; in zakaj je slepo zaupanje testom AI nevarno.

Dve strani testiranja: popravljanje vedenja proti preverjanju

Test lahko služi dvema različnima namenoma. Prvi je preverjanje: preverja, ali je koda pravilna, ali je v skladu s specifikacijo. Druga je zaščita pred regresijo: zamrzne vedenje kode danes, tako da če jo kdo jutri pomotoma spremeni, se bo test zlomil in obvestil.

AI je pri slednjem zelo dober; Pogleda kodo in ustvari primere, ki testirajo, "kaj trenutno počne." Toda če je koda že od začetka napačna, lahko AI to napačno vedenje označi kot »pravilno«. Zato morate pregledati trditev vsakega testa, ki ga ustvari AI: "Koda vrne 42 in test pričakuje 42" ne pomeni, da je 42 pravilen odgovor.

Pozor: Če AI prestane test, to ne pomeni, da koda "deluje"; to samo pomeni "obnaša se, kot pričakuje AI". Če pogledate specifikacijo, se odločite, ali je pričakovanje pravilno ali ne.

Korak za korakom: Pisanje robustnih testov z AI

  1. Navedite specifikacijo, ne le kode. Če dodate informacijo "Ta funkcija bi morala narediti to", lahko AI zapiše pravilno pričakovanje; Preizkusil bo trenutno vedenje, če samo vnesete kodo.
  2. Vprašajte za robne primere. Prazen, ničelna, ničelna, negativna, prevelika, slaba oblika, sočasnost — izrecno zahtevajte, da je stran od srečne poti.
  3. Določite okvir in slog testiranja. "uporabi pytest", "vzorec Arrange-Act-Assert", "naj vsak test testira eno stvar" itd.
  4. Preverite pričakovanja (trditev). Primerjajte s specifikacijo, da vsaka trditev preveri pravilno vrednost.
  5. Zapolnite vrzeli v obsegu. Navedite obstoječe teste in vprašajte "katere veje in primeri niso bili testirani?" prisili vas vprašati; nato preverite dodatne izvedene teste.

Trije mini kovčki

1. primer – pokritost od 52 % do 85 %. Testna pokritost enega storitvenega modula je bila 52-odstotna. Ekipa je umetni inteligenci posredovala obstoječe teste, navedla nepreizkušene veje in zanje ustvarila teste. S človeškim pregledom se je pokritost povečala na 85 %; V procesu je umetna inteligenca odkrila dejansko napako (pot, ki je vrnila napačno kodo napake) v veji napake, ki še nikoli ni bila testirana.

Primer 2 – Past fiksacije lažnih pričakovanj. Funkcija zaokroževanja denarja je bila dejansko napačna; Namesto da bi 2,675 zaokrožil na 2,67, je zaokrožil 2,67 namesto 2,68. AI je pogledal kodo in napisal assert round_money(2,675) == 2,67 — napako je zamrznil kot »true«. Ko je razvijalec prebral specifikacijo, je popravil pričakovanje in ujel pravo napako. Preizkušanje pravila, ne kode, je naredilo razliko.

Primer 3 – Eksplozija v mejnem stanju. Ko AI zahteva samo "robne primere" za funkcijo časovnega obsega; Ustvaril je 8 primerov, kot so začetek=konec, obratni interval, prestopno leto 29. februar, različni časovni pasovi in ​​ničelni interval. Dva od teh (obraten razmik in prestopno leto) sta dejansko povzročala napako. Ročno obravnavanje teh primerov se pogosto preskoči; Umetna inteligenca je tukaj postala partner za »edge-case brainstorming«.

Štiri kopirane predloge

Generiranje testa na podlagi specifikacij:

Vloga: razvijalec, ki piše teste. Ogrodje: {{pytest/JUnit/Jest...}}. Kaj NAREDI funkcija (specifikacija): {{pravilo}}Napišite teste za naslednjo funkcijo. Zapišite pričakovanja v skladu s specifikacijo, NE trenutnim rezultatom kode. Srečna pot + dodajte vsaj 4 robne primere. Naj vsak test testira eno stvar, uporabite opisno ime. {{funkcija}}

Edge case brainstorming:

Navedite robne primere/primere napak, ki jih je treba preizkusiti pri testiranju za to funkcijo (nič, nič, prekinitvene točke, slaba oblika, sočasnost, zunanja napaka). Za vsak primer: vnos, pričakovano vedenje. NE pišite še kode, samo navedite.{{function}}

Analiza vrzeli v kritju:

Spodaj so funkcije in razpoložljivi testi. Katere veje, pogoji in primeri niso bili testirani? Navedite pomanjkljivosti in samo za pomanjkljivosti napišite nove teste. Ne ponavljajte obstoječih. Funkcija:{{function}}Preizkusi:{{existing_tests}}

Preizkusni podatki / ustvarjanje lažnega objekta:

Ustvarite realistične testne podatke za teste {{function/service}}: ločeno veljavne vzorce, mejne vzorce in neveljavne vzorce. Predlagajte preprosto lažno vedenje za zunanjo odvisnost {{X}}. Uporaba resničnih zaupnih podatkov/PII; Ustvari lažne podatke.

Šibek poziv/močan poziv

Slab: "Napišite test za to funkcijo."
Močno: "s pytestom. Funkcija apply_discount(total, percent) — pravilo: popust mora biti 0%–30%, izven meja mora biti ValueError, rezultat mora biti zaokrožen na 2 decimalki. Zapišite pričakovanja po tem PRAVILU (ne po kodi). Srečna pot + ti robni primeri: 0%, 30%, 31% (napaka), negativno, skupno=0. [koda]"

Poda pravilo močne sprostitve in pravi, da "napišite pričakovanje v skladu s pravilom, ne s kodo"; Ta en sam stavek zapre past napačnega vedenja, ki popravlja AI.

Vrsta testa

Prispevek AI

človeški nadzor

Srečno testiranje cestnih enot

hitro okostje

Je pričakovanje pravilno?

Edge etuiji

Obsežno razmišljanje

Odstranite nepomembno

Zapolnitev vrzeli v obsegu

Najde preskočene veje

Potrdite pomembnost

Preizkusni podatki/model

Ustvari realističen vzorec

Brez PII, realistični nadzor

Testi upravljajo kakovost, ne jamčijo zanjo

Visoka pokritost testa daje zaupanje, vendar je lahko tudi zavajajoča: 100-odstotna pokritost pomeni "vsaka vrstica je bila izvedena," ne "vsaka vrstica je pravilna." Z AI je preprosto povečati pokritost; Prava vrednost je v zapisu smiselnih pričakovanj. Vrednost testa je njegova sposobnost, da zlomi in vas opozori, ko je koda zlomljiva. Zato testi, ki jih ustvari umetna inteligenca, temeljijo na vprašanju "ali se koda res pokvari, ko se spremeni?" Preizkusite z vprašanjem; Namerno prekinitev črte in opazovanje preloma testa (zamisel o mutaciji) je dokaz, da je test deloval.

Namig: Če želite preveriti, ali test, ki ga napiše AI, deluje, ustvarite majhno napako v kodi (npr. spremenite + v -) in preverite, ali se test pokvari. Če se ne pokvari, vas ta test ne ščiti.

Pogoste napake

  • Zahtevanje testa brez podajanja pravila. Model zamrzne trenutno vedenje; popravi napako kot "true".
  • Sprejemanje pričakovanj, ne da bi jih prebrali. Testiranje je zavajajoče, če ne preverite, ali trditve preverjajo pravilno vrednost.
  • Samo preizkušanje srečne poti. Resnične napake živijo na robu; Izrecno zahtevajte robne primere.
  • Zamenjali obseg z namenom. Visok odstotek ni zagotovilo za pravilno vedenje.
  • Izdelava resničnih/skritih podatkov kot testnih podatkov. Podatki ali skrivnosti strank ne smejo vstopati v testiranje in shranjevanje; Ustvarite sintetične podatke.

Če povzamem

Umetna inteligenca odvzame velik del ponavljajočega se bremena pisanja testov: ustvari hitre okostnjake, velike sezname robnih primerov in analize vrzeli v pokritosti. Toda najbolj kritična točka so pričakovanja: AI poskuša testirati trenutno obnašanje kode, medtem ko bi moralo biti testiranje napisano v skladu s specifikacijo. Podajte pravilo, preverite pričakovanja, uveljavite robne primere in preizkusite, ali testi dejansko ščitijo z vbrizgavanjem hrošča. Testna pokritost je orodje in ne cilj.

Aplikacijska naloga

Izberite funkcijo in najprej natisnite test AI tako, da preprosto podate njegovo kodo; Upoštevajte pričakovanja. Nato znova natisnite test in navedite specifikacijo (zahtevano vedenje) za isto funkcijo. Primerjajte pričakovanja obeh testnih nizov: ali obstajajo različni, kateri razkrije resnično napako? Nazadnje preverite, ali je eden od ustvarjenih testov deloval tako, da v kodo dodate namerno napako in vidite prekinitev preizkusa.

kontrolni seznam

  • [ ] Razlikujem, ali je test namenjen popravku ali preverjanju vedenja.
  • [ ] Ko zahtevam test, podam pravilo (specifikacijo), ki bi moralo veljati, ne kode.
  • [ ] Vsako ustvarjeno trditev primerjam s specifikacijo.
  • [ ] Izrecno zahtevam robne primere in primere napak.
  • [ ] Na odstotek pokritosti gledam kot na orodje in ne kot na cilj.
  • [ ] Z vstavljanjem napak preizkusim, ali test dejansko ščiti.