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.