Mutációs tesztelés

Az oldal jelenlegi verzióját még nem nézték át tapasztalt közreműködők, és jelentősen eltérhet a 2017. augusztus 21-én felülvizsgált verziótól ; az ellenőrzések 7 szerkesztést igényelnek .

A mutációtesztelés ( mutációanalízis vagy programmutáció ) egy szoftvertesztelési módszer , amely a programkód kis változtatásait foglalja magában. [1] Ha egy tesztcsomag nem észlel ilyen változásokat, akkor az elégtelennek minősül. Ezeket a változtatásokat mutációknak nevezzük , és mutáló utasításokon alapulnak, amelyek vagy utánozzák a gyakori programozói hibákat (például rossz operátor vagy változónév használata), vagy hasznos tesztek létrehozását követelik meg.

Történelmi áttekintés

A mutációtesztet Richard Lipton diák javasolta 1971-ben [2] , és először DeMille, Lipton és Seyward fejlesztette ki és publikálta. A mutációt vizsgáló eszköz első megvalósítását Timothy Budd, a Yale Egyetem munkatársa alkotta meg disszertációjában ("Mutational Analysis") 1980-ban.

A mutációtesztelési módszer számításigényes, és a közelmúltig nem volt népszerű. Az utóbbi időben azonban ez a módszer ismét felkeltette az informatika területén kutatók érdeklődését.

A mutációs tesztelés áttekintése

A mutációteszt a mutáló operátorok kiválasztásából és egyenkénti alkalmazásából áll a program forráskódjának minden egyes darabjára. A mutáló operátor egy forráskód-átalakítási szabály. Egy mutációs operátor programra történő egyszeri alkalmazásának eredményét mutánsnak nevezzük . Ha a tesztkészlet képes észlelni a változást (azaz az egyik teszt sikertelen), akkor a mutáns elpusztult . Vegyük például a következő részletet egy C++ programból:

if ( a && b ) { c = 1 ; } másik { c = 0_ _ }

A feltétel mutáció operátor helyére , és a következő mutáns jön &&létre ||:

if ( a || b ) { c = 1 ; } másik { c = 0_ _ }

Ahhoz, hogy a teszt elpusztítsa ezt a mutánst, a következő feltételeknek kell teljesülniük:

  • A tesztnek el kell érnie (El kell érnie) a mutált utasítást .
  • A teszt bemeneti adatainak a mutáns program (Infect) és az eredeti program eltérő állapotaihoz kell vezetniük. Például a a = 1és a teszt b = 0ezt eredményezné.
  • A változó értékének cbefolyásolnia kell (Terjesztenie) a program kimenetét, és a tesztnek ellenőriznie kell.

Ezeket a feltételeket együttesen RIP-modellnek nevezzük .

A gyenge mutációteszthez (vagy gyenge mutációs lefedettséghez ) csak az első két feltételnek kell teljesülnie. Az erős mutációteszthez mindhárom feltétel teljesülése szükséges, és biztosítja, hogy a tesztkészlet valóban észlelni tudja a változást. A gyenge mutációk tesztelése szorosan összefügg a kódlefedési technikákkal . A teszt ellenőrzése egy gyenge mutáció körülményei között sokkal kevesebb számítást igényel, mint egy erős mutáció feltételeinek ellenőrzése.

Egyenértékű mutánsok

Sok mutációs utasítás egyenértékű programokhoz vezethet. Vegyük például a következő programrészletet:

int index = 0 ; míg ( ... ) { ; index ++ ; if ( index == 10 ) { szünet ; } }

A feltétel mutáció operátor helyettesíthető ==a >=következő mutánssal:

int index = 0 ; míg ( ... ) { ; index ++ ; if ( index >= 10 ) { szünet ; } }

Nincs azonban olyan teszt, amely megölné ezt a mutánst. A kapott program megegyezik az eredeti programmal. Az ilyen mutánsokat ekvivalens mutánsoknak nevezzük .

Az ekvivalens mutánsok felismerése az egyik legnagyobb akadály a mutációs tesztelés gyakorlati alkalmazásában. A mutáns egyenértékűségének ellenőrzésére irányuló erőfeszítés még kis programok esetében is nagyon nagy lehet. [3]

Mutációs operátorok

Sokféle mutációs operátort feltártak már. Például kötelező nyelvekhez a következő operátorok használhatók:

  • Program utasítás törlése.
  • Cserélje le az egyes logikai kifejezéseket egy „igaz” vagy „hamis” logikai konstansra.
  • Cserélje ki az egyes aritmetikai műveleteket egy másikkal. Például +a *, -vagy /.
  • Cserélje ki az egyes logikai műveleteket egy másikra. Például >a >=, ==vagy <=.
  • Cserélje le az egyes változókat egy másikra (ugyanabból a hatókörből ). A változóknak azonos típusúaknak kell lenniük.

Ezen kívül vannak operátorok az objektum-orientált nyelvekhez, [4] operátorok a párhuzamos programozáshoz, [5] operátorok adatstruktúrákhoz , például konténerekhez [6] stb.

Jegyzetek

  1. Gyakorlati rendszer mutációteszthez: súgó a közös programozónak Archiválva : 2012. február 14., a Wayback Machine , A. Jefferson Offutt.
  2. Mutation 2000: Uniting the Orthogonal . Hozzáférés dátuma: 2012. január 28. Az eredetiből archiválva : 2011. szeptember 28.
  3. P.G. Frankl, S.N. Weiss és C. Hu. Minden felhasználás kontra mutációs tesztelés: a hatékonyság kísérleti összehasonlítása. Journal of Systems and Software , 38:235-253, 1997.
  4. MuJava: An Automated Class Mutation System archiválva 2012. március 11-én a Wayback Machine -nél , Yu-Seung Ma, Jeff Offutt és Yong Rae Kwo.
  5. Mutációs operátorok egyidejű Java-hoz (J2SE 5.0) Archiválva : 2012. február 5. a Wayback Machine -ben, Jeremy S. Bradbury, James R. Cordy, Juergen Dingel.
  6. Mutation of Java Objects Archivált : 2013. május 12. a Wayback Machine -nél, szerző: Roger T. Alexander, James M. Bieman, Sudipto Ghosh, Bixia Ji.