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.

  • 🔘 Määritelmä: Mutantti on ohjelma, jossa on yksi tarkoituksellinen syntaktinen muutos, ja sen tappaminen todistaa, että testi on havainnut muutoksen.
  • ☑️ Prosessi: Luo mutantteja, aja testisarjaa alkuperäistä ja mutanttia vastaan, vertaa tuloksia ja vahvista sitten testejä, jotka eivät havainneet virheitä.
  • Operatorit: Operaja-korvaus, lausekkeen muokkaus ja lauseen muokkaus tuottavat kolme pääasiallista mutanttiryhmää.
  • 🧪 Pisteet: Mutaatiopisteet ovat kuolleiden mutanttien prosenttiosuus, ja ne mittaavat väitteen voimaa pikemminkin kuin pelkkää rivin suoritusta.
  • 🛠️ työkalut: Stryker-suojukset Javakäsikirjoitus, TypeScript, C# ja Scala, kun taas PIT mutatoi JVM-tavukoodia Mavenin sisällä ja Gradle rakentaa.
  • ⚠️ Kustannukset: Jokainen mutantti suorittaa koko sarjan uudelleen, joten mutaatiotestaus on hidasta, kallista ja epäkäytännöllistä ilman automaatiota.

Mutaatiotestaus

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.

Mutaatiotestauksen työnkulku, joka näyttää alkuperäisen ohjelman, luodut mutantit, testin suorituksen ja kuoliko vai kuoliko mutantti

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.

Yksi ohjelmalausekkeeseen tehty syntaktinen muutos yhden mutantin tuottamiseksi

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.

Mutaatiopisteytyskaava, joka saadaan jakamalla tapettujen mutanttien määrä mutanttien kokonaismäärällä ja kertomalla se sadalla

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.

UKK

Ekvivalentti mutantti on muutos, joka muuttaa syntaksia, mutta ei toimintaa, kuten silmukan rajan korvaaminen, jota ei koskaan saavuteta. Mikään testi ei voi tappaa sitä, joten se on merkittävä ja suljettava pois ennen kuin tulokseen voidaan luottaa.

Yhtä universaalia lukua ei ole. Tiimit asettavat yleensä korkean kynnyksen kriittisille moduuleille, kuten maksu- tai tietoturvalogiikalle, ja matalamman muualla. Prosenttiosuuden tavoittelu on vähemmän hyödyllistä kuin jokaisen selviytyneen mutantin tarkastelu korkean riskin koodissa.

Nämä ovat kaksi oletusta, joille tekniikka perustuu. Ensimmäisen mukaan ohjelmoijat kirjoittavat lähes oikeaa koodia, joten todelliset virheet ovat pieniä. Toisen mukaan testit, jotka havaitsevat pieniä virheitä, havaitsevat myös niistä rakennetut monimutkaiset virheet.

Rajoita mutaatio tiedostoihin, jotka on muutettu nykyisessä haarassa, käytä uudelleen kattavuusdataa, jotta vain mutanttia koskevat testit suoritetaan, aja mutantteja rinnakkain ja hylkää koonti pistemäärän laskun vuoksi absoluuttisen luvun sijaan.

Koneoppimismallit ennustavat, mitkä mutantit todennäköisesti selviävät, jotta ajoa voidaan karsia, luokitella todennäköiset vastaavat mutantit tarkistusta varten ja luoda mutantteja, jotka muistuttavat projektin historiassa havaittuja vikoja yhdenmukaisten operaattorinvaihtojen sijaan.

Kyllä, mekaanisen osan osalta. Kun otetaan huomioon selviytynyt mutantti ja testattava menetelmä, Copilot laatii puuttuvan väitteen tai reunatapaustestin. Arvioijan on silti varmistettava, että odotusarvo on oikea eikä sitä ole yksinkertaisesti kopioitu nykyisestä käyttäytymisestä.

Se auditoi tuloksen. Testiohjattu kehitys tuottaa testejä ennen koodia, mutta mikään ei takaa, että nämä testit antavat riittävän vakuuttavan tuloksen. Samojen moduulien säännöllinen mutaatioajo osoittaa, tuottiko punavihreä sykli testejä, jotka todella epäonnistuvat väärän vastauksen perusteella.

Ei. Vikainjektio turmelee suoritusympäristön ja fuzz-testaus syöttää virheellisesti muotoiltua syötettä, sekä arvioiden sovellusta. Mutaatiotestaus muuttaa lähdekoodia että arvioi testipakettia, joten arvioitava objekti on erilainen.

Tiivistä tämä viesti seuraavasti: