Mutációs tesztelés a PITest segítségével

1. Áttekintés

A szoftveres tesztelés a szoftveralkalmazás funkcionalitásának értékelésére használt technikákra vonatkozik. Ebben a cikkben megvitatjuk a szoftvertesztiparban használt néhány mutatót, mint pl kód lefedettség és mutációs tesztelés, különös érdeklődéssel, hogy miként végezhetünk mutációs tesztet a PITest könyvtár.

Az egyszerűség kedvéért ezt a bemutatást egy alapvető palindróma funkcióra alapozzuk - Ne feledje, hogy a palindróma egy húr, amely ugyanazt hátra és előre olvassa.

2. Maven-függőségek

Amint a Maven-függőségek konfigurációjában láthatja, a JUnit segítségével futtatjuk tesztjeinket és a PITest könyvtár bevezetésére mutánsok a kódunkba - ne aggódj, egy másodperc múlva meglátjuk, mi az a mutáns. Ezt a linket követve mindig megkeresheti a legfrissebb függőségi verziót a maven központi adattárához képest.

 org.pitest pitest-parent 1.1.10 pom 

A PITest könyvtár működéséhez és működéséhez a pitest-maven plugin a mi pom.xml konfigurációs fájl:

 org.pitest pitest-maven 1.1.10 com.baeldung.testing.mutation. * com.baeldung.mutation.test. * 

3. Projekt beállítása

Most, hogy konfiguráltuk a Maven-függőségeinket, nézzük meg ezt az önmagyarázó palindrom funkciót:

nyilvános logikai isPalindrome (String inputString) {if (inputString.length () == 0) {return true; } else {char firstChar = inputString.charAt (0); char lastChar = inputString.charAt (inputString.length () - 1); Karakterlánc közepe = inputString.substring (1, inputString.length () - 1); return (firstChar == lastChar) && isPalindrome (közepén); }} 

Most csak egy egyszerű JUnit-tesztre van szükségünk, hogy megbizonyosodhassunk arról, hogy megvalósításunk a kívánt módon működik-e:

@Test public void whenPalindrom_thenAccept () {Palindrome palindromeTester = new Palindrome (); assertTrue (palindromeTester.isPalindrome ("dél")); } 

Eddig nagyon jó, készen állunk arra, hogy JUnit tesztként sikeresen futtassuk tesztesetünket.

Ezután ebben a cikkben a következőkre fogunk összpontosítani kód és mutáció lefedettség a PITest könyvtár használatával.

4. Kód lefedettség

A szoftver lefedettségét a szoftveriparban széles körben alkalmazták annak mérésére, hogy a végrehajtási utak automatizált tesztek során gyakorolták.

Mérhetjük a hatékony kód lefedettséget a végrehajtási útvonalak alapján, például Eclemma elérhető az Eclipse IDE-n.

Futás után TestPalindrome kód lefedettséggel könnyen elérhetjük a 100% -os lefedettségi pontszámot - Vegye figyelembe, hogy isPalindrome rekurzív, ezért teljesen nyilvánvaló, hogy az üres bemeneti hossz ellenőrzése mindenképpen lefedésre kerül.

Sajnos a kód lefedettség mutatói néha meglehetősen nagyok lehetnek hatástalan, mert a 100% -os kód lefedettségi pontszám csak azt jelenti, hogy minden sort legalább egyszer gyakoroltak, de ez nem mond semmit teszteli a pontosságot vagy felhasználási esetek teljessége, és ezért számít a mutációs tesztelés.

5. Mutációs lefedettség

A mutációs tesztelés egy tesztelési technika a megfelelőség javítása tesztek és azonosítsa a hibákat kódban. Az ötlet az, hogy dinamikusan megváltoztassák a gyártási kódot, és a tesztek kudarcot okoznak.

A jó tesztek sikertelenek lesznek

A kód minden változását a-nak nevezzük mutáns, és a program megváltozott verzióját eredményezi, az úgynevezett a mutáció.

Azt mondjuk, hogy a mutáció az megölték ha kudarcot okozhat a tesztekben. Azt is mondjuk, hogy a mutáció túlélte ha a mutáns nem tudta befolyásolni a tesztek viselkedését.

Most futtassuk a tesztet a Maven segítségével, a cél opcióval: org.pitest: pitest-maven: mutationCoverage.

HTML formátumban ellenőrizhetjük a jelentéseket a cél / gödör-teszt / ÉÉÉÉHHNNHHMI Könyvtár:

  • 100% -os vonalvezetés: 7/7
  • 63% -os mutációs lefedettség: 5/8

Nyilvánvaló, hogy tesztünk végigvonul az összes végrehajtási útvonalon, így a vonal lefedettségi pontszáma 100%. Másrészt a PITest könyvtár mutatkozott be 8 mutáns, Közülük 5-t megöltek - kudarcot okoztak -, de 3 életben maradt.

Ellenőrizhetjük a com.baeldung.testing.mutation / Palindrome.java.html jelentés a létrehozott mutánsokról:



Ezek a alapértelmezés szerint aktív mutátorok mutációs lefedettség teszt futtatásakor:

  • INCREMENTS_MUTATOR
  • VOID_METHOD_CALL_MUTATOR
  • RETURN_VALS_MUTATOR
  • MATH_MUTATOR
  • NEGATE_CONDITIONALS_MUTATOR
  • INVERT_NEGS_MUTATOR
  • CONDITIONALS_BOUNDARY_MUTATOR

A PITest mutátorokkal kapcsolatos további részletekért ellenőrizze a tisztviselőt dokumentációs oldal link.

A mutációs lefedettség pontszámunk tükröződik a tesztesetek hiánya, mivel nem tudunk megbizonyosodni arról, hogy a palindrom funkciónk elutasítja-e a nem palindrom és a palindromhoz közeli karakterlánc bemeneteket.

6. Javítsa a mutációs pontszámot

Most, hogy tudjuk, mi a mutáció, javítanunk kell a mutációs pontszámunkat megölve a túlélő mutánsokat.

Vegyük példának az első - negált feltételes - mutációt. A mutáns túlélte, mert még akkor is, ha megváltoztatjuk a kódrészletet:

if (inputString.length () == 0) {return true; }

Nak nek:

if (inputString.length ()! = 0) {return true; }

A teszt sikeres lesz, és ezért a mutáció fennmaradt. Az ötlet egy új teszt megvalósítása sikertelen lesz, ha a mutánst bevezetik. Ugyanez lehet a többi mutáns esetében is.

@Test public void whenNotPalindrom_thanReject () {Palindrome palindromeTester = new Palindrome (); assertFalse (palindromeTester.isPalindrome ("doboz")); } @Test public void whenNearPalindrom_thanReject () {Palindrome palindromeTester = new Palindrome (); assertFalse (palindromeTester.isPalindrome ("neon")); }

Most futtathatjuk tesztjeinket a mutációs lefedettség plugin segítségével, annak biztosítására az összes mutációt megölték, amint azt a célkönyvtárban létrehozott PITest jelentésben láthatjuk.

  • 100% -os vonalvezetés: 7/7
  • 100% -os mutációs lefedettség: 8/8

7. PITest tesztek konfigurálása

A mutációs tesztelés néha erőforrásigényes lehet, ezért megfelelő konfigurációt kell bevezetnünk a tesztek hatékonyságának javítása érdekében. Használhatjuk a targetClasses tag, a mutálandó osztályok listájának meghatározása. A mutációs tesztelés nem alkalmazható a valós világ projektjének minden osztályára, mivel időigényes és erőforrás-kritikus lesz.

Fontos meghatározni a mutációs tesztelés során használni kívánt mutátorokat is, hogy minimalizáljuk a tesztek elvégzéséhez szükséges számítási erőforrásokat:

  com.baeldung.testing.mutation. * com.baeldung.mutation.test. * CONSTRUCTOR_CALLS VOID_METHOD_CALLS RETURN_VALS NON_VOID_METHOD_CALLS 

Ezenkívül a PITest könyvtár számos rendelkezésre álló lehetőséget kínál testreszabhatja tesztelési stratégiáit, megadhatja az osztályok által bevezetett mutánsok maximális számát a maxMutationsPerClass opciót. További részletek a PITest opciókról a hivatalos oldalon Maven gyors útmutató.

8. Következtetés

Vegye figyelembe, hogy a kód lefedettsége továbbra is fontos mutató, de néha nem elegendő a jól tesztelt kód garantálásához. Tehát ebben a cikkben végigjártuk mutációs tesztelés mint egy kifinomultabb módszer a tesztek minőségének biztosítására és a tesztesetek jóváhagyására, a PITest könyvtár.

Láttuk azt is, hogyan lehet elemezni az alapvető PITest jelentéseket, miközben javítjuk a mutációs lefedettségi pontszám.

Annak ellenére, hogy a mutációs tesztek hibákat fedeznek fel a kódban, okosan kell használni, mert rendkívüli költséges és időigényes folyamat.

A hivatkozott cikkben megnézheti a cikkben található példákat GitHub projekt.


$config[zx-auto] not found$config[zx-overlay] not found