Š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.
Š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.
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.
Š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.
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.



