Dobici:
- Sposobnost sprječavanja umjetne inteligencije da pogrešno ponašanje prihvati kao 'ispravno' izračunavanjem očekivane vrijednosti u jediničnim testovima neovisno o pravilu prihvaćanja
- Sposobnost ispisa brzih, neovisnih i ponovljivih testova primjenom AAA i FIRST principa i ismijavanjem vanjskih ovisnosti
- Sposobnost testiranja testova s mutacijom (razbijanje koda) i prepoznavanja koda koji je težak za testiranje kao miris dizajna
Najveći i najbrži sloj piramide testiranja je jedinično testiranje — testiranje koje provjerava funkciju ili mali dio koda odvojeno od svega ostalog. Tisuće jediničnih testova pokreću se u sekundi i otkrivaju pogrešku dok je kod još uvijek na zaslonu programera. Umjetna inteligencija (AI) možda je najvještija u izradi jediničnih testova: date joj funkciju, AI proizvodi desetke testova. Ali upravo ta pogodnost stvara najveću zamku: umjetna inteligencija lako proizvodi testove koji "svjetle zeleno, ali ništa ne provjeravaju" ili prihvaćaju trenutno (možda neispravno) ponašanje koda kao "ispravno". U ovoj ćete jedinici naučiti kako napisati istinski zaštitne jedinične testove s umjetnom inteligencijom i odnos između koda koji se može testirati i umjetne inteligencije.
Kvalitete dobrog jediničnog testa: PRVO
Dobri jedinični testovi slijede načela FIRST: brzi, neovisni (testovi ne bi trebali ovisiti jedni o drugima), ponovljivi (ponovljivi — isti rezultat u bilo kojem okruženju), samoprovjera (jasan prolaz/pad), pravovremenost (na vrijeme). Podsjetite se ovih načela kada AI proizvodi testove; posebno zahtijevajte da test ne ovisi o vanjskom svijetu (stvarna baza podataka, mreža, sat) kako bi bio "neovisan" i "ponovljiv".
AAA uzorak i izražajna tvrdnja
Solidan jedinični test slijedi strukturu AAA: Rasporedi (pripremi — postavi ulaze i ovisnosti), Djeluj (izvrši — pozovi funkciju koja se testira), Ustvrdi (potvrdi — usporedi rezultat s očekivanom vrijednošću). Kritična je tvrdnja. Najčešća pogreška koju umjetna inteligencija čini je izvođenje tvrdnje iz izlaza koda koji se testira - logika "što god vrati je istina". Time test postaje besmislen. Ispravan način je samostalno odrediti očekivanu vrijednost (iz kriterija prihvatljivosti izračunati je ručno).
Pažnja: ako AI-ju kažete "napiši test za ovu funkciju", AI može pokrenuti funkciju i napisati svoj izlaz kao "očekivan". Ovaj test prolazi čak i ako je funkcija lažna. Umjesto toga, recite "izračunavate očekivane rezultate u skladu s ovim pravilima, ne pozivajte se na trenutni izlaz funkcije."
Rugalice, zaglavci i ovisnosti
Jedinično testiranje zahtijeva izolaciju. Ako vaša funkcija ovisi o bazi podataka ili API-ju, oni se tijekom testiranja zamjenjuju lažnim objektima (mock/stub — kontrolirana, lažna zamjena za stvarnu ovisnost). To čini test brzim, neovisnim i ponovljivim. AI može proizvesti lažnu instalaciju; Ali čuvajte se pretjeranog ismijavanja: ako ismijavate sve, test će samo potvrditi "što ismijavanje vraća", a ne stvarnu logiku. Ravnoteža: oponašajte vanjski svijet, izvršite pravu logiku koja se testira.
Mogućnost testiranja i AI
Postoji zanimljiva povratna informacija: kod koji je teško testirati često je loše dizajniran kod. Ako AI ima problema s pisanjem testova za funkciju (previše ovisnosti, skriveno globalno stanje, nuspojave), to je miris dizajna. Pitati AI "kako biste preradili ovaj kod da ga se može testirati" dovodi do boljeg testiranja i boljeg koda.
Parametrirani testovi i raznolikost podataka
Pisanje zasebnog testa svaki put za provjeru istog pravila s različitim unosima je zamorno i teško za održavanje. Parametrizirano testiranje — struktura koja opetovano izvodi istu logiku ispitivanja na popisu ulaza i očekivanih rezultata — eliminira ovo ponavljanje: jedno testno tijelo se hrani desecima ulaznih parova. Umjetna inteligencija je vrlo učinkovita u izradi ovih tablica očekivanih ishoda kada joj date svoja pravila prihvaćanja; Konkretno, sustavno prikazuje granične vrijednosti i klase ekvivalencije.
Ali i ovdje postoji zamka: AI nastoji izvesti očekivane rezultate u generiranoj tablici iz koda koji se testira. Ova je pogreška još opasnija u parametriziranom testiranju, jer jedna netočna logika poništava desetke redaka. Stoga uvijek imajte neovisno izračunati stupac očekivanog rezultata u skladu s pravilom prihvaćanja i ručno potvrdite barem nekoliko redaka. Također zatražite stupac opisa "što svaki red predstavlja"; pa kad se red prekine, odmah vidite koje je stanje prekinuto.
Savjet: Namjerno dodajte "redak zamke" u parametariziranu testnu tablicu — to jest, svjesno pogrešno upišite rezultat. Ako ta linija ne postane crvena kada pokrenete test, vaš test zapravo ne provjerava tu situaciju. Ovo je brza lažna provjera.
Slab upit / Jak upit
Slabo: "Napišite jedinični test za ovu funkciju."
Jako: Napišite [jezik/okvir] jedinične testove za funkciju "taxCalculate(iznos, stopa). Pravilo prihvaćanja: rezultat = iznos * stopa, zaokruženo na 2 decimale; negativan iznos ili stopa daje pogrešku; vraća 0 ako je stopa 0. Upotrijebite AAA strukturu. Ručno izračunajte očekivane vrijednosti prema OVIM pravilima; ne pozivajte se na trenutni izlaz funkcije. Pokrijte ograničene i negativne slučajeve (0, negativno, vrlo veliki, zaokruženi na decimale).
Snažan brz; Daje pravilo prihvaćanja, nezavisna očekivana očekivana vrijednost, strukturu i rubne slučajeve. Tako test postaje čuvar pravila, a ne ogledalo kodeksa.
Tablica kvalitete jediničnog testa
simptom
Loš test (lažno povjerenje)
dobar test
ustvrditi
Ništa ili "nije nula"
Očekivana konkretna vrijednost
Očekivani izvor vrijednosti
Izlaz funkcije
Pravilo prihvaćanja / ručni izračun
ovisnost
Stvarni DB/mreža/sat
Izolirano s mock/stub
rubno kućište
Samo sretan put
granica, negativno, pogreška
Kad razbiješ šifru
ostaje zelena
pocrveni
Ime
test1, testMetoda
opisuje pravilo koje potvrđuje
Četiri predloška za kopiranje
1) Testiranje jedinica prema pravilima:
Vaša uloga: viši inženjer za testiranje softvera. Napišite jedinični test na sljedećoj funkciji s [jezik/okvir]: [potpis]. Pravila prihvaćanja: [pravila]. - Koristite AAA strukturu. - Ručno izračunajte očekivane vrijednosti prema OVIM pravilima; NEMOJTE referencirati trenutni izlaz funkcije. - Pokrijte granični, negativni, pogrešku i sretan put zasebnim testovima. - Neka svaki naziv testa opisuje pravilo koje provjerava. - Ismijavanje vanjskih ovisnosti; Neka stvarna logika funkcionira.
2) Kontrola otpornosti na mutacije:
Pogledajte ove jedinične testove. Navedite 5 manjih izmjena koje bih mogao napraviti na kodu koji se testira (a - umjesto +, >= umjesto >, pomak granice) i recite mi za svaku od njih KOJI će od ovih testova postati crven? Ako se nijedan ne vrati, test je nedovoljan.Kôd + testovi: [zalijepi]
3) Pregled sposobnosti testiranja:
Zašto je teško napisati jedinični test za ovu funkciju? Skrivena ovisnost, globalni status, nuspojave, ima li puno odgovornosti? Predloži minimalno refaktoriranje kako bi se moglo testirati; ne mijenjajte ponašanje. Šifra: [zalijepi]
4) Nepotpuni završetak scenarija:
Dane su sljedeće funkcije i dostupni testovi. Navedite koje ponašanje/edgecase NIKADA nije testirano (praznina u opsegu) i dodajte test za svaki. Funkcija+testovi: [zalijepi]
tri mini kućišta
Slučaj 1 — Testiranje zrcaljenja koda. Programer je dao AI-u da napiše test za funkciju zaokruživanja; 10 testova je bilo zeleno. Zapravo, funkcija je zaokruživala u krivom smjeru, ali AI je uzeo očekivane vrijednosti iz izlaza funkcije, pa su testovi smatrali da je pogreška "točna". Kada su očekivane vrijednosti ručno izračunate s "rule-driven" predloškom, 4 testa postala su crvena i otkrivena je prava pogreška.
Slučaj 2 — Vrijednost kontrole mutacije. Jedan se tim oslanjao na 45 jediničnih testova. Isprobano 20 manjih izmjena koda s "provjerom robusnosti mutacije"; testovi su uhvatili samo njih 11. Preostalih 9 smetnji prošlo je tiho. Tim je pojačao slabe testove; Ovi poboljšani testovi u sljedećem su izdanju otkrili stvarnu pogrešku u izračunu.
Slučaj 3 — Netestabilnost je miris dizajna. AI nije mogao napisati testove za funkciju naručivanja, stalno je trebao pravu bazu podataka. Predložak "testability review" pokazao je da je funkcija ugrađena u pristup bazi podataka. Kad je ubrizgavanje ovisnosti uklonjeno, mogli su se pisati testovi i kod je postao čišći.
Uobičajene greške
- Izvođenje očekivane vrijednosti iz koda. AI prihvaća izlaz funkcije kao "ispravan"; test koji potvrđuje neispravan kod.
- Test bez tvrdnje ili s trivijalnom tvrdnjom. "Nije izbacio grešku, prošao je" logika; Ništa ne potvrđuje.
- Ekstremno ruganje. Ruganje svemu i testiranje samo onoga što ruganje vraća; prava logika se ne testira.
- Samo sretan put. Zaobilaženje graničnih, negativnih stanja i stanja pogreške.
- Ne testira se razbijanjem koda. Vjerovati zelenoj boji bez provjere mutacije.
- Ignoriranje neprovjerljivosti. Ne prepoznavanje i popravljanje lošeg dizajna umjesto forsiranja teškog testiranja.
Ukratko
Jedinični testovi su najbrži i najveći sloj piramide testiranja; Hvata grešku u najjeftinijem trenutku. AI je vrlo sposoban proizvesti jedinične testove, ali njegova najveća zamka je pisanje testova koji pretpostavljaju netočno ponašanje kao "ispravno" izvođenjem očekivane vrijednosti iz samog koda. Rješenje: dajte pravila prihvaćanja, ručno izračunajte očekivane vrijednosti, nametnite načela AAA i FIRST, rugajte se vanjskom svijetu i pokrenite stvarnu logiku i testirajte svaki test mutacijom (razbijanje koda). Kod koji je teško testirati znak je dizajna koji treba popraviti.
Zadatak aplikacije
Odaberite funkciju koja sadrži poslovno pravilo iz vašeg vlastitog projekta. Napišite pravila prihvaćanja i neka umjetna inteligencija napiše testove s predloškom "testiranja jedinice prema pravilima"; Ručno izračunajte očekivane vrijednosti. Zatim primijenite "provjeru robusnosti mutacije": napravite najmanje 5 malih prekida u kodu i izmjerite koliko testova postaje crveno. Dodajte novi test za neuhvaćene kvarove. Prijavite koliko je poremećaja uhvaćeno (kao što je rezultat mutacije).
popis za provjeru
- [ ] Dao sam pravila prihvaćanja i dao sam ručno izračunati očekivane vrijednosti.
- [ ] Uvjerio sam se da testovi ne izvode očekivanu vrijednost iz koda.
- [ ] Uspostavio sam neovisno testiranje prema smjernicama AAA i FIRST.
- [ ] Rugao sam se vanjskim ovisnostima i vodio stvarnu logiku.
- [ ] Pokrio sam ograničenja, negativne slučajeve i slučajeve pogreške.
- [ ] Razbijanjem šifre (mutacija) dokazao sam da testovi doista štite.