Jedinica 10 / 11

Rizik od lažnog povjerenja, kvaliteta testa i testiranje mutacija: Testovi testiranja

Dobici:

  • Sposobnost prepoznavanja triju lica pseudopovjerenja (neasertivno, samopotvrđujuće, trivijalno potvrđivanje) i primjene protuotrova
  • Sposobnost korištenja testiranja mutacije i ocjene mutacije kao točnije mjere kvalitete od postotka pokrivenosti alatom ili rukom
  • Sposobnost postavljanja umjetne inteligencije kao crvenog tima protiv testiranja i traženja rupa u zakonu bez upadanja u zamku hvale

U središtu ovog modula nalazi se stalno upozorenje: testna ploča koja svijetli zeleno nije dokaz kvalitete. Ako vam testovi daju povjerenje, morate znati je li to povjerenje stvarno ili lažno. U doba umjetne inteligencije (AI), ovo je pitanje kritičnije nego ikad, jer je AI vješta u izradi tekućih, glatkih, ali šupljih testova. Lažno povjerenje — vjerovati da je softver ispravan jer su testovi zeleni, dok zapravo testovi ne potvrđuju ništa — najopasnija je stvar koja se može dogoditi QA timu; jer skriva ne 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 kvalitete testiranja: testiranje mutacija

Najmoćniji način da shvatite štiti li test stvarno ili ne je testiranje mutacije (testiranje mutacije - tehnika koja proizvodi namjerna mala iskrivljenja/mutacije u izvornom kodu i mjeri otkrivaju li testovi ta iskrivljenja). Logika je jednostavna: ako namjerno razbijete kod (pretvorite + u -, > u >=, istinito u lažno), dobar paket testova trebao bi uhvatiti tu pogrešku i postati crven. Ako se ne dogodi, taj poremećaj je preživjeli mutant — tako da vaši testovi zapravo ne čuvaju to ponašanje.

Rezultat mutacije = mutacija ubijena / ukupna mutacija. Paket s 90% pokrivenosti linije može imati rezultat mutacije od 40%; To znači da linije rade, ali ponašanje nije provjereno. Rezultat mutacije mnogo je iskrenija mjera kvalitete od postotka 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 "razbijanja kodnog testa" neprocjenjiva za kritične funkcije.

Tri lica pseudo-povjerenja i njegov protuotrov

Obrazac pseudopovjerenja

simptom

protuotrov

Test bez tvrdnje

Kod radi, ništa nije potvrđeno

Točna tvrdnja u svakom testu; test s mutacijom

samopotvrđujući test

Očekivano = izlaz koda

Neovisno izračunajte očekivanu vrijednost

Trivijalna tvrdnja

"nije nula", "200 vraćeno"

Potvrdite poslovno pravilo/stvarni rezultat

Zabluda visokog opsega

90% linija, niska zaštita

Pogledajte rezultat mutacije

Tolerancija na lomljivo ispitivanje

"Opet zapeo, prošao"

Glavni uzrok + determinističko testiranje

Korištenje umjetne inteligencije kao "crvenog tima"

AI može stvoriti pseudopovjerenje i biti moćan saveznik u njegovom lovu. Koristite AI kao crveni tim protiv vlastitih testova: tražite "napišite kod koji prolazi ove testove, ali je pogrešan" ili "pronađite subverziju koja će prevariti ove testove." Ako umjetna inteligencija pronađe rupe u vašim testovima, te su rupe stvarni rizici.

Oprez: Nemojte pitati AI "Je li kvaliteta mog testa dobra?" i uzmite odgovor "da, odlično" kao jamstvo. AI nastoji biti ljubazan. Umjesto toga, izazovite AI na konkretan zadatak: "proizvesti bug koji prolazi ove testove." Ako je može proizvesti, vaši testovi su slijepi za tu pogrešku.

Ekvivalentne mutacije i granice rezultata

Testiranje mutacija je moćno, ali ima jednu kvaku: neke mutacije uopće ne mijenjaju ponašanje koda. To se nazivaju ekvivalentne mutacije (ekvivalentni mutant — oštećeni kod, mutacija koja proizvodi potpuno isti rezultat kao i original). Na primjer, promjena početne vrijednosti varijable koja se nikada ne koristi ne utječe na izlaz; Nijedan test to ne može i ne smije otkriti. Stoga je rezultat od 100% mutacija često nedostižan u praksi i nije cilj. Ručno uklanjanje ekvivalentnih mutacija je radno intenzivno; Dakle, ne čitajte ocjenu mutacije kao apsolutnu ocjenu ispita, već kao iskren pokazatelj "štite li moji testovi stvarno?"

Praktični pristup je sljedeći: umjesto stalnog testiranja mutacije 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 stvarni jaz, dodajte test; ako se radi o ekvivalentnoj mutaciji, označite je opravdanjem i položite. AI može izvesti inicijalni probir u procjeni je li preživjela mutacija ekvivalentna; ali konačnu odluku donosite vi koji znate što kod radi.

Oprez: Testiranje mutacija računalno je skupo (svi relevantni testovi ponovno se izvode za svaku mutaciju). Stoga je uobičajena i razumna strategija zakazati to kao tjednu ili dubinsku provjeru kritičnih modula prije izdanja, umjesto svakog spajanja.

Slab upit / Jak upit

Slab: "Jesu li moji testovi dovoljni?"
Jako: "Ponašajte se kao crveni tim za ovu funkciju i skup testova. (1) Generirajte 8 mutacija u kodu koje se mogu uništiti (zamjena operatora, pomak granice, inverzija uvjeta, zamjena povratne vrijednosti). (2) Za svaku mutaciju navedite koji će je od postojećih testova uhvatiti, a koji NE. (3) Za svaku mutaciju koja preživi napišite novi test koji će je uništiti. (4) Također pokažite možete li proizvesti kod primjer koji prolazi sve ove testove, ali krši poslovno pravilo Code+tests: [zalijepi]"

Snažan brz; Pozicionira AI kao ispitivača koji probija testove, a ne kao stroj za pohvale.

Četiri predloška za kopiranje

1) Ručna kontrola mutacija:

Generirajte 8 značajnih mutacija (manjih namjernih poremećaja) za ovaj kod: zamjena aritmetičkog operatora, granica usporedbe (> vs >=), logička inverzija, povratna/konstantna zamjena, preskakanje uvjeta. Za svaku mutaciju predvidite koji će je od dostupnih testova uhvatiti ili ne. Kod+testovi: [zalijepi]

2) Ubijanje preživjele mutacije:

Sljedeće izvješće o ispitivanju mutacija sadrži preživjele (neuhvaćene) mutacije: [popis/izvješće]. Za svaki napišite minimalni test koji će uništiti tu mutaciju (kod će postati crven kada se tako razbije). Komentirajte kakvo ponašanje test potvrđuje.

3) Crveni tim — test krvi:

Možete li napisati kod koji PROLAZI SVE sljedeće testove, ali krši sljedeće poslovno pravilo: [poslovno pravilo]. Ako je tako, koja rupa u zakonu u ovim testovima to dopušta? Dodajte test koji će zatvoriti tu prazninu. Testovi: [zalijepi]

4) Inspekcija kvalitete testa:

Provjerite kvalitetu ovog paketa testova. Označite kvačicu za svaki test: - Postoji li istinita tvrdnja ili je to potpora? - Je li očekivana vrijednost neovisna, izvedena iz koda? - Potvrđuje li poslovno pravilo ili nešto trivijalno? Na kraju dajte procijenjenu "pravu tvrdnju" i 3 najslabija testa. Testovi: [zalijepi]

tri mini kućišta

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. To je bio dokaz da testovi nisu pokretali linije i provjeravali ponašanje. Tim je uložio tri tjedna u testiranje kvalitete; Rezultat mutacije porastao je na 81%, a dvije stvarne pogreške u izračunu uhvaćene su ovim pojačanim testovima u sljedećem izdanju.

Slučaj 2 — AI je prevarila test. Uz predložak "crvenog tima", stručnjak je od umjetne inteligencije zatraž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 nule - i svi testovi su ostali zeleni jer nijedan test nije potvrdio stvarnu vrijednost popusta. Viđena praznina, dodane prave tvrdnje.

Slučaj 3 — Zamka pohvale. Mladi tester upitao je AI: "Jesu li moji testovi dobri?" i laknulo mu je kad je čuo odgovor: "Vrlo iscrpno." Njegov stariji kolega dao je iste testove revidirati pomoću predloška "revizija kvalitete testa"; Ispostavilo se da je 12 od 20 testova bilo dekor (bez tvrdnje ili smeća). Pravo pitanje donijelo je pravi odgovor.

Uobičajene greške

  • Zamjena opsega za kvalitetu. Oslanjajući se na veliku pokrivenost redaka i uopće ne gledajući rezultat mutacije.
  • Vjerujući pohvalama umjetne inteligencije. Pitanje "Jesu li vaši testovi dobri?" a pozitivan odgovor smatrati jamstvom.
  • Izvođenje očekivane vrijednosti iz koda. Samopotvrđujući testovi koji potvrđuju pogrešan kod.
  • Budite zadovoljni trivijalnim tvrdnjama. Provjere koje ne potvrđuju stvarno pravilo, kao što su "nije nula", "200 vraćeno".
  • Ignoriranje preživjelih mutacija. Ignoriranje onoga što nije uhvaćeno u izvješću o mutaciji.
  • Čak ni ne pokušava ručno mutirati kritični kod. Preskakanje koraka "provali kod i testiraj" ako alat nije dostupan.

Ukratko

Pseudo-povjerenje je vjerovanje da je softver ispravan jer su testovi zeleni; dok testovi možda neće ništa potvrditi. Zlatni standard za ovo mjerenje je testiranje mutacija: namjerno razbijanje koda i mjerenje hvataju li ga testovi. Rezultat mutacije mnogo je iskrenija mjera kvalitete od postotka pokrivenosti. AI proizvodi pseudo-povjerenje i postaje moćan crveni tim u lovu na njega - tražite "proizvesti bug koji prolazi ove testove." Testirajte svoje testove: istinita tvrdnja, nezavisna očekivana vrijednost, provjera valjanosti 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 s predloškom "ručna kontrola mutacija" i pokušajte ih ručno. Za svaku preživjelu mutaciju napišite novi test s predloškom "ubij preživjelu mutaciju". Konačno, s uzorkom "crvenog tima", pogledajte može li umjetna inteligencija proizvesti kod koji će prevariti vaše testove. Prijavite svoj početni i završni rezultat mutacije (ili stopu uhvaćenih/ukupnih mutacija).

popis za provjeru

  • [ ] Ocijenio sam kvalitetu testa prema rezultatu mutacije, a ne pokrivenosti.
  • [ ] Pokrenuo 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 svojim testovima.
  • [ ] Nisam shvatio AI-jevu pohvalu "vaši testovi su dobri" kao uvjeravanje.
  • [ ] Provjerio sam provjerava li svaki test stvarnu tvrdnju, neovisnu očekivanu vrijednost i poslovno pravilo.