Bevezetés a JaCoCo-ba

1. Áttekintés

Kód lefedettség egy szoftveres metrika, amellyel megmérhetjük, hogy kódunk hány sorát hajtják végre az automatizált tesztek során.

Ebben a cikkben áttekintjük a használat néhány gyakorlati szempontját JaCoCo - kód lefedettség jelentés generátor Java projektekhez.

2. Maven konfiguráció

Annak érdekében, hogy elindulhassunk a JaCoCo-val, be kell jelentenünk ezt a maven plugint a mi pom.xml fájl:

 org.jacoco jacoco-maven-plugin 0.7.7.201606060606 Prepar-Agent Report Prepar-Pack Report 

Az itt megadott link mindig a maven központi adattárában található plugin legújabb verziójához vezet.

3. Kód lefedettségi jelentések

Mielőtt elkezdenénk vizsgálni a JaCoCo kódfedettségét, rendelkeznünk kell egy kódmintával. Itt van egy egyszerű Java függvény, amely ellenőrzi, hogy egy karakterlánc ugyanazt olvassa hátra és előre:

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űre van szükségünk JUnit teszt:

@Test public void whenEmptyString_thenAccept () {Palindrome palindromeTester = new Palindrome (); assertTrue (palindromeTester.isPalindrome ("")); }

A teszt futtatása a JUnit segítségével automatikusan elindítja a JaCoCo ügynököt, így lefedettségi jelentést készít a bináris formátum a célkönyvtárban - target / jacoco.exec.

Nyilvánvalóan nem tudjuk egyedül értelmezni a kimenetet, de más eszközök és bővítmények igen - pl. Szonár Qube.

A jó hír az, hogy használhatjuk a jacoco: jelentés cél, hogy több formátumban olvasható kód lefedettségi jelentéseket hozzon létre - pl. HTML, CSV és XML.

Most például megnézhetjük target / site / jacoco / index.html oldalon megtekintheti, hogy néz ki a létrehozott jelentés:

A jelentés linkjét követve - Palindrome.java , részletesebb nézetet készíthetünk minden Java osztályról:

Ne feledje, hogy a kód lefedettségét egyszerűen kezelheti a JaCoCo segítségével az Eclipse belsejében nulla konfiguráció, köszönhetően az EclEmma Eclipse beépülő modulnak.

4. Jelentéselemzés

Jelentésünk 21% utasítás lefedettséget, 17% fiók lefedettséget, 3/5-et mutat ciklikus komplexitás stb.

A JaCoCo által a jelentésben bemutatott 38 utasítás a bytecode utasításokat szemben a szokásos Java kód utasításokkal.

A JaCoCo jelentések segítenek vizuálisan elemezni a kód lefedettségét azáltal, hogy az ágakhoz és a vonalakhoz háttérszínnel ellátott gyémántokat használnak:

  • Vörös gyémánt azt jelenti, hogy a tesztfázis során nem végeztek elágazásokat.
  • Sárga gyémánt azt mutatja, hogy a kód részben fedett - egyes ágakat nem gyakoroltak.
  • Zöld gyémánt azt jelenti, hogy a teszt során minden ágat gyakoroltak.

Ugyanaz a színkód vonatkozik a háttérszínre is, de a vonalak lefedettségére.

A JaCoCo főleg három fontos mutatót nyújt:

  • Vonal lefedettség azt a kódmennyiséget tükrözi, amelyet a tesztek által meghívott Java bájtkód utasítások száma alapján gyakoroltak.
  • Ágak lefedettsége a kódban gyakorolt ​​ágak százalékos arányát mutatja - jellemzően a ha más és kapcsoló nyilatkozatok.
  • Ciklikus komplexitás a kód összetettségét tükrözi azáltal, hogy megadja a szükséges útvonalak számát, hogy lineáris kombinációval lefedje a kód összes lehetséges útvonalát.

Triviális példát véve, ha nincs ha vagy kapcsoló utasításokat a kódban, a ciklomatikus bonyolultság 1 lesz, mivel csak egy végrehajtási útvonalra van szükségünk a teljes kód lefedéséhez.

Általában a ciklikus bonyolultság tükrözi a tesztesetek számát, amelyeket végre kell hajtanunk a teljes kód lefedése érdekében.

5. A koncepció bontása

A JaCoCo a-ként fut Java ügynök, ezért felelős a bájtkód instrumentálása a tesztek futtatása közben. A JaCoCo minden utasításba belemerül, és megmutatja, hogy az egyes tesztek mely vonalakat gyakorolják.

A lefedettségi adatok összegyűjtéséhez a JaCoCo az ASM-et használja menet közbeni kódoláshoz, eseményeket fogad a JVM Tool Interface a folyamat:

Lehetséges a JaCoCo ügynök futtatása szerver módban is, ebben az esetben a tesztjeinket futtathatjuk vele jacoco: dump célként egy dump kérelem kezdeményezése.

A JaCoCo tervezésével kapcsolatos részletesebb információkért kövesse a hivatalos dokumentációs linket.

6. Kód lefedettségi pontszám

Most, hogy tudunk egy kicsit a JaCoCo működéséről, javítsuk a kód lefedettségi pontszámunkat.

A 100% -os kód lefedettség elérése érdekében teszteket kell bevezetnünk, amelyek lefedik az eredeti jelentésben bemutatott hiányzó részeket:

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

Most azt mondhatjuk, hogy elegendő tesztünk van a teljes kód lefedésére, de ennek biztosításához futtassuk a Maven parancsot mvn jacoco: beszámoló a lefedettségi jelentés közzétételéhez:

Amint láthatja, kódunk összes sora / elágazása / útja teljesen lefedett:

A valós projektekben, és ahogy a fejlesztések tovább mennek, nyomon kell követnünk a kód lefedettségi pontszámát.

A JaCoCo a deklarálás egyszerű módját kínálja minimális követelmények ennek teljesülnie kell, különben az összeállítás meghiúsul.

Megtehetjük a következők hozzáadásával jelölje be cél a mi pom.xml fájl:

 jacoco-check ellenőrizze a CSOMAGVONAL TAKARÉSZETÉT 0,50 

Ahogy valószínűleg sejteni lehet, itt a vonalak lefedettségének minimális pontszámát 50% -ra korlátozzuk.

A jacoco: csekk a cél az összekötött nak nek igazolja, így futtathatjuk a Maven parancsot - mvn tiszta ellenőrizze ellenőrizni, hogy a szabályokat betartják-e vagy sem. A naplók a következőket mutatják:

[ERROR] Nem sikerült végrehajtani a cél org.jacoco: jacoco-maven-plugin: 0.7.7.201606060606: check (jacoco-check) a projekt mutációs tesztelésén: A lefedettségi ellenőrzések nem teljesültek.

7. Következtetés

Ebben a cikkben azt láthattuk, hogyan lehet a JaCoCo maven beépülő modult felhasználni a kód lefedettségről szóló jelentések generálásához a Java projektekhez.

Ne feledje azonban, A 100% -os kód lefedettség nem feltétlenül tükrözi a hatékony tesztelést, mivel csak a tesztek során gyakorolt ​​kód mennyiségét tükrözi. Egy korábbi cikkünkben erről beszéltünk mutációs tesztelés mint a tesztek hatékonyságának kifinomultabb módja a szokásoshoz képest kód lefedettség.

A cikkben található példát megnézheti a linkelt oldalon GitHub projekt.