Mutaatiotestaus ( mutaatioanalyysi tai ohjelmamutaatio ) on ohjelmistotestausmenetelmä , joka sisältää pieniä muutoksia ohjelmakoodiin. [1] Jos testisarja ei havaitse tällaisia muutoksia, sitä pidetään riittämättömänä. Näitä muutoksia kutsutaan mutaatioiksi , ja ne perustuvat mutaatiolausekkeisiin , jotka joko jäljittelevät yleisiä ohjelmointivirheitä (kuten väärän operaattorin tai muuttujan nimen käyttäminen) tai vaativat meitä luomaan hyödyllisiä testejä.
Mutaatiotestausta ehdotti opiskelija Richard Lipton vuonna 1971 [2] , ja sen kehittivät ja julkaisivat ensimmäisenä DeMille, Lipton ja Seyward. Ensimmäisen mutaatiotestaustyökalun toteutuksen loi Yalen yliopiston Timothy Budd väitöskirjassaan (nimeltään "Mutational Analysis") vuonna 1980.
Mutaatiotestausmenetelmä on laskennallisesti kallis, eikä se ole ollut suosittu vasta viime aikoihin asti. Viime aikoina tämä menetelmä on kuitenkin jälleen herättänyt kiinnostusta tietotekniikan alan tutkijoissa.
Mutaatiotestaus koostuu mutatoituvien operaattorien valinnasta ja soveltamisesta yksitellen jokaiseen ohjelman lähdekoodin osaan. Mutoiva operaattori on lähdekoodin muunnossääntö. Mutaatiooperaattorin yksittäisen sovelluksen tulosta kutsutaan mutantiksi . Jos testisarja pystyy havaitsemaan muutoksen (eli yksi testeistä epäonnistuu), mutantin sanotaan kuolleen . Harkitse esimerkiksi seuraavaa katkelmaa C++-ohjelmasta:
if ( a && b ) { c = 1 ; } muu { c = 0_ _ }Ehtomutaatio-operaattori korvaa &&ja ||luo seuraavan mutantin:
if ( a || b ) { c = 1 ; } muu { c = 0_ _ }Jotta testi tappaisi tämän mutantin, seuraavien ehtojen on täytyttävä:
Näitä ehtoja kutsutaan yhteisesti RIP - malliksi .
Heikko mutaatiotestaus (tai heikko mutaatiokattavuus ) edellyttää vain kahden ensimmäisen ehdon täyttymistä. Vahva mutaatiotestaus edellyttää kaikkien kolmen ehdon täyttymistä ja varmistaa, että testisarja voi todella havaita muutoksen. Heikkomutaatiotestaus liittyy läheisesti koodipeittotekniikoihin . Testin tarkistaminen heikon mutaation olosuhteita vastaan vaatii paljon vähemmän laskentaa kuin vahvan mutaation olosuhteiden tarkistaminen.
Monet mutaatiolausekkeet voivat johtaa vastaaviin ohjelmiin. Harkitse esimerkiksi seuraavaa ohjelman fragmenttia:
int indeksi = 0 ; kun ( ... ) { … ; indeksi ++ ; if ( indeksi == 10 ) { tauko ; } }Tilamutaatiooperaattori voidaan korvata ==seuraavalla >=mutantilla:
int indeksi = 0 ; kun ( ... ) { … ; indeksi ++ ; if ( indeksi >= 10 ) { tauko ; } }Ei kuitenkaan ole olemassa testiä, joka voisi tappaa tämän mutantin. Tuloksena oleva ohjelma vastaa alkuperäistä ohjelmaa. Tällaisia mutantteja kutsutaan vastaaviksi mutantteiksi .
Vastaavien mutanttien tunnistaminen on yksi suurimmista esteistä mutaatiotestauksen käytölle käytännössä. Pyrkimys tarkistaa, onko mutantti ekvivalentti voi olla erittäin suuri jopa pienille ohjelmille. [3]
Monenlaisia mutaatiooperaattoreita on tutkittu. Esimerkiksi pakollisille kielille voidaan käyttää seuraavia operaattoreita:
Lisäksi on operaattorit oliokielille, [4] operaattorit rinnakkaisohjelmointiin, [5] operaattorit tietorakenteille , kuten konteille [6] jne.