Što je testiranje mutacija? (Primjer)

⚡ Pametni sažetak

Testiranje mutacija namjerno uvodi male greške u izvorni kod, a zatim pokreće postojeći skup testova na svakoj neispravnoj verziji, mjereći jesu li ti testovi dovoljno jaki da otkriju promjenu.

  • 🔘 Definicija: Mutant je program koji nosi jednu namjernu sintaktičku promjenu, a njegovo ubijanje dokazuje da je test otkrio tu promjenu.
  • ☑️ Proces: Generiraj mutante, pokrenite paket u odnosu na original i mutant, usporedite rezultate, a zatim ojačajte testove koji su propustili greške.
  • Operatorovi: OperaZamjena, modifikacija izraza i modifikacija naredbi proizvode tri glavne porodice mutanata.
  • 🧪 Broj bodova: Rezultat mutacije je postotak ubijenih mutanata i mjeri snagu tvrdnje, a ne samo izvršenje linije.
  • 🛠️ alat: Stryker pokriva Javaskripta, TypeScript, C# i Scala, dok PIT mutira JVM bajtkod unutar Mavena i Gradle gradi.
  • ⚠️ Trošak: Svaki mutant ponovno pokreće cijeli paket, pa je testiranje mutacija sporo, skupo i nepraktično bez automatizacije.

Testiranje mutacija

Što je testiranje mutacija?

Testiranje mutacija je vrsta testiranja softvera u kojoj se određene izjave izvornog koda mijenjaju ili mutiraju kako bi se provjerilo mogu li testni slučajevi pronaći pogreške u izvornom kodu. Cilj testiranja mutacija je osigurati kvalitetu testnih slučajeva u smislu robusnosti, tako da ne uspiju u usporedbi s mutiranim izvornim kodom.

Promjena napravljena u mutantnom programu mora biti izuzetno mala kako ne bi utjecala na ukupni cilj programa. Testiranje mutacija naziva se i strategijom testiranja temeljenom na greškama, jer uključuje namjerno stvaranje greške u programu. To je oblik Bijela Box Ispitivanje koji se primjenjuje uglavnom tijekom Ispitivanje jedinice.

Testiranje mutacija predloženo je 1971. u studentskom radu Richarda Liptona, a formalizirano je u radu "Savjeti o odabiru testnih podataka" iz 1978. od strane DeMilla, Liptona i Saywarda. Izgubilo je zamah zbog tadašnjih troškova računalstva i od tada je ponovno steklo prednost za jezike kao što su Java, C#, Python, JavaSkripta i XML.

Kako izvršiti testiranje mutacija?

Slijede koraci za provođenje testiranja mutacija, također poznatog kao analiza mutacija:

Korak 1: Greške se uvode u izvorni kod programa stvaranjem mnogih verzija koje se nazivaju mutanti. Svaki mutant trebao bi sadržavati jednu grešku, a cilj je uzrokovati neuspjeh mutirane verzije, što pokazuje učinkovitost testnih slučajeva.

Korak 2: Testni slučajevi primjenjuju se na originalni program, a također i na mutirani program. Testni slučaj trebao bi biti prikladan i prilagođen je za otkrivanje grešaka u programu.

Korak 3: Usporedite rezultate originalnog i mutantnog programa.

Korak 4: Ako izvorni program i mutirani program generiraju različite rezultate, tada testni slučaj uništava mutanta. Stoga je testni slučaj dovoljno dobar da otkrije razliku između izvornog i mutiranog programa.

Korak 5: Ako izvorni program i mutirani program generiraju isti izlaz, mutant se održava na životu. U takvim slučajevima potrebno je stvoriti učinkovitije testne slučajeve koji uništavaju sve mutante.

Dijagram ispod tracistih pet koraka, od izvornog programa preko generacije mutanata do presude o ubojstvu ili preživljavanju.

Tijek rada za testiranje mutacija koji prikazuje izvorni program, generirane mutante, izvršavanje testa i presudu o ubijenim ili živim mutantima

Kako stvoriti programe mutante?

Mutacija nije ništa drugo nego jedna sintaktička promjena koja se vrši u programskoj naredbi. Svaki mutirani program trebao bi se razlikovati od izvornog programa za točno jednu mutaciju.

Izvorni program Program Mutant
Ako (x>y)
Ispis "Zdravo"
Drugo
Ispis "Bok"
Ako (x
Ispis "Zdravo"
Drugo
Ispis "Bok"

U gornjem paru se promijenio samo operator usporedbe, no testni slučaj gdje je x veći od y sada ispisuje „Bok“ umjesto „Pozdrav“. Ilustracija prikazuje tu jednu sintaktičku izmjenu.

Jedna sintaktička promjena primijenjena na programsku naredbu za stvaranje jednog mutanta

Što promijeniti u programu Mutant?

Postoji nekoliko tehnika koje se mogu koristiti za generiranje mutantnih programa. Tri obitelji u nastavku pokrivaju većinu operatora mutacije s kojima se alati isporučuju.

Operand zamjenski operatori Operatori modifikacije izraza Operatori modifikacije naredbi
Zamijenite operand drugim operandom (x s y ili y s x) ili konstantnom vrijednošću. Zamijenite operator ili umetnite novi operator u programskoj naredbi. Programske izjave su modificirane za stvaranje mutantnih programa.
Primjer:
If(x>y) zamijeni x i y vrijednosti
If(5>y) zamijeni x konstantom 5
Primjer:
Ako(x==y)
Možemo zamijeniti == s >= i imati mutirani program kao
If(x>=y) i umetanje ++ u iskaz
Ako(x==++y)
Primjer:
Izbrišite else dio u if-else izjavi
Izbrišite cijelu if-else naredbu kako biste provjerili kako se program ponaša

Neki primjeri operatora mutacije:

  • Zamjena GOTO oznake
  • Zamjena izjave o povratu
  • Brisanje izjave
  • Umetanje unarnih operatora (kao što su – i ++)
  • Logička zamjena konektora
  • Zamjena imena usporedivog polja
  • Uklanjanje dijela else iz if-else naredbe
  • Dodavanje ili zamjena operatora
  • Zamjena izvoda promjenom podataka
  • Modifikacija podataka za varijable
  • Promjena tipova podataka u programu

OperaTore koje dodiruju granični uvjet najčešće preživljavaju, pa rezultati mutacija često upućuju na praznine u analiza graničnih vrijednosti.

Vrste testiranja mutacija

In Programsko inženjerstvoTestiranje mutacija se u osnovi kategorizira u tri vrste - mutacija izjava, mutacija vrijednosti i mutacija odluke.

  • Mutacija izjave – naredba se izrezuje, lijepi ili briše, pa ishod može biti uklanjanje nekih redaka koda.
  • Mutacija vrijednosti – vrijednosti primarnih parametara i konstanti se mijenjaju, na primjer promjenom granice petlje ili praga.
  • Mutacija odluke – kontrolne naredbe se mijenjaju, na primjer flipping relacijski operator ili negiranje uvjeta.

Alati grupiraju svoje operatore pod ova tri naslova, tako da porodica koja je proizvela preživjeli mutant govori testeru koja vrsta tvrdnje nedostaje. Preživjeli mutant odluke obično označava netestiranu granu koja se preklapa s testiranje petlje.

Automatizacija testiranja mutacija

Testiranje mutacija izuzetno je dugotrajno i komplicirano za ručno izvršavanje, stoga je preporučljivo koristiti alate za automatizaciju, koji također smanjuju troškove. Alat za mutacije sastavlja mutante, zakazuje testiranja, bilježi koji je mutant koji je neuspjeli test uništio i izvještava o rezultatu.

Popis dostupnih alata:

  • Stryker — okvir za testiranje mutacija otvorenog koda s izdanjima za JavaSkripta i TypeScript (StrykerJS), C# i .NET (Stryker.NET) i Scala (Stryker4s).
  • PIT, također poznat kao PITest — sustav za testiranje mutacija za Java i JVM koji mutira kompilirani bajtkod i uključuje se u Maven i Gradle gradi uz JUnit.

Oba se izvode kao korak izgradnje, tako da pripadaju istom kontinuirana integracija cjevovod kao i ostatak ispitivanje automatizacije o.

Rezultat mutacije

Rezultat mutacije definiran je kao postotak ubijenih mutanata od ukupnog broja mutanata.

Rezultat mutacije = (Ubijeni mutanti / Ukupan broj mutanata) * 100

Formula je prikazana dolje u obliku u kojem je većina alata prikazuje.

Formula za izračun mutacijskog rezultata: broj ubijenih mutanata dijeli se s ukupnim brojem mutanata i zatim se broji sto.

Testni slučajevi se opisuju kao adekvatni mutaciji kada rezultat dosegne 100 posto. U praksi nazivnik mora isključiti ekvivalentni mutanti — mutanti čija se promijenjena sintaksa ponaša točno kao original, tako da ih nijedan test ne može ubiti. Alati stoga prijavljuju ubijene mutante podijeljene s ubijenim plus preživjelim neekvivalentnim mutantima i omogućuju testeru da označi ekvivalente.

Eksperimentalni rezultati pokazali su da je testiranje mutacija učinkovit način mjerenja adekvatnosti testnih slučajeva. Glavni nedostatak je trošak generiranja mutanata i izvršavanja svakog testnog slučaja na svakom od njih.

Testiranje mutacija vs. Code Pokrivenost

visok pokrivenost testom ne dokazuje jake testove. Pokrivenost linija i grana bilježi koje su se naredbe izvršavale, a ne je li išta naknadno provjereno, pa se test koji poziva metodu i ne tvrdi ništa i dalje računa kao pokriven. Testiranje mutacija zatvara tu prazninu, jer mutant umire samo kada tvrdnja zapravo ne uspije.

Aspekt Code pokrivenost Rezultat mutacije
Što mjeri Koje su linije ili grane testovi izvršeni Koje su ubrizgane greške otkrili testovi
Osjetljiv na tvrdnje Ne — test s nula tvrdnji i dalje dodaje pokrivenost Da - mutant preživljava kada nijedna tvrdnja ne propadne
Cijena trčanja Jedan instrumentalni test Jedan testni pokus po preživjelom mutantu, do sada sporije
Tipična upotreba Brzi pristup svakom commitu Dublja periodična provjera kritičnih modula
Način kvara 100-postotna pokrivenost bez stvarne provjere Ekvivalentni mutanti koji se nikada ne mogu ubiti

Dva pokazatelja su komplementarna. Pokrivenost označava kod koji nikada nije dosegnut; rezultat mutacije označava dosegnuti kod koji nikada nije provjeren. Oba daju iste podatke. proces upravljanja nedostacima, uz mjere kao što su gustoća defekta.

Prednosti testiranja mutacija

Sljedeće su prednosti testiranja mutacija:

  • To je moćan pristup za postizanje visoke pokrivenosti izvornog programa.
  • Testira sam testni paket, što nijedan drugi tehnika testiranja softvera radi izravno.
  • Testiranje mutacija donosi dobru razinu otkrivanja pogrešaka razvijatelju softvera.
  • Metoda otkriva dvosmislenosti u izvornom kodu i ima sposobnost otkriti greške do kojih obični radovi nikada ne dosežu.
  • Preživjeli mutanti su akcijski nastrojeni: svaki od njih imenuje određeni redak i određenu promjenu koju apartman nije primijetio.
  • Kupci imaju koristi od ovog testiranja jer dobivaju pouzdaniji i stabilniji sustav.

Nedostaci testiranja mutacija

S druge strane, nedostaci testiranja mutacija su sljedeći:

  • Testiranje mutacija je izuzetno skupo i dugotrajno, jer je potrebno generirati i kompajlirati veliki broj mutantnih programa.
  • Budući da oduzima puno vremena, pošteno je reći da se ovo testiranje ne može obaviti bez alata za automatizaciju.
  • Svaki mutant se testira istim brojem testnih slučajeva kao i originalni program, tako da se velika populacija mutanata mora pokrenuti na cijelom testnom skupu.
  • Ekvivalentne mutante nijedan test ne može ubiti, a njihovo odvajanje od pravih preživjelih obično zahtijeva ručni pregled.
  • Budući da metoda mijenja izvorni kod, nije primjenjiva na Crna Box Ispitivanje.

Kada koristiti testiranje mutacija

Gore navedeni profil troškova znači da se testiranje mutacija rijetko provodi na cijeloj kodnoj bazi pri svakom commitu. Isplati se tamo gdje je neotkrivena greška skupa, a kod koji se testira dovoljno je malen da se brzo mutira.

  • Sigurnosno kritična ili financijska logika — izračun plaćanja, porezna pravila i provjere autorizacije, gdje je tihi pogrešan odgovor gori od sudara.
  • Apartmani sa sumnjivo visokom pokrivenošću — kada je pokrivenost blizu 100 posto, ali nedostaci i dalje izostaju.
  • Refaktoriranje naslijeđenog koda — rezultati mutacija otkrivaju hoće li postojeći testovi otkriti regresiju.
  • Biblioteke i dijeljene komponente — greška u ponovno korištenom sastavni dio množi se sa svakim pozivateljem.
  • Timovi koji vježbaju razvoj vođen testovima — rezultat provjerava da testovi napisani prvi stvarno funkcioniraju.

Obično se ne isplati pokretati na prototipovima za jednokratnu upotrebu, na tankom ljepilu ili generiranom kodu bez logike grananja, ili na paketima u kojima dominiraju spori... testovi integracije za koje već trebaju sati za jedan prolaz.

Većina timova stoga obuhvati izvođenje na promijenjene datoteke, postavi prag za module koji su važni i dopusti širem regresijsko testiranje apartman nosi ostatak životni ciklus testiranja softvera.

Pitanja i odgovori

Ekvivalentna mutacija je promjena koja mijenja sintaksu, ali ne i ponašanje, poput zamjene granice petlje koja se nikada ne dostiže. Nijedan test je ne može ubiti, stoga se mora označiti i isključiti prije nego što se rezultat smatra pouzdanim.

Ne postoji univerzalni broj. Timovi obično postavljaju visoki prag za kritične module poput logike plaćanja ili sigurnosti, a niži za ostale. Potraga za postotkom manje je korisna od pregledavanja svakog preživjelog mutanta u visokorizičnom kodu.

To su dvije pretpostavke na kojima se tehnika temelji. Prva kaže da programeri pišu gotovo točan kod, pa su stvarne greške male. Druga kaže da testovi koji hvataju male greške također hvataju složene greške izgrađene od njih.

Ograničite mutaciju na datoteke promijenjene u trenutnoj grani, ponovno upotrijebite podatke o pokrivenosti tako da se izvršavaju samo testovi koji se dotiču mutanta, paralelno pokrećite mutante i ne uspijevajte u izgradnji zbog pada rezultata, a ne zbog apsolutne brojke.

Modeli strojnog učenja predviđaju koji će mutanti vjerojatno preživjeti kako bi se izvedba mogla skratiti, klasificirati vjerojatne ekvivalentne mutante za pregled i generirati mutante koji nalikuju greškama viđenim u povijesti projekta, a ne uniformnim zamjenama operatora.

Da, za mehanički dio. S obzirom na preživjelog mutanta i metodu koja se testira, Copilot izrađuje nedostajuću tvrdnju ili test rubnog slučaja. Recenzent i dalje mora potvrditi da je očekivana vrijednost točna i da nije jednostavno kopirana iz trenutnog ponašanja.

Provjerava rezultat. Razvoj vođen testiranjem proizvodi testove prije koda, ali ništa ne jamči da ti testovi daju dovoljno dokaza. Periodična mutacija koja se izvodi na istim modulima pokazuje je li crveno-zeleni ciklus proizveo testove koji doista ne uspijevaju na pogrešnom odgovoru.

Ne. Ubrizgavanje greške oštećuje okruženje za izvođenje i testiranje nejasnoća daje neispravan ulaz, oboje prosuđujući aplikaciju. Testiranje mutacija mijenja izvorni kod i prosuđuje skup testova, tako da je objekt koji se procjenjuje drugačiji.

Sažmite ovu objavu uz: