Uvod u JaCoCo

1. Pregled

Pokrivenost kodom je softverska metrika koja se koristi za mjerenje koliko se linija našeg koda izvršava tijekom automatiziranih testova.

U ovom ćemo članku prošetati kroz neke praktične aspekte upotrebe JaCoCo - generator izvještaja o pokrivenosti koda za Java projekte.

2. Konfiguracija Maven

Da bismo pokrenuli i pokrenuli JaCoCo, moramo prijaviti ovaj maven dodatak u našem pom.xml datoteka:

 org.jacoco jacoco-maven-plugin 0.7.7.201606060606 report-agent report pripremiti paket report 

Ovdje navedena veza uvijek će vas odvesti do najnovije verzije dodatka u središnjem spremištu maven.

3. Izvješća o pokrivenosti koda

Prije nego što počnemo proučavati mogućnosti pokrivanja koda JaCoCo, moramo imati uzorak koda. Evo jednostavne Java funkcije koja provjerava čita li niz isti naprijed i natrag:

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 jednostavno JUNIT test:

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

Pokretanje testa pomoću JUnit-a automatski će pokrenuti JaCoCo agenta, što će stvoriti izvještaj o pokrivenosti u binarni format u ciljnom direktoriju - cilj / jacoco.exec.

Očito je da izlaz ne možemo interpretirati sami, ali drugi alati i dodaci mogu - na pr. Sonar Qube.

Dobra vijest je da možemo koristiti jacoco: izvještaj cilj kako bi se generirala čitljiva izvješća o pokrivenosti koda u nekoliko formata - npr. HTML, CSV i XML.

Sada možemo pogledati na primjer target / site / jacoco / index.html stranicu kako biste vidjeli kako izgleda generirano izvješće:

Slijedom veze u izvješću - Palindrom.java , možemo provesti detaljniji prikaz za svaku Java klasu:

Imajte na umu da možete izravno upravljati pokrivanjem koda koristeći JaCoCo unutar Eclipsea sa nulta konfiguracija, zahvaljujući dodatku EclEmma Eclipse.

4. Analiza izvješća

Naše izvješće pokazuje 21% pokrivenosti uputama, 17% pokrivenosti poslovnica, 3/5 for ciklomatska složenost i tako dalje.

38 uputa koje je JaCoCo prikazao u izvješću odnosi se na upute bytecode-a za razliku od uobičajenih uputa za Java kod.

Izvješća JaCoCo pomažu vam u vizualnoj analizi pokrivenosti koda pomoću dijamanata s bojama za grane i bojama pozadine za linije:

  • Crveni dijamant znači da tijekom faze ispitivanja nisu korištene grane.
  • Žuti dijamant pokazuje da je kod djelomično pokriven - neke grane nisu korištene.
  • Zeleni dijamant znači da su sve grane vježbane tijekom testa.

Isti kod boje odnosi se na boju pozadine, ali za pokrivanje linija.

JaCoCo uglavnom pruža tri važna mjerila:

  • Pokrivenost linija odražava količinu koda koja je izvršena na temelju broja uputa Java bajt koda koje su pozvali testovi.
  • Pokrivenost podružnica pokazuje postotak izvršenih grana u kodu - obično povezan sa ako / inače i sklopka izjave.
  • Ciklomatična složenost odražava složenost koda davanjem broja staza potrebnih za pokrivanje svih mogućih staza u kodu linearnom kombinacijom.

Da uzmemo trivijalan primjer, ako nema ako ili sklopka izjava u kodu, ciklomatična složenost bit će 1, jer nam je potreban samo jedan put izvršenja da pokrijemo cijeli kôd.

Općenito ciklomatična složenost odražava broj testnih slučajeva koje moramo provesti kako bismo pokrili cijeli kôd.

5. Raščlamba koncepta

JaCoCo radi kao Java agent, odgovorno je za instrumentiranje bajtkoda tijekom izvođenja testova. JaCoCo analizira svaku uputu i pokazuje koje se linije rade tijekom svakog testa.

Za prikupljanje podataka o pokrivenosti, JaCoCo koristi ASM za instrumentaciju koda u letu, primajući događaje od Sučelje alata JVM u procesu:

Također je moguće pokrenuti JaCoCo agent u načinu poslužitelja, u ovom slučaju možemo pokrenuti naše testove jacoco: odlagalište kao cilj, pokretanje zahtjeva za odvoz.

Možete pratiti službenu vezu s dokumentacijom za detaljnije detalje o dizajnu JaCoCo.

6. Ocjena pokrivenosti koda

Sad kad znamo malo o tome kako JaCoCo radi, poboljšajmo našu ocjenu pokrivenosti koda.

Da bismo postigli 100% pokrivenosti koda, moramo uvesti testove koji pokrivaju dijelove koji nedostaju prikazani u početnom izvješću:

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

Sada možemo reći da imamo dovoljno testova da pokrijemo cijeli naš kôd, ali da bismo se u to uvjerili, pokrenimo naredbu Maven mvn jacoco: izvještaj objaviti izvještaj o pokrivenosti:

Kao što vidite, sve linije / grane / staze u našem kodu su u potpunosti pokrivene:

U stvarnom svijetu, a kako razvoj ide dalje, moramo pratiti rezultat pokrivanja koda.

JaCoCo nudi jednostavan način prijavljivanja minimalni zahtjevi to bi trebalo ispuniti, u suprotnom gradnja neće uspjeti.

To možemo učiniti dodavanjem sljedećeg ček cilj u našem pom.xml datoteka:

 jacoco-check check PAKETNA LINIJA POKRIVENO 0,50 

Kao što vjerojatno možete pretpostaviti, ovdje ograničavamo minimalnu ocjenu za pokrivenost linija na 50%.

The jacoco: ček cilj je vezani do provjeriti, tako da možemo pokrenuti naredbu Maven - mvn čista provjera kako bi provjerili poštuju li se pravila ili ne. Zapisnici će prikazivati ​​nešto poput:

[POGREŠKA] Nije uspjelo izvršiti cilj org.jacoco: jacoco-maven-plugin: 0.7.7.201606060606: provjera (jacoco-check) na testiranju mutacija projekta: Provjere pokrivenosti nisu ispunjene.

7. Zaključak

U ovom smo članku vidjeli kako koristiti dodatak JaCoCo maven za generiranje izvještaja o pokrivenosti koda za Java projekte.

Imajte na umu, 100% pokrivenost kodom nije nužno odražava učinkovito testiranje, jer odražava samo količinu koda koja se vježba tijekom testova. U prethodnom članku smo razgovarali o tome ispitivanje mutacija kao sofisticiraniji način za praćenje učinkovitosti testova u usporedbi s običnim pokrivenost kodom.

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