Enota 6 / 12

Avtomatizacija testiranja in zagotavljanje kakovosti

Dobički:

  • Sposobnost izdelave testov enote, integracije in robnih primerov s smiselno trditvijo z AI
  • Sposobnost sistematičnega pridobivanja pokritosti testov, mejnih vrednosti in negativnih scenarijev s podporo AI
  • Zmožnost preverjanja, ali testi, ki jih izdela AI, dejansko preverjajo vedenje in ne le ponavljajo obstoječe kode

Testiranje je mehanizem, ki dokazuje, da se programska oprema dejansko obnaša, kot je obljubljeno. Dober testni paket vam v nekaj sekundah pove, ali sprememba nekaj pokvari, in daje inženirju svobodo, da samozavestno deluje. Umetna inteligenca pospeši najbolj dolgočasen in najbolj preskočen del pisanja preizkusa: generiranje množice scenarijev, prelomnih točk in negativnih primerov. Toda tukaj je zahrbtna past: umetna inteligenca lahko piše teste, ki preverjajo trenutno (morda napačno) vedenje kode, ne pa njenega domnevnega vedenja; ali pa lahko proizvede prazne teste, ki vedno uspejo in dejansko ne preverijo ničesar. Vrednost testa ni v tem, ali je uspešen, ampak v tem, ali preveri, ali je prava stvar, in se obarva rdeče, ko je napačna.

V tej enoti se boste naučili, kako izdelati enotne, integracijske in robne teste s pomembnimi trditvami; kako sistematično izluščiti pokritost testa, prelomne točke in negativne scenarije; in videli bomo, kako lahko preverite, ali testi, ki jih proizvaja AI, dejansko potrjujejo vedenje.

Koncepti: Preizkušanje enote: testira posamezno funkcijo/razred v izolaciji. Testiranje integracije: preizkusi, ali več delov pravilno deluje skupaj. Assert: Izjava, ki preverja, ali je rezultat enak pričakovanemu; To je srce testa. Pokritost: kolikšen del kode izvajajo testi; Visoka prekrivnost ne zagotavlja kakovosti.

Izdelava smiselnih testov

Dober test jasno naredi tri stvari: vzpostavi stanje, izvede dejanje in uveljavi rezultat. Ko tiskate teste v AI, določite, kakšno vedenje želite preveriti in katere scenarije naj zajema; V nasprotnem primeru naredi površne teste, ki vedno uspejo.

  1. Določite vedenje, ki ga želite testirati. "Kaj šteje za prav?" Jasno odgovorite na vprašanje.
  2. Vprašajte za vrste scenarijev. Normalno, mejno, negativno, stanje napake.
  3. Uvozite smiselno trditev. Ni le "vrgel napake", temveč je "vrnil pravilno vrednost".
  4. Preverite točnost testa. Ali se test obarva rdeče, ko kodo zavestno zlomite?

Poziv za ustvarjanje obširnega testa: »Napišite teste enote za naslednjo funkcijo 'uporabipopust(znesek, kupon)'. Imejte VSAJ en scenarij v naslednjih kategorijah: (1) običajni veljavni kupon, (2) mejne vrednosti (0 znesek, 100 % popust), (3) negativen (neveljaven kupon, negativen znesek), (4) primer napake (ničen kupon). Uveljavite CONCRETE pričakovano vrednost v vsak test (ne samo 'deloval').

Poziv za ekstrakcijo mejne vrednosti: "Izvedite analizo mejne vrednosti za vhode te funkcije. Za vsak parameter ekstrahirajte vrednosti 'tik na meji', 'tik pod mejo', 'tik nad mejo' kot tabelo. Nato navedite testne scenarije, ki pokrivajo te meje. Ne pišite še kode, samo analizo in seznam scenarijev. Funkcija: [podpis]"

Pozor: Visoka pokritost testa (npr. 90 %) ne dokazuje, da je koda pravilna. Pokritost meri, koliko vrstic je bilo izvedenih; ne da te vrstice dajejo pravilen rezultat. Preizkus brez smiselne trditve poveča pokritost, vendar ne jamči ničesar. Vsebina trditve določa kakovost, ne število trditev.

Testiranje samega testa: Logika mutacije

Najbolj praktičen način za razumevanje, ali test, ustvarjen z umetno inteligenco, dejansko deluje, je namerno zlom kode (logika testiranja mutacij). Obrnite pogoj, postavite znak + -; Če se noben test ne obarva rdeče, vaši testi dejansko ne ohranjajo tega vedenja.

Preizkusite poziv za iskanje ranljivosti: "Povejte mi, katerih morebitnih napak v tej kodi naslednji testi MORDA NE bodo ujeli. Predlagajte 5 majhnih mutacij, ki bi jih lahko naredili v kodi (npr. >= namesto >, - namesto +) in za vsako navedite, ali bi jo obstoječi testi ujeli. Za tiste, ki jih ne ujamejo, predlagajte testiranje, ki bi ga bilo treba dodati. Koda: [koda] Testi: [test]"

Šibek poziv / močan poziv

WEAK: "Napišite test za to funkcijo." (Rezultat: običajno en srečen scenarij, šibka trditev; zgreši napake.) MOČNO: »Napišite preizkus za to funkcijo 'passwordStrong'. Pravilo: vsaj 8 znakov, zahtevana je 1 velika črka, 1 številka. Naslednje scenarije pokrijte kot LOČENE teste: točno 8 znakov (omejitev), 7 znakov (pod omejitvijo), brez velikih črk, brez števk, prazen niz, samo presledki, tudi dolgo (1000 znakov) Eksplicitno potrdite pričakovano vrednost true/false v vsakem testu in poimenujte test glede na to, kar preverja."

Zmogljiv poziv ponuja pravila in celotne mejne scenarije. Mejni pari, kot je "natančno 8 / 7 znakov", so najpogostejši kraji za napake (zmeda > z >=). Šibek poziv obide te meje in prenese napako v proizvodnjo.

Vrste testov in kje jih uporabiti

Vrsta testa

Kaj potrjuje?

Prispevek AI

Pozor

enota

Ena funkcija/razred

Hitro ustvarja več scenarijev

Zahtevana je smiselna trditev

integracija

Deli, ki delujejo skupaj

Scenarij in lažni osnutek podatkov

Resnično odvisniško vedenje

konec/sprejmi

Celoten tok uporabnikov

Seznam korakov in pričakovanja

nagnjeni k krhkosti

regresija

Stara napaka se ne vrača

Specifično testiranje napak

Dodati ga je treba vsakemu popravku

Mini etuiji

Primer 1 — Test, ki vedno uspe. AI napiše 12 testov v funkcijo in vsi so uspešni. Inženir postane sumničav in namerno popači vrnjeno vrednost funkcije; Samo 3 testi postanejo rdeči. Ostalih 9 testov ne vsebuje pomembnih trditev. Testiranje je okrepljeno z lovom na mutacije; prava zaščita je pridobljena v 9 scenarijih.

Primer 2 – napaka meje. Funkcija preverjanja starosti bi morala povedati "18 in več je veljavno", vendar je napisano >18, kar pomeni, da je starost 18 zavrnjena. Napaka se takoj pokaže pri testiranju, ker AI z analizo prelomne točke ustvari scenarij »točno 18«. En sam mejni test prepreči kakršne koli pritožbe resničnega uporabnika.

Primer 3 – Popravljanje trenutnega vedenja. Ko je umetni inteligenci rečeno, naj "napiše test na podlagi te kode", ustvari test, ki kot "pravilno" sprejme napako pri zaokroževanju, ki že obstaja v kodi. Ko inženir natisne test v skladu z zahtevo (pričakovana pravilna vrednost) in ne kode, se test obarva rdeče in pride do prave napake. Testi bi morali izhajati iz pričakovanj, ne iz kode.

Pogoste napake

  • Nesmiselna trditev. "Nisem vrgel napake" ni dovolj; Pravilno vrednost je treba preveriti.
  • Zamenjuje obseg s kakovostjo. Visoka pokritost ni jamstvo za natančne rezultate.
  • Tiskanje testa po kodi. Popravi trenutno napako na "true"; Testi bi morali izhajati iz pričakovanj.
  • Preskakovanje mejnih vrednosti. Zamenjava > z >= je najpogostejša napaka; mejne pare je treba preizkusiti.
  • Brez revizije samega testa. Test, ki ne postane rdeč, ko zlomite kodo, ne zagotavlja zaščite.

Če povzamem

Dober testni paket je ključ do samozavestnega izvajanja sprememb. AI hitro ustvari množico scenarijev, omejitev in negativnih situacij; Če pa teste izpelje iz kode in ne iz zahtev, lahko popravi obstoječe napake ali napiše nesmiselne teste, ki vedno uspejo. Uveljavite konkretno pričakovano vrednost v vsakem testu, vključite vezane pare in preverite, ali vaši testi dejansko ščitijo z namernim zlomom kode. Kakovost določa vsebina izjave, ne število obsegov.

Aplikacijska naloga

Izberite funkcijo in ustvarite teste v štirih kategorijah (normalno, mejno, negativno, napaka) z izčrpnim pozivom za ustvarjanje testa; Pri vsakem preskusu naj bo navedena konkretna pričakovana vrednost. Nato zaženite poziv za iskanje ranljivosti, predlagajte 5 majhnih mutacij v kodi in zaženite teste, da preverite, katere ujamejo. Dodajte nov test za vsaj eno mutacijo, ki ni bila ujeta in pokažite, da je zdaj v rdečih številkah.

kontrolni seznam

  • [ ] Teste sem natisnil na podlagi pričakovanega/pravilnega vedenja, ne kode.
  • [ ] Pokril sem običajne, mejne, negativne in napake scenarije.
  • [ ] V vsakem testu sem uveljavil konkretno pričakovano vrednost.
  • [ ] Preizkusil sem mejne pare (tik nad-spodaj / tik nad-spodaj).
  • [ ] Z namernim zlomom kode sem potrdil, da so testi postali rdeči.
  • [ ] Dodal sem nov test za neodkrite mutacije.