Dobici:
- Sposobnost prepoznavanja tri lica pseudopovjerenja (neasertivno, samopotvrđivanje, trivijalno tvrdnje) i primjene protuotrova
- Sposobnost korištenja testiranja mutacija i rezultata mutacije kao preciznije mjere kvaliteta od postotka pokrivenosti alatom ili rukom
- Sposobnost pozicioniranja AI kao crvenog tima protiv testiranja i lova na propuste u testiranju bez upadanja u zamku pohvala
U srcu ovog modula je upozorenje koje se ponavlja: zelena svjetleća testna ploča nije dokaz kvaliteta. Ako vam testovi daju samopouzdanje, morate znati da li je to samopouzdanje stvarno ili lažno. U doba vještačke inteligencije (AI), ovo pitanje je kritičnije nego ikad, jer je AI vješt u proizvodnji fluidnih, glatkih, ali šupljih testova. Lažno povjerenje – vjerovati da je softver ispravan jer su testovi zeleni, a u stvari testovi ništa ne potvrđuju – je najopasnija stvar koja se može dogoditi QA timu; jer ne skriva da nema grešaka, već da ne možete vidjeti greške. Ova jedinica objedinjuje filozofiju validacije cijelog modula u jednu disciplinu: testiranje vaših testova.
Zlatni standard za mjerenje kvaliteta testiranja: testiranje mutacija
Najmoćniji način da se shvati da li test zaista štiti ili ne je testiranje mutacije (testiranje mutacija - tehnika koja proizvodi namjerna mala izobličenja/mutacije u izvornom kodu i mjeri da li testovi otkrivaju ta izobličenja). Logika je jednostavna: ako namjerno razbijete kod (pretvorite + u -, a > u >=, istinito u netačno), dobar test paket bi trebao uhvatiti tu korupciju i postati crven. Ako nije, taj poremećaj je preživjeli mutant - tako da vaši testovi zapravo ne održavaju to ponašanje.
Rezultat mutacije = ubijena mutacija / totalna mutacija. Paket sa 90% pokrivenosti linija može imati rezultat mutacije od 40%; Ovo ukazuje da linije rade, ali ponašanje nije provjereno. Ocena mutacije je mnogo iskrenija mera kvaliteta nego procenat pokrivenosti.
Savjet: Postoje alati za automatsku mutaciju (PIT/Pitest za Javu, Stryker za JavaScript/TypeScript, Stryker.NET za .NET, mutmut za Python). Oni automatski generiraju i testiraju stotine mutacija. Ako nemate alat, čak je i ručna metoda "probijanja koda" od neprocjenjive važnosti za kritične funkcije.
Tri lica pseudopovjerenja i njegov protuotrov
Forma pseudo-povjerenja
simptom
protuotrov
Test bez tvrdnje
Kod radi, ništa nije potvrđeno
Prava tvrdnja u svakom testu; test sa mutacijom
samopotvrđujući test
Očekivano = izlaz koda
Nezavisno izračunajte očekivanu vrijednost
Trivijalna tvrdnja
"nije null", "200 vraćeno"
Potvrdite poslovno pravilo/stvarni rezultat
Zabluda velikog obima
90% linija, niska zaštita
Pogledajte rezultat mutacije
Krhka tolerancija testa
"Opet zaglavio, prođi"
Osnovni uzrok + determinističko testiranje
Korištenje AI kao “crvenog tima”
AI može i stvoriti pseudopovjerenje i biti moćan saveznik u lovu na njega. Koristite AI kao crveni tim protiv vlastitih testova: zamolite „napišite kod koji prolazi ove testove, ali je pogrešan“ ili „pronađite subverziju koja će prevariti ove testove“. Ako AI pronađe rupe u vašim testovima, te rupe su pravi rizici.
Oprez: Ne pitajte AI "Da li je kvalitet mog testa dobar?" i uzmite odgovor "da, odlično" kao sigurnost. AI ima tendenciju da bude ljubazan. Umjesto toga, izazovite AI na konkretan zadatak: "proizvesti grešku koja prolazi ove testove." Ako to može proizvesti, vaši testovi su slijepi za tu grešku.
Ekvivalentne mutacije i granice rezultata
Testiranje mutacija je moćno, ali ima kvaku: neke mutacije uopće ne mijenjaju ponašanje koda. One se nazivaju ekvivalentne mutacije (ekvivalentni mutant — oštećeni kod, mutacija koja daje potpuno isti rezultat kao original). Na primjer, promjena početne vrijednosti varijable koja se nikada ne koristi ne utiče na izlaz; Nijedan test to ne može i ne treba uhvatiti. Stoga je 100% rezultat mutacije često nedostižan u praksi i nije cilj. Ručno uklanjanje ekvivalentnih mutacija je radno intenzivno; Dakle, ne čitajte rezultat mutacije kao apsolutni rezultat ispita, već kao iskren pokazatelj "da li moji testovi zaista štite?"
Praktični pristup je sljedeći: umjesto stalnog pokretanja testiranja mutacija u cijeloj bazi koda, pokrenite ga na modulima koji sadrže najveći rizik i najsloženija poslovna pravila. Ispitajte preživjele mutacije u ovim modulima jednu po jednu; Ako je to pravi jaz, dodajte test; ako se radi o ekvivalentnoj mutaciji, označite je opravdanjem i položite. AI može izvršiti početni skrining u procjeni da li je preživjela mutacija ekvivalentna; ali konačnu odluku donosite vi koji znate šta kod radi.
Oprez: Testiranje mutacija je računski skupo (svi relevantni testovi se ponovo pokreću za svaku mutaciju). Dakle, uobičajena i razumna strategija je da se zakaže kao sedmična ili detaljna provjera prije izdanja za kritične module, a ne svako spajanje.
Slaba prompt / Jaka prompt
Slabo: "Jesu li moji testovi dovoljni?"
Snažno: "Ponašajte se kao crveni tim za ovu funkciju i testni paket. (1) Generirajte 8 mutacija u kodu koji se mogu uništiti (zamjena operatora, pomak granice, inverzija uslova, zamjena povratne vrijednosti). (2) Za svaku mutaciju naznačite koji od postojećih testova će je uhvatiti, a koji NE. (3) Za svaku mutaciju koja preživi, napišite i novi kod koji će preživjeti (također napišite novi primjer4). prolazi sve ove testove, ali krši poslovno pravilo Code+test: [paste]"
Snažan prompt; On pozicionira AI kao ispitivača koji probija testove, a ne kao mašinu za pohvale.
Četiri šablona za kopiranje
1) Ručna kontrola mutacija:
Generirajte 8 značajnih mutacija (manjih namjernih poremećaja) za ovaj kod: zamjena aritmetičkih operatora, granica poređenja (> vs >=), logička inverzija, povratna/konstantna zamjena, preskakanje uvjeta. Za svaku mutaciju predvidite koji od dostupnih testova će je uhvatiti ili ne. Kod+testovi: [zalijepi]
2) Ubijanje preživjele mutacije:
Sljedeći izvještaj o testiranju mutacije sadrži preživjele (neuhvaćene) mutacije: [list/izvještaj]. Za svaki, napišite minimalni test koji će ubiti tu mutaciju (kod će postati crven kada se na taj način razbije). Komentirajte kakvo ponašanje test potvrđuje.
3) Crveni tim - test krvi:
Možete li napisati kod koji PROLAŽAVA SVE sljedeće testove, ali krši sljedeće poslovno pravilo: [poslovno pravilo]. Ako je tako, koja rupa u tim testovima to dozvoljava? Dodajte test koji će zatvoriti tu rupu. Testovi: [zalijepi]
4) Provjera kvaliteta testa:
Provjerite kvalitetu ovog testnog paketa. Označite za svaki test:- Da li postoji istinita tvrdnja ili je to props?- Da li je očekivana vrijednost nezavisna, izvedena iz koda?- Da li potvrđuje poslovno pravilo ili nešto trivijalno? Konačno dajte procijenjenu "pravu tvrdnju" i 3 najslabija testa. Testovi: [zalijepi]
tri mini kofera
Slučaj 1 — Pokrivenost 92%, rezultat mutacije 38%. Jedan tim se oslanjao na visoku pokrivenost. Kada je testiranje mutacija provedeno sa Strykerom, rezultat je bio 38%: većina proizvedenih mutacija je preživjela. Ovo je bio dokaz da testovi nisu pokretali linije i provjeravali ponašanje. Tim je uložio tri sedmice u testiranje kvaliteta; Rezultat mutacije se povećao na 81%, a dvije stvarne greške u proračunu su uhvaćene ovim pojačanim testovima u sljedećem izdanju.
Slučaj 2 — AI je prevarila test. Sa šablonom "crveni tim", stručnjak je od AI tražio kod koji je prošao postojeće testove, ali je prekršio pravilo popusta. AI je napisao kod koji je uvijek vraćao popust od nula - i svi testovi su ostali zeleni jer nijedan test nije potvrdio stvarnu vrijednost popusta. Viđen jaz, dodane prave tvrdnje.
Slučaj 3 — Zamka za pohvale. Mlađi tester je upitao AI: "Jesu li moji testovi dobri?" i laknulo mu je kad je čuo odgovor: "Vrlo sveobuhvatno." Njegov stariji kolega je izvršio reviziju istih testova pomoću šablona "revizija kvaliteta testa"; Ispostavilo se da je 12 od 20 testova bilo dekor (bez assert-a ili smeća). Pravo pitanje je donelo pravi odgovor.
Uobičajene greške
- Pogrešio opseg za kvalitet. Oslanjajući se na visoku pokrivenost redova i uopće ne gledajući rezultat mutacije.
- Vjerovati u pohvale AI. Pitate "Jesu li vaši testovi dobri?" i smatrajući pozitivan odgovor kao garanciju.
- Izvođenje očekivane vrijednosti iz koda. Testovi za samoprovjeru koji potvrđuju neispravan kod.
- Budite zadovoljni trivijalnim tvrdnjama. Provjere koje ne potvrđuju stvarno pravilo, kao što je "nije null", "200 vraćeno".
- Ignoriranje preživjelih mutacija. Zanemarivanje onoga što nije uhvaćeno u izvještaju o mutaciji.
- Čak ni ne pokušavajući ručno mutirati kritični kod. Preskakanje koraka "razbijte kod i testirajte" ako alat nije dostupan.
Ukratko
Pseudopovjerenje je vjerovanje da je softver ispravan jer su testovi zeleni; dok testovi možda neće ništa potvrditi. Zlatni standard za mjerenje ovoga je testiranje mutacija: namjerno razbijanje koda i mjerenje da li ga testovi hvataju. Ocena mutacije je mnogo iskrenija mera kvaliteta nego procenat pokrivenosti. AI i proizvodi pseudopovjerenje i postaje moćan crveni tim u lovu na njega - zamolite "proizvesti grešku koja prolazi ove testove." Testirajte svoje testove: istinita tvrdnja, nezavisna očekivana vrijednost, validacija poslovnih pravila i ubijene mutacije.
Zadatak aplikacije
Uvezite funkciju koja sadrži poslovno pravilo i njegove testove iz vlastitog projekta. Ako je moguće, pokrenite alat za mutaciju (Stryker/Pitest/mutmut) i izmjerite rezultat mutacije; Ako nema alata, generirajte najmanje 8 mutacija sa šablonom "ručna kontrola mutacija" i isprobajte ih ručno. Za svaku preživjelu mutaciju napišite novi test sa šablonom "ubij preživjelu mutaciju". Konačno, sa šablonom „crveni tim“ provjerite može li AI proizvesti kod koji zavara vaše testove. Prijavite svoj početni i završni rezultat mutacije (ili stopu uhvaćene/ukupne mutacije).
kontrolna lista
- [ ] Procijenio sam kvalitet testa na osnovu rezultata mutacije, a ne pokrivenosti.
- [ ] Proveo sam testiranje mutacija (bilo alatom ili ručno) za kritični kod.
- [ ] Napisao sam nove testove za svaku preživjelu mutaciju.
- [ ] Koristio sam AI kao crveni tim i tražio rupe u zakonu u svojim testovima.
- [ ] Nisam uzeo pohvale AI-a "vaši testovi su dobri" kao uvjeravanje.
- [ ] Provjerio sam da svaki test potvrđuje stvarnu tvrdnju, nezavisnu očekivanu vrijednost i poslovno pravilo.