Mitä on mutaatiotestaus? (Esimerkki)
⚡ Älykäs yhteenveto
Mutaatiotestaus lisää tarkoituksella pieniä virheitä lähdekoodiin ja ajaa sitten olemassa olevan testisarjan jokaista virheellistä versiota vastaan mitatakseen, ovatko testit riittävän vahvoja havaitsemaan muutokset.
Mitä on mutaatiotestaus?
Mutaatiotestaus on ohjelmistotestauksen tyyppi, jossa tiettyjä lähdekoodin lauseita muutetaan eli mutatoidaan sen tarkistamiseksi, löytävätkö testitapaukset virheitä lähdekoodista. Mutaatiotestauksen tavoitteena on varmistaa testitapausten laatu ja luotettavuus, jotta ne epäonnistuvat mutatoitua lähdekoodia vastaan.
Mutanttiohjelmassa tehtävän muutoksen on oltava erittäin pieni, jotta se ei vaikuta ohjelman kokonaistavoitteeseen. Mutaatiotestausta kutsutaan myös vikaperusteiseksi testausstrategiaksi, koska siinä luodaan tarkoituksella virhe ohjelmaan. Se on eräänlainen Valkoinen Box Testaus jota sovelletaan pääasiassa aikana Yksikkötestaus.
Mutaatiotestaus esitettiin Richard Liptonin opiskelijan esseessä vuonna 1971, ja se virallistettiin DeMillon, Liptonin ja Saywardin vuonna 1978 julkaisemassa artikkelissa ”Hints on Test Data Selection”. Se menetti vauhtiaan silloisten laskentakustannusten vuoksi ja on sittemmin vallannut takaisin jalansijaa kielille, kuten Java, C#, Python, JavaSkripti ja XML.
Kuinka mutaatiotestaus suoritetaan?
Seuraavat vaiheet suorittavat mutaatiotestauksen eli mutaatioanalyysin:
Vaihe 1: Ohjelman lähdekoodiin tuodaan virheitä luomalla useita versioita, joita kutsutaan mutanteiksi. Jokaisessa mutantissa tulisi olla yksi virhe, ja tavoitteena on aiheuttaa mutanttiversion epäonnistuminen, mikä osoittaa testitapausten tehokkuuden.
Vaihe 2: Testitapauksia sovelletaan sekä alkuperäiseen ohjelmaan että mutanttiohjelmaan. Testitapaus tulee olla riittävä, ja se on viritetty havaitsemaan ohjelman viat.
Vaihe 3: Vertaa alkuperäisen ja mutanttiohjelman tuloksia.
Vaihe 4: Jos alkuperäinen ohjelma ja mutanttiohjelma tuottavat erilaiset tulokset, testitapaus tappaa mutantin. Näin ollen testitapaus on riittävän hyvä havaitsemaan muutoksen alkuperäisen ja mutanttiohjelman välillä.
Vaihe 5: Jos alkuperäinen ohjelma ja mutanttiohjelma tuottavat saman tuloksen, mutantti pysyy hengissä. Tällaisissa tapauksissa on luotava tehokkaampia testitapauksia, jotka tappavat kaikki mutantit.
Alla oleva kaavio tracsamat viisi vaihetta alkuperäisestä ohjelmasta mutanttien luomisen kautta kuolemaan tai selviytymiseen asti.
Kuinka luoda mutanttiohjelmia?
Mutaatio ei ole muuta kuin yksittäinen ohjelmalauseeseen tehty syntaktinen muutos. Jokaisen mutanttiohjelman tulisi poiketa alkuperäisestä ohjelmasta täsmälleen yhden mutaation verran.
| Alkuperäinen ohjelma | Mutantti ohjelma |
| Jos (x>y) Tulosta "Hei" Muu Tulosta "Hei" |
Jos (x Tulosta "Hei" Muu Tulosta "Hei" |
Yllä olevassa parissa vain vertailuoperaattori muuttui, mutta testitapaus, jossa x on suurempi kuin y, tulostaa nyt "Hei" "Hello":n sijaan. Kuvassa näkyy tämä yksi syntaktinen muokkaus.
Mitä muuttaa Mutant-ohjelmassa?
Mutanttiohjelmien luomiseen on useita tekniikoita. Alla olevat kolme mutaatio-operaattoriperhettä kattavat useimmat työkalujen mukana toimitettavista mutaatio-operaattoreista.
| Operaja korvaavat operaattorit | Lausekkeenmuokkausoperaattorit | Lauseenmuokkausoperaattorit |
| Korvaa operandi toisella operandilla (x y:llä tai y x:llä) tai vakioarvolla. | Korvaa operaattori tai lisää uusi operaattori ohjelmalausekkeeseen. | Ohjelmallisia lausekkeita muokataan mutanttiohjelmien luomiseksi. |
| Esimerkiksi: Jos(x>y) korvaa x- ja y-arvot Jos(5>y) korvaa x vakiolla 5 |
Esimerkiksi: Jos(x==y) Voimme korvata == merkinnällä >= ja saada mutanttiohjelman muotoon If(x>=y) ja ++ lisääminen lauseeseen Jos(x==++y) |
Esimerkiksi: Poista else-osa if-else-lauseesta Poista koko if-else-lauseke tarkistaaksesi ohjelman toiminnan |
Joitakin esimerkkimutaatio-operaattoreita:
- GOTO etiketin vaihto
- Palautusilmoituksen vaihto
- Lausunnon poisto
- Unaarioperaattorien lisäys (kuten – ja ++)
- Looginen liittimen vaihto
- Vertailukelpoinen taulukon nimen vaihto
- if-else-lausekkeen else-osan poistaminen
- Operaattoreiden lisääminen tai korvaaminen
- Lausunnon korvaaminen muuttamalla tietoja
- Muuttujien tietojen muokkaaminen
- Tietotyyppien muuttaminen ohjelmassa
Operareunaehtoa koskettavat tekijät selviävät useimmiten, joten mutaatiotulokset viittaavat usein takaisin aukkoihin raja-arvoanalyysi.
Mutaatiotestauksen tyypit
In OhjelmistotuotantoMutaatiotestaus luokitellaan periaatteessa kolmeen tyyppiin: lausemutaatio, arvomutaatio ja päätösmutaatio.
- Lausuntomutaatio – lauseke leikataan, liitetään tai poistetaan, joten tuloksena voi olla joidenkin koodirivien poistaminen.
- Arvon mutaatio – ensisijaisten parametrien ja vakioiden arvoja muutetaan, esimerkiksi muuttamalla silmukkarajaa tai kynnysarvoa.
- Päätöksen mutaatio – ohjauslausekkeita muutetaan, esimerkiksi flipping relaatio-operaattori tai ehdon negaatio.
Työkalut ryhmittelevät operaattorinsa näiden kolmen otsikon alle, joten selviytyneen mutantin tuottanut perhe kertoo testaajalle, minkä tyyppinen väittämä puuttuu. Selviytynyt päätösmutantti merkitsee yleensä testaamatonta haaraa, joka on päällekkäinen silmukkatestaus.
Mutaatiotestauksen automatisointi
Mutaatiotestaus on erittäin aikaa vievää ja monimutkaista suorittaa manuaalisesti, joten on suositeltavaa käyttää automaatiotyökaluja, jotka myös vähentävät kustannuksia. Mutaatiotyökalu kokoaa mutantit, aikatauluttaa ajot, tallentaa, mitkä mutantit tapettiin kussakin epäonnistuneessa testissä, ja raportoi pisteet.
Saatavilla olevien työkalujen luettelo:
- Stryker — avoimen lähdekoodin mutaatiotestauskehys, josta on saatavilla versioita JavaKäsikirjoitus ja TypeScript (StrykerJS), C# ja .NET (Stryker.NET) sekä Scala (Stryker4s).
- PIT, joka on myös PITest — mutaatiotestausjärjestelmä Java ja JVM, joka mutatoi käännettyä tavukoodia ja kytkeytyy Maveniin ja Gradle rakentaa rinnakkain JUnit.
Molemmat suoritetaan rakennusvaiheena, joten ne kuuluvat samaan jatkuva integrointi putkilinja kuten muukin automaatiotestaus sviitti.
Mutaatiopisteet
Mutaatiopistemäärä määritellään kuolleiden mutanttien prosenttiosuutena mutanttien kokonaismäärästä.
Mutaatiopisteet = (Tapetut mutantit / Mutanttien kokonaismäärä) * 100
Kaava on esitetty alla muodossa, jossa useimmat työkalut sen raportoivat.
Testitapauksia kuvataan mutaatiokelpoisiksi, kun pistemäärä saavuttaa 100 prosenttia. Käytännössä nimittäjän on suljettava pois vastaavat mutantit — mutantit, joiden muuttunut syntaksi käyttäytyy täsmälleen samalla tavalla kuin alkuperäinen, joten mikään testi ei voi tappaa niitä. Työkalut siis raportoivat kuolleiden mutanttien määrän jaettuna kuolleiden ja eloonjääneiden ei-ekvivalenttien mutanttien määrällä ja antavat testaajan merkitä ekvivalentit.
Kokeelliset tulokset ovat osoittaneet, että mutaatiotestaus on tehokas tapa mitata testitapausten riittävyyttä. Suurin haittapuoli on mutanttien luomisen ja jokaisen testitapauksen suorittamisen kustannukset jokaista vastaan.
Mutaatiotestaus vs. Code Kattavuus
Korkea testin kattavuus ei todista vahvoja testejä. Rivi- ja haarakattavuus tallentaa, mitkä lauseet suoritettiin, eivät sitä, varmistettiinko mitään jälkikäteen, joten testi, joka kutsuu metodia eikä väitä mitään, lasketaan silti katetuksi. Mutaatiotestaus täyttää tämän aukon, koska mutantti kuolee vain, kun väite todella epäonnistuu.
| Aspect | Code kattavuus | Mutaatiopisteet |
| Mitä se mittaa | Millä linjoilla tai haaroilla testit suoritettiin | Mitä injektoituja vikoja testit havaitsivat |
| Herkkä väitteille | Ei — testi, jossa ei ole yhtään väitettä, lisää silti kattavuutta | Kyllä – mutantti selviää, kun mikään väite ei petä |
| Juoksun hinta | Yksi instrumentoitu koeajo | Yksi koeajo kutakin selviytynyttä mutanttia kohden, toistaiseksi hitaampi |
| Tyypillinen käyttö | Nopea portti jokaisesta commitista | Kriittisten moduulien perusteellisempi säännöllinen tarkastus |
| Virhetila | 100 prosentin kattavuus ilman todellista vahvistusta | Vastaavat mutantit, joita ei voida koskaan tappaa |
Nämä kaksi mittaria täydentävät toisiaan. Kattavuus nimeää koodin, jota ei koskaan saavutettu; mutaatiopistemäärä nimeää saavutetun koodin, jota ei koskaan tarkistettu. Molemmat syöttävät samaa tietoa vianhallinnan prosessirinnakkain sellaisten toimenpiteiden kanssa kuin vikatiheys.
Mutaatiotestauksen edut
Seuraavat ovat mutaatiotestauksen edut:
- Se on tehokas lähestymistapa lähdekoodiohjelman korkean kattavuuden saavuttamiseksi.
- Se testaa itse testisarjaa, jota mikään muu ei testaa. ohjelmistotestaustekniikka tekee suoraan.
- Mutaatiotestaus tuo ohjelmistokehittäjille hyvän virheiden havaitsemiskyvyn.
- Menetelmä paljastaa lähdekoodin epäselvyyksiä ja pystyy havaitsemaan virheitä, joihin tavalliset suoritusajot eivät koskaan yllä.
- Selviytyneet mutantit ovat toimenpiteitä vaativia: jokainen nimeää tietyn rivin ja muutoksen, jota sviitti ei huomannut.
- Asiakkaat hyötyvät tästä testauksesta saamalla luotettavamman ja vakaamman järjestelmän.
Mutaatiotestauksen haitat
Toisaalta mutaatiotestauksen haitat ovat seuraavat:
- Mutaatiotestaus on erittäin kallista ja aikaa vievää, koska se vaatii suuren määrän mutanttiohjelmia luomista ja kääntämistä.
- Koska se on aikaa vievää, on reilua sanoa, että tätä testausta ei voida tehdä ilman automaatiotyökalua.
- Jokaista mutanttia testataan samalla määrällä testitapauksia kuin alkuperäistä ohjelmaa, joten koko testisarjaa vastaan on ajettava suuri mutanttipopulaatio.
- Vastaavia mutantteja ei voida tappaa millään testillä, ja niiden erottaminen aidoista eloonjääneistä vaatii yleensä manuaalisen tarkistuksen.
- Koska metodi muuttaa lähdekoodia, sitä ei voida soveltaa Musta Box Testaus.
Milloin mutaatiotestausta käytetään
Yllä oleva kustannusprofiili tarkoittaa, että mutaatiotestausta suoritetaan harvoin koko koodikannalle jokaisella commit-komennolla. Se kannattaa itsensä takaisin silloin, kun havaitsematon virhe on kallis ja testattava koodi on riittävän pieni mutatoituakseen nopeasti.
- Turvallisuuskriittinen tai taloudellinen logiikka — maksujen laskenta, verosäännöt ja valtuutustarkastukset, joissa hiljainen väärä vastaus on pahempi kuin kaatuminen.
- Sviitit, joissa on epäilyttävän korkea kattavuus — kun peittoaste on lähes 100 prosenttia, mutta vikoja ei silti esiinny.
- Vanhaa koodia refaktoroidaan — mutaatiotulokset paljastavat, havaittaisivatko olemassa olevat testit regressiota.
- Kirjastot ja jaetut komponentit — uudelleenkäytetyn laitteen vika komponentti moninkertaistuu jokaisen soittajan kesken.
- Harjoittelevat joukkueet testiohjattu kehitys — pisteytys tarkistaa, että ensin kirjoitetut testit toimivat oikeasti.
Yleensä ei kannata ajaa kertakäyttöprototyypeillä, ohuella liimalla tai generoidulla koodilla, jossa ei ole haarautumislogiikkaa, tai hitaiden järjestelmien hallitsemilla paketeilla. integraatiotestit joiden yhteen kertaan menee jo tunteja.
Useimmat tiimit siis laajentavat suorituksen muuttuneisiin tiedostoihin, asettavat kynnysarvon tärkeille moduuleille ja antavat laajemman osallistujan regressiotestaus sviitti kantaa loput ohjelmistotestauksen elinkaari.



