Ispitivanje mutacija s PITestom

1. Pregled

Testiranje softvera odnosi se na tehnike korištene za procjenu funkcionalnosti softverske aplikacije. U ovom ćemo članku razgovarati o nekim mjernim podacima koji se koriste u industriji testiranja softvera, poput pokrivenost kodom i ispitivanje mutacija, s osobitim zanimanjem kako izvesti test mutacije pomoću PITest knjižnica.

Radi jednostavnosti, ovu ćemo demonstraciju temeljiti na osnovnoj funkciji palindroma - imajte na umu da je palindrom niz koji čita isto natrag i naprijed.

2. Ovisnosti Mavena

Kao što možete vidjeti u konfiguraciji ovisnosti Mavena, koristit ćemo JUnit za pokretanje testova i PITest knjižnica za uvođenje mutanti u naš kod - ne brinite, vidjet ćemo za trenutak što je mutant. Uvijek možete potražiti najnoviju verziju ovisnosti o središnjem spremištu maven slijedeći ovu vezu.

 org.pitest pitest-roditelj 1.1.10 pom 

Da bismo pokrenuli i pokrenuli knjižnicu PITest, također moramo uključiti i pitest-maven dodatak u našem pom.xml konfiguracijska datoteka:

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

3. Postavljanje projekta

Sad kad smo konfigurirali svoje ovisnosti o Mavenu, pogledajmo ovu samoobjašnjivu funkciju palindroma:

javni boolean isPalindrome (String inputString) {if (inputString.length () == 0) {return true; } else {char firstChar = inputString.charAt (0); char lastChar = inputString.charAt (inputString.length () - 1); Niz sredina = inputString.substring (1, inputString.length () - 1); povratak (firstChar == lastChar) && isPalindrome (sredina); }} 

Sve što nam sada treba je jednostavan JUnit test kako bismo bili sigurni da naša implementacija radi na željeni način:

@Test public void whenPalindrom_thenAccept () {Palindrome palindromeTester = novi Palindrom (); assertTrue (palindromeTester.isPalindrome ("podne")); } 

Do sada je dobro, spremni smo uspješno pokrenuti svoj testni slučaj kao JUnit test.

Dalje, u ovom ćemo se članku usredotočiti na kod i pokrivenost mutacije pomoću knjižnice PITest.

4. Pokrivenost kodom

Pokrivenost kodom intenzivno se koristi u softverskoj industriji za mjerenje koliki postotak putovi izvršenja se vježbalo tijekom automatiziranih testova.

Učinkovito pokrivanje koda možemo izmjeriti na temelju putova izvršenja pomoću alata poput Eclemma dostupno na Eclipse IDE.

Nakon trčanja TestPalindrom s pokrivenošću koda lako možemo postići 100% ocjenu pokrivenosti - imajte na umu da isPalindrom je rekurzivan, pa je prilično očito da će prazna provjera duljine ionako biti pokrivena.

Nažalost, mjerni podaci o pokrivanju koda ponekad mogu biti prilično neučinkovit, jer ocjena pokrivenosti 100% koda samo znači da su se sve linije vježbale barem jednom, ali ne govori ništa o tome ispituje točnost ili cjelovitost slučajeva upotrebe, i zato je testiranje mutacija zapravo važno.

5. Pokrivenost mutacijama

Ispitivanje mutacija tehnika je ispitivanja koja se koristi poboljšati adekvatnost testova i prepoznati nedostatke u kodu. Ideja je dinamička promjena proizvodnog koda i uzrokovanje neuspjeha testova.

Dobri testovi neće uspjeti

Svaka promjena u kodu naziva se a mutantni, a rezultira izmijenjenom verzijom programa, nazvanom a mutacija.

Kažemo da je mutacija ubijena ako može prouzročiti neuspjeh u testovima. Kažemo i da je mutacija preživjeli ako mutant nije mogao utjecati na ponašanje testova.

Sada pokrenimo test koristeći Maven, s opcijom cilja postavljenom na: org.pitest: pitest-maven: mutationCoverage.

Izvješća u HTML formatu možemo provjeriti u cilj / test-jama / GGGGMMDDHHMI imenik:

  • 100% pokrivenost linije: 7/7
  • 63% pokrivenost mutacije: 5/8

Jasno je da naš test prelazi sve puteve izvršenja, tako da je rezultat pokrivenosti linije 100%. S druge strane, uvela je knjižnica PITest 8 mutanata, 5 ih je ubijeno - Izazvalo neuspjeh - ali 3 su preživjela.

Možemo provjeriti com.baeldung.testing.mutation / Palindrome.java.html izvještaj za više detalja o stvorenim mutantima:



Ovo su mutatori aktivni prema zadanim postavkama prilikom izvođenja testa pokrivanja mutacije:

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

Za više detalja o PITest mutatorima možete provjeriti službenu osobu stranica dokumentacije veza.

Naša ocjena pokrivenosti mutacija odražava se nedostatak test slučajeva, jer ne možemo biti sigurni da naša funkcija palindroma odbija nepalindromske i gotovo palindromske unose žica.

6. Poboljšajte rezultat mutacije

Sad kad znamo što je mutacija, moramo poboljšati rezultat mutacije za ubivši preživjele mutante.

Uzmimo za primjer prvu mutaciju - negiranu uvjetnu - na retku 6. Mutant je preživio jer čak i ako promijenimo isječak koda:

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

Do:

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

Test će proći, i zato mutacija je preživjela. Ideja je provesti novi test koji neće uspjeti, u slučaju da se mutant uvede. Isto se može učiniti za preostale mutante.

@Test public void whenNotPalindrom_thanReject () {Palindrome palindromeTester = novi Palindrom (); assertFalse (palindromeTester.isPalindrome ("kutija")); } @Test public void whenNearPalindrom_thanReject () {Palindrome palindromeTester = novi Palindrom (); assertFalse (palindromeTester.isPalindrome ("neon")); }

Sada možemo pokrenuti naše testove pomoću dodatka za pokrivanje mutacija, kako bismo to osigurali sve su mutacije ubijene, kao što možemo vidjeti u PITest izvješću generiranom u ciljnom direktoriju.

  • 100% pokrivenost linije: 7/7
  • 100% pokrivenost mutacije: 8/8

7. Konfiguracija PITest testova

Testiranje mutacija ponekad može biti veliko, pa moramo postaviti ispravnu konfiguraciju kako bismo poboljšali učinkovitost testova. Možemo se poslužiti targetClasses tag, da definira popis klasa koje će se mutirati. Testiranje mutacije ne može se primijeniti na sve razrede u stvarnom svjetskom projektu, jer će biti dugotrajan i bitan za resurse.

Također je važno definirati mutatore koje planirate koristiti tijekom testiranja mutacija, kako bi se računalni resursi potrebni za provođenje testova sveli na najmanju moguću mjeru:

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

Štoviše, PITest knjižnica nudi razne mogućnosti dostupne prilagodite svoje strategije testiranja, možete odrediti maksimalan broj mutanata koje je klasa uvela pomoću maxMutationsPerClass opcija na primjer. Više detalja o opcijama PITest u službenom Vodič za brzi početak Maven.

8. Zaključak

Imajte na umu da je pokrivenost koda još uvijek važna mjerna vrijednost, ali ponekad nije dovoljna za jamčenje dobro provjerenog koda. Dakle, u ovom smo članku prošli kroz ispitivanje mutacija kao sofisticiraniji način za osiguravanje kvalitete testova i odobravanje testnih slučajeva, koristeći PITest knjižnica.

Također smo vidjeli kako analizirati osnovna PITest izvješća uz poboljšanje rezultat pokrivenosti mutacije.

Iako testiranje mutacija otkriva nedostatke u kodu, treba ga pametno koristiti, jer je izuzetno skup i dugotrajan postupak.

Primjere u ovom članku možete pogledati na povezanoj stranici GitHub projekt.


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