Mi az a mutációs tesztelés? (Példa)

⚡ Okos összefoglaló

A mutációtesztelés szándékosan visz be apró hibákat a forráskódba, majd lefuttatja a meglévő tesztkészletet minden hibás verzión, azt mérve, hogy ezek a tesztek elég erősek-e a változás észleléséhez.

  • 🔘 Meghatározás: A mutáns az a program, amely egyetlen szándékos szintaktikai változtatást hordoz, és leállítása bizonyítja, hogy a teszt kimutatta a változtatást.
  • ☑️ Folyamat: Mutánsokat generálsz, lefuttatod a tesztcsomagot az eredeti és a mutáns ellen, összehasonlítod a kimeneteket, majd megerősíted azokat a teszteket, amelyek hibákat nem észleltek.
  • Operators: OperaAz nd helyettesítés, a expresszió módosítása és az utasításmódosítás hozza létre a mutánsok három fő családját.
  • 🧪 Pontszám: A mutációs pontszám az elpusztított mutánsok százalékos aránya, és az állítás erősségét méri, nem pedig a puszta sorvégrehajtást.
  • 🇧🇷 szerszámozás: Stryker huzatok JavaForgatókönyv, TypeScript, C# és Scala nyelveken, míg a PIT a JVM bájtkódját mutálja a Maven-en belül, és Gradle épít.
  • ⚠️ Költség: Minden mutáns újrafuttatja a teljes csomagot, így a mutációtesztelés lassú, drága és automatizálás nélkül nem praktikus.

Mutációs tesztelés

Mi az a mutációs tesztelés?

Mutációs tesztelés A mutációs tesztelés egy olyan szoftvertesztelési típus, amelynek során a forráskód bizonyos utasításait megváltoztatják, vagy mutálják, hogy ellenőrizzék, a tesztesetek képesek-e hibákat találni a forráskódban. A mutációs tesztelés célja a tesztesetek minőségének biztosítása a robusztusság szempontjából, hogy azok a mutált forráskóddal szemben is megbukjanak.

Egy mutáns programban végrehajtott változtatásnak rendkívül kicsinek kell lennie, hogy ne befolyásolja a program általános célját. A mutációtesztelést hibaalapú tesztelési stratégiának is nevezik, mivel szándékosan hoz létre hibát a programban. Ez a tesztelés egy formája fehér Box Tesztelés amelyet főként akkor alkalmaznak, amikor Egység tesztelése.

A mutációtesztelést Richard Lipton javasolta 1971-ben egy diákdolgozatában, és DeMillo, Lipton és Sayward 1978-as „Tippek a tesztadatok kiválasztásához” című cikkében formalizálták. A korabeli számítási költségek miatt lendületet vesztett, és azóta olyan nyelvek számára tért vissza, mint a Java, C#, Python, JavaSzkript és XML.

Hogyan kell végrehajtani a mutációtesztet?

A mutációtesztelés, más néven mutációanalízis végrehajtásának lépései a következők:

Lépés 1: A hibákat a program forráskódjába úgy építik be, hogy számos verziót, úgynevezett mutánsokat hoznak létre. Minden mutánsnak egyetlen hibát kell tartalmaznia, és a cél az, hogy a mutáns verzió hibát okozzon, ami a tesztesetek hatékonyságát demonstrálja.

Lépés 2: A teszteseteket az eredeti programra és a mutáns programra is alkalmazzuk. Teszt eset megfelelőnek kell lennie, és úgy van beállítva, hogy észlelje a program hibáit.

Lépés 3: Hasonlítsd össze az eredeti és a mutáns program eredményeit.

Lépés 4: Ha az eredeti program és a mutáns program eltérő kimenetet generál, akkor a teszteset megöli a mutánst. Így a teszteset elég jó ahhoz, hogy detektálja az eredeti és a mutáns program közötti változást.

Lépés 5: Ha az eredeti program és a mutáns program ugyanazt a kimenetet generálja, a mutáns életben marad. Ilyen esetekben hatékonyabb teszteseteket kell létrehozni, amelyek elpusztítják az összes mutánst.

Az alábbi ábra tracugyanazt az öt lépést követi, az eredeti programtól a mutánsok generálásán át a megölt vagy túlélő ítéletig.

Mutációtesztelési munkafolyamat, amely bemutatja az eredeti programot, a létrehozott mutánsokat, a teszt végrehajtását és az élő vagy elpusztított mutánsok megítélését

Hogyan készítsünk mutáns programokat?

A mutáció nem más, mint egyetlen szintaktikai változtatás, amelyet egy programutasításon hajtanak végre. Minden mutáns programnak pontosan egy mutációval kell eltérnie az eredeti programtól.

Eredeti Program Mutáns Program
Ha (x>y)
Nyomtassa ki a „Hello”
Más
Nyomtassa ki a "Szia"
Ha (x
Nyomtassa ki a „Hello”
Más
Nyomtassa ki a "Szia"

A fenti párban csak az összehasonlító operátor változott, viszont egy teszteset, ahol x nagyobb, mint y, most „Hi”-t ír ki a „Hello” helyett. Az ábra ezt az egy szintaktikai módosítást mutatja.

Egyetlen szintaktikai változtatást alkalmaztunk egy programutasításon, ami egyetlen mutánst hoz létre.

Mit kell megváltoztatni a Mutant Programban?

Több technika is létezik mutáns programok létrehozására. Az alábbi három család lefedi a legtöbb olyan mutációs operátort, amelyekkel az eszközök együtt szállítódnak.

Operaés helyettesítő operátorok Kifejezésmódosító operátorok Utasításmódosító operátorok
Cserélje le az operandust egy másik operandusra (x-et y-nal, vagy y-t x-szel) vagy egy konstans értékre. Operátor cseréje vagy új operátor beszúrása egy programutasításba. A programozott utasításokat úgy módosítják, hogy mutáns programokat hozzanak létre.
Példa:
Ha(x>y) cserélje ki az x és y értékeket
Ha(5>y) cserélje ki x-et 5 konstansra
Példa:
Ha(x==y)
A == helyére >= kerülhet, így a mutáns program a következő lesz:
If(x>=y) és ++ beillesztése az utasításba
Ha(x==++y)
Példa:
Törölje az else részt az if-else utasításban
Töröld a teljes if-else utasítást a program viselkedésének ellenőrzéséhez

Néhány példa a mutációs operátorokra:

  • GOTO címkecsere
  • A visszáru nyilatkozat cseréje
  • Nyilatkozat törlése
  • Egyoperátoros operátorok beszúrása (például – és ++)
  • Logikai csatlakozó csere
  • Összehasonlítható tömbnévcsere
  • Az „else” rész eltávolítása egy „if-else” utasításból
  • Operátorok hozzáadása vagy cseréje
  • Nyilatkozat pótlása az adatok megváltoztatásával
  • Változók adatmódosítása
  • Adattípusok módosítása a programban

Operaazok a mutációk maradnak fenn leggyakrabban, amelyek egy határfeltételt érintenek, így a mutációs eredmények gyakran a határérték-elemzés.

A mutációvizsgálat típusai

In SzoftverfejlesztésA mutációtesztelést alapvetően három típusra osztják: állításmutáció, értékmutáció és döntésmutáció.

  • Állítás mutáció – egy utasítást kivágnak, beillesztenek vagy törölnek, így az eredmény egyes kódsorok eltávolítása lehet.
  • Értékmutáció – az elsődleges paraméterek és konstansok értékei módosulnak, például egy hurokkorlát vagy egy küszöbérték megváltoztatásával.
  • Döntési mutáció – a vezérlő utasítások megváltoznak, például a flipping egy relációs operátor vagy egy feltétel negálása.

Az eszközök e három címszó alá csoportosítják az operátoraikat, így a túlélő mutánst létrehozó család megmondja a tesztelőnek, hogy milyen típusú állítás hiányzik. Egy túlélő döntési mutáns általában egy nem tesztelt ágat jelöl, amely átfedésben van a következővel: hurok tesztelés.

A mutációteszt automatizálása

A mutációtesztelés rendkívül időigényes és bonyolult manuálisan végrehajtani, ezért célszerű automatizáló eszközöket használni, amelyek a költségeket is csökkentik. A mutációtesztelési eszköz összeállítja a mutánsokat, ütemezi a futtatásokat, rögzíti, hogy az egyes sikertelen tesztek során melyik mutáns pusztult el, és jelenti az eredményt.

A rendelkezésre álló eszközök listája:

  • Stryker — egy nyílt forráskódú mutációtesztelési keretrendszer, amelyhez különböző kiadások tartoznak JavaScript és TypeScript (StrykerJS), C# és .NET (Stryker.NET), valamint Scala (Stryker4s).
  • PIT, más néven PITest — egy mutációtesztelő rendszer Java és a JVM, amely mutálja a lefordított bájtkódot, és csatlakozik a Mavenhez, és Gradle mellett építkezik JUnit.

Mindkettő egy építési lépésként fut, tehát ugyanabba a csoportba tartoznak. folyamatos integráció a csővezeték többi részeként automatizálási tesztelés tovább.

Mutációs pontszám

A mutációs pontszámot az elpusztult mutánsok százalékos arányaként definiáljuk az összes mutáns számához képest.

Mutációs pontszám = (elölt mutánsok / összes mutáns száma) * 100

A képlet az alábbiakban látható abban a formában, ahogyan a legtöbb eszköz kiírja.

Mutációs pontszám képlete, az elpusztított mutánsok számát elosztva a mutánsok teljes számával, majd megszorozva százzal

A teszteseteket akkor tekintjük megfelelő mutációnak, ha az eredmény eléri a 100 százalékot. A gyakorlatban a nevezőnek ki kell zárnia a következőket: ekvivalens mutánsok — mutánsok, amelyek megváltozott szintaxisa pontosan úgy viselkedik, mint az eredeti, így egyetlen teszt sem tudja őket elpusztítani. Az eszközök ezért az elpusztított mutánsok számát osztva a elpusztított és a túlélő, nem ekvivalens mutánsok számával jelentik, és hagyják, hogy a tesztelő megjelölje az ekvivalenseket.

Kísérleti eredmények kimutatták, hogy a mutációtesztelés hatékony módszer a tesztesetek megfelelőségének mérésére. A fő hátránya a mutánsok generálásának és az egyes tesztesetek mindegyiken történő futtatásának költsége.

Mutációs tesztelés vs. Code Lefedettség

Magas teszt lefedettség nem bizonyítja az erős teszteket. A vonal- és elágazás-lefedettség azt rögzíti, hogy mely utasítások futottak le, nem pedig azt, hogy utólag ellenőriztek-e valamit, így egy olyan teszt, amely meghív egy metódust, de nem állít semmit, továbbra is lefedettnek számít. A mutációtesztelés ezt a hiányosságot pótolja, mivel egy mutáns csak akkor hal meg, ha egy állítás ténylegesen meghiúsul.

Aspect Code lefedettség Mutációs pontszám
Mit mér Mely vonalakon vagy ágakon futottak a tesztek Milyen befecskendezett hibákat észleltek a tesztek
Érzékeny az állításokra Nem – egy teszt, amelyben nulla állítás van, továbbra is növeli a lefedettséget Igen – egy mutáns túléli, ha egyetlen állítás sem vall kudarcot
Egy futás költsége Egy műszeres tesztüzem Egy tesztfuttatás túlélő mutánsonként, eddig lassabb
Tipikus felhasználás Gyors átjáró minden commit után A kritikus modulok alaposabb, időszakos ellenőrzése
Meghibásodás 100 százalékos lefedettség valódi ellenőrzés nélkül Egyenértékű mutánsok, amelyeket soha nem lehet megölni

A két metrika kiegészíti egymást. A lefedettség a soha el nem ért kódot nevezi meg; a mutációs pontszám pedig a soha el nem ért, de ellenőrizetlen kódot. Mindkettő ugyanazt a hibakezelési folyamatolyan intézkedések mellett, mint a hibasűrűség.

A mutációteszt előnyei

A mutációtesztelés előnyei a következők:

  • Ez egy hatékony megközelítés a forrásprogram magas lefedettségének eléréséhez.
  • Magát a tesztkészletet teszteli, amit más nem szoftvertesztelési technika közvetlenül csinálja.
  • A mutációtesztelés jó szintű hibaészlelést biztosít a szoftverfejlesztők számára.
  • A módszer feltárja a forráskód kétértelműségeit, és képes olyan hibákat is feltárni, amelyeket a szokásos futtatások soha nem érnek el.
  • A túlélő mutánsok ellen lehet cselekedni: mindegyik megnevez egy adott sort és egy adott változást, amelyet a kíséret nem vett észre.
  • Az ügyfelek egy megbízhatóbb és stabilabb rendszert kapnak ebből a tesztelésből.

A mutációteszt hátrányai

Másrészt a mutációtesztelés hátrányai a következők:

  • A mutációtesztelés rendkívül költséges és időigényes, mivel nagyszámú mutáns programot kell generálni és lefordítani.
  • Mivel időigényes, elmondható, hogy ez a tesztelés automatizálási eszköz nélkül nem végezhető el.
  • Minden mutánst ugyanannyi tesztesettel tesztelnek, mint az eredeti programot, tehát egy nagyméretű mutáns populációt kell futtatni a teljes tesztkészleten.
  • Az ekvivalens mutánsokat semmilyen teszttel nem lehet elpusztítani, és a valódi túlélőktől való elkülönítésük általában manuális ellenőrzést igényel.
  • Mivel a metódus megváltoztatja a forráskódot, nem alkalmazható a következőkre: Fekete Box Tesztelés.

Mikor használjunk mutációtesztelést?

A fenti költségprofil azt jelenti, hogy a mutációtesztelést ritkán futtatják le egy teljes kódbázison minden egyes véglegesítéskor. Megtérül, ha egy nem észlelt hiba költséges, és a tesztelt kód elég kicsi ahhoz, hogy gyorsan mutálódjon.

  • Biztonságkritikus vagy pénzügyi logika — fizetésszámítás, adózási szabályok és engedélyezési ellenőrzések, ahol egy néma rossz válasz rosszabb, mint egy összeomlás.
  • Gyanúsan magas lefedettségű lakosztályok — amikor a lefedettség közel 100 százalékos, de a hibák továbbra is eltűnnek.
  • Régi kód újragondolása — a mutációs eredmények feltárják, hogy a meglévő tesztek kimutatnának-e regressziót.
  • Könyvtárak és megosztott komponensek — egy újrafelhasznált összetevő minden hívóra megsokszorozódik.
  • Gyakorló csapatok tesztvezérelt fejlesztés – a pontszám azt ellenőrzi, hogy az elsőként megírt tesztek valódi munkát végeznek-e.

Általában nem érdemes eldobható prototípusokon, vékony ragasztóval vagy elágazási logika nélküli generált kódon, illetve lassú rendszerek által uralt csomagokon futtatni. integrációs tesztek aminek már egyetlen menete is órákig tart.

A legtöbb csapat ezért a módosított fájlokra kiterjeszti a futtatást, küszöbértéket határoz meg a fontos modulokra, és hagyja, hogy a szélesebb közönség is foglalkozzon velük. regressziós teszt a lakosztály a többit is magával viheti szoftvertesztelés életciklusa.

GYIK

Az ekvivalens mutáns egy olyan változás, amely megváltoztatja a szintaxist, de nem a viselkedést, például egy soha el nem ért ciklushatár lecserélése. Egyetlen teszt sem tudja leállítani, ezért meg kell jelölni és ki kell zárni, mielőtt a pontszám megbízható lenne.

Nincs univerzális szám. A csapatok általában magas küszöbértéket határoznak meg a kritikus modulokra, például a fizetési vagy biztonsági logikára, és alacsonyabbat máshol. Egy százalékos érték hajszolása kevésbé hasznos, mint a nagy kockázatú kódban lévő minden egyes túlélő mutáns áttekintése.

Ez a két feltételezés, amelyen a technika alapul. Az első szerint a programozók közel helyes kódot írnak, így a valódi hibák kicsik. A második szerint a kis hibákat kiszűrő tesztek a belőlük felépített összetett hibákat is kiszűrik.

A mutációt az aktuális ágban módosított fájlokra kell korlátozni, a lefedettségi adatokat újra kell használni, hogy csak a mutánsokat érintő tesztek fussanak le, a mutánsokat párhuzamosan kell futtatni, és a build meghiúsulhat egy pontszámcsökkenés miatt, nem pedig egy abszolút érték alapján.

A gépi tanulási modellek megjósolják, hogy mely mutánsok valószínűsíthetően túlélik, így a futtatás megvágható, a valószínűsíthetően ekvivalens mutánsokat osztályozzák felülvizsgálat céljából, és olyan mutánsokat generálnak, amelyek a projekt előzményeiben látható hibákra hasonlítanak, nem pedig az egységes operátorcserékre.

Igen, a mechanikai részhez. Egy túlélő mutáns és a tesztelt módszer esetén a Copilot elkészíti a hiányzó állítást vagy a peremhelyzet-tesztet. A felülvizsgálónak továbbra is meg kell erősítenie, hogy a várható érték helyes, és nem egyszerűen a jelenlegi viselkedésből van lemásolva.

Auditálja az eredményt. A tesztvezérelt fejlesztés a kód előtti teszteket állít elő, de semmi sem garantálja, hogy ezek a tesztek elégséges állítást tesznek lehetővé. Egy ugyanazon modulokon futtatott periodikus mutáció megmutatja, hogy a piros-zöld ciklus valóban olyan teszteket eredményezett-e, amelyek rossz válasz esetén valóban megbuknak.

Nem. A hibabefecskendezés megrontja a futási környezetet és fuzz tesztelés hibásan formázott bemenetet ad, mindkettő megítéli az alkalmazást. A mutációs tesztelés megváltoztatja a forráskódot és megítéli a tesztkészletet, így a kiértékelés alatt álló objektum más lesz.

Foglald össze ezt a bejegyzést a következőképpen: