Testovanie mutácií pomocou PITestu

1. Prehľad

Testovanie softvéru sa týka techník používaných na hodnotenie funkčnosti softvérovej aplikácie. V tomto článku sa budeme zaoberať niektorými metrikami používanými v priemysle testovania softvéru, ako napr pokrytie kódu a testovanie mutácií, so zvláštnym záujmom o to, ako vykonať test mutácie pomocou Knižnica PITest.

Kvôli jednoduchosti založíme túto ukážku na základnej funkcii palindrómu - Upozorňujeme, že palindróm je reťazec, ktorý sa číta rovnako dozadu aj dopredu.

2. Maven závislosti

Ako vidíte v konfigurácii závislostí Maven, na spustenie našich testov a. Použijeme JUnit PITest knižnica zaviesť mutanti do nášho kódu - nebojte sa, o chvíľu uvidíme, čo je to mutant. Podľa tohto odkazu môžete kedykoľvek vyhľadať najnovšiu verziu závislosti od centrálneho úložiska maven.

 org.pitest pitest-rodič 1.1.10 pom 

Na zaistenie funkčnosti knižnice PITest je potrebné zahrnúť aj knižnicu pitest-maven plugin v našom pom.xml konfiguračný súbor:

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

3. Nastavenie projektu

Teraz, keď máme nakonfigurované naše závislosti Maven, sa pozrime na túto samozrejmú palindrómovú funkciu:

public boolean isPalindrome (String inputString) {if (inputString.length () == 0) {return true; } else {char firstChar = inputString.charAt (0); char lastChar = inputString.charAt (inputString.length () - 1); Reťazec mid = inputString.substring (1, inputString.length () - 1); return (firstChar == lastChar) && isPalindrome (v strede); }} 

Všetko, čo teraz potrebujeme, je jednoduchý test JUnit, aby sme sa ubezpečili, že naša implementácia funguje požadovaným spôsobom:

@ Test public void whenPalindrom_thenAccept () {Palindrome palindromeTester = nový Palindrome (); assertTrue (palindromeTester.isPalindrome ("poludnie")); } 

Zatiaľ sme v poriadku, sme pripravení úspešne spustiť náš testovací prípad ako test JUnit.

Ďalej sa v tomto článku zameriame na kódové a mutačné pokrytie pomocou knižnice PITest.

4. Pokrytie kódu

Pokrytie kódu sa v softvérovom priemysle hojne využíva na meranie toho, koľko percent z nich exekučné cesty bol vykonaný počas automatizovaných testov.

Efektívne pokrytie kódu môžeme merať na základe ciest vykonávania pomocou nástrojov ako Eclemma k dispozícii na Eclipse IDE.

Po spustení TestPalindrome s pokrytím kódu môžeme ľahko dosiahnuť 100% skóre pokrytia - všimnite si isPalindrome je rekurzívna, takže je zrejmé, že kontrola prázdnej vstupnej dĺžky bude aj tak pokrytá.

Bohužiaľ, metrika pokrytia kódu môže byť niekedy celkom dobrá neúčinné, pretože skóre pokrytia 100% kódu znamená iba to, že všetky riadky boli precvičené aspoň raz, ale nič to nehovorí presnosť testov alebo úplnosť prípadov použitia, a preto vlastne záleží na testovaní mutácií.

5. Pokrytie mutácií

Mutačné testovanie je testovacia technika zvyknutá na zlepšiť primeranosť testov a identifikovať chyby v kóde. Cieľom je dynamicky zmeniť produkčný kód a spôsobiť zlyhanie testov.

Dobré testy zlyhajú

Každá zmena v kóde sa nazýva a mutant, a výsledkom bude zmenená verzia programu s názvom a mutácia.

Hovoríme, že mutácia je zabitý ak to môže spôsobiť zlyhanie v testoch. Hovoríme tiež, že mutácia prežil ak mutant nemohol ovplyvniť chovanie testov.

Teraz spustíme test pomocou Mavenu s možnosťou cieľa nastavenou na: org.pitest: pitest-maven: mutationCoverage.

Môžeme skontrolovať správy vo formáte HTML v cieľ / pit-test / RRRRMMDDHHMI adresár:

  • 100% pokrytie linky: 7/7
  • 63% pokrytie mutáciami: 5/8

Je zrejmé, že náš test prechádza všetkými cestami vykonávania, takže skóre pokrytia čiary je 100%. Na druhej strane predstavila knižnica PITest 8 mutantov, 5 z nich bolo zabitých - spôsobili zlyhanie - ale 3 prežili.

Môžeme skontrolovať com.baeldung.testing.mutation / Palindrome.java.html správa pre viac podrobností o vytvorených mutantoch:



Toto sú predvolene sú aktívne mutátory pri spustení testu mutačného pokrytia:

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

Ďalšie informácie o mutátoroch PITest nájdete na oficiálnej stránke stránka s dokumentáciou odkaz.

Odráža sa naše skóre pokrytia mutácií nedostatok testovacích prípadov, pretože sa nemôžeme ubezpečiť, že naša palindrómová funkcia odmieta nepalindromické a takmer palindromické reťazcové vstupy.

6. Zlepšite skóre mutácie

Teraz, keď vieme, čo je to mutácia, je potrebné zlepšiť naše skóre mutácie zabíjanie prežívajúcich mutantov.

Vezmime si ako príklad prvú mutáciu - negovanú podmienenú - na riadku 6. Mutant prežil, pretože aj keby sme zmenili útržok kódu:

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

Komu:

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

Test prejde, a preto mutácia prežila. Cieľom je zaviesť nový test, ktorý zlyhá v prípade zavedenia mutanta. To isté možno urobiť pre zvyšné mutanty.

@Test public void whenNotPalindrom_thanReject () {Palindrome palindromeTester = nový Palindrome (); assertFalse (palindromeTester.isPalindrome ("krabica")); } @Test public void whenNearPalindrom_thanReject () {Palindrome palindromeTester = new Palindrome (); assertFalse (palindromeTester.isPalindrome ("neón")); }

Teraz môžeme svoje testy spustiť pomocou doplnku na pokrytie mutácií, aby sme sa uistili, že všetky mutácie boli zabité, ako vidíme v zostave PITest vygenerovanej v cieľovom adresári.

  • 100% pokrytie linky: 7/7
  • 100% pokrytie mutáciami: 8/8

7. Konfigurácia testov PITest

Testovanie mutácií môže byť niekedy náročné na zdroje, takže na zlepšenie efektívnosti testov musíme zaviesť správnu konfiguráciu. Môžeme využiť targetClasses tag, na definovanie zoznamu tried, ktoré sa majú mutovať. Testovanie mutácií nie je možné aplikovať na všetky triedy v projekte reálneho sveta, pretože bude časovo náročné a kritické z hľadiska zdrojov.

Je tiež dôležité definovať mutátory, ktoré plánujete použiť počas testovania mutácií, aby sa minimalizovali výpočtové zdroje potrebné na vykonanie testov:

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

Knižnica PITest navyše ponúka rôzne možnosti prispôsobte svoje testovacie stratégie, môžete určiť maximálny počet mutantov zavedených triedou pomocou maxMutationsPerClass možnosť napr. Viac podrobností o možnostiach PITest v oficiálnom formáte Sprievodca rýchlym spustením Maven.

8. Záver

Upozorňujeme, že pokrytie kódu je stále dôležitou metrikou, niekedy však nestačí na zaručenie dobre otestovaného kódu. Takže v tomto článku sme si prešli testovanie mutácií ako sofistikovanejší spôsob zabezpečenia kvality testov a schvaľovania testovacích prípadov pomocou Knižnica PITest.

Tiež sme videli, ako analyzovať základné prehľady PITestu a zároveň vylepšovať skóre pokrytia mutácií.

Napriek tomu, že testovanie mutácií odhaľuje chyby v kóde, malo by sa používať múdro, pretože ide o extrémny jav nákladný a časovo náročný proces.

Môžete si pozrieť príklady uvedené v tomto článku v prepojení Projekt GitHub.


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