Inleiding tot JaCoCo

1. Overzicht

Code dekking is een softwarestatistiek die wordt gebruikt om te meten hoeveel regels van onze code worden uitgevoerd tijdens geautomatiseerde tests.

In dit artikel gaan we door enkele praktische aspecten van het gebruik lopen JaCoCo - een generator voor codedekkingsrapporten voor Java-projecten.

2. Maven-configuratie

Om met JaCoCo aan de slag te gaan, moeten we deze maven-plug-in declareren in ons pom.xml het dossier:

 org.jacoco jacoco-maven-plugin 0.7.7.201606060606 rapport van agent voorbereiden rapport van pakket voorbereiden 

De link die hier eerder is gegeven, zal u altijd naar de laatste versie van de plug-in in de centrale opslagplaats van maven leiden.

3. Codedekkingsrapporten

Voordat we gaan kijken naar de codedekkingsmogelijkheden van JaCoCo, hebben we een codevoorbeeld nodig. Hier is een eenvoudige Java-functie die controleert of een string hetzelfde achterwaarts en voorwaarts leest:

openbare boolean isPalindrome (String inputString) {if (inputString.length () == 0) {return true; } anders {char firstChar = inputString.charAt (0); char lastChar = inputString.charAt (inputString.length () - 1); String mid = inputString.substring (1, inputString.length () - 1); return (firstChar == lastChar) && isPalindrome (mid); }}

Alles wat we nu nodig hebben, is een simpele JUnit test:

@Test openbare leegte whenEmptyString_thenAccept () {Palindrome palindromeTester = nieuwe Palindrome (); assertTrue (palindromeTester.isPalindrome ("")); }

Door de test uit te voeren met JUnit wordt de JaCoCo-agent automatisch in beweging gezet, dus het zal een dekkingsrapport aanmaken in binair formaat in de doelmap - target / jacoco.exec.

Het is duidelijk dat we de uitvoer niet alleen kunnen interpreteren, maar andere tools en plug-ins kunnen dat wel, bijv. Sonar Qube.

Het goede nieuws is dat we de jacoco: verslag doel om leesbare codedekkingsrapporten in verschillende formaten te genereren - bijv. HTML, CSV en XML.

We kunnen nu bijvoorbeeld een kijkje nemen bij doel / site / jacoco / index.html pagina om te zien hoe het gegenereerde rapport eruitziet:

Volg de link in het rapport - Palindrome.java kunnen we voor elke Java-klasse een meer gedetailleerde weergave bekijken:

Merk op dat u codedekking eenvoudig kunt beheren met JaCoCo binnen Eclipse met nul configuratie, dankzij de EclEmma Eclipse-plug-in.

4. Rapportanalyse

Ons rapport toont 21% dekking van instructies, 17% dekking van vestigingen, 3/5 voor cyclomatische complexiteit enzovoorts.

De 38 instructies die JaCoCo in het rapport laat zien, verwijzen naar de bytecode instructies in tegenstelling tot gewone Java-code-instructies.

JaCoCo-rapporten helpen u de codedekking visueel te analyseren door diamanten te gebruiken met kleuren voor takken en achtergrondkleuren voor lijnen:

  • Rode diamant betekent dat er tijdens de testfase geen vertakkingen zijn uitgeoefend.
  • Gele diamant laat zien dat de code gedeeltelijk bedekt is - sommige takken zijn niet uitgeoefend.
  • Groene diamant betekent dat alle takken tijdens de test zijn uitgeoefend.

Dezelfde kleurcode is van toepassing op de achtergrondkleur, maar voor lijndekking.

JaCoCo biedt voornamelijk drie belangrijke statistieken:

  • Lijnen dekking geeft de hoeveelheid code weer die is uitgeoefend op basis van het aantal Java-bytecode-instructies dat door de tests is aangeroepen.
  • Dekking van vestigingen toont het percentage uitgeoefende branches in de code - meestal gerelateerd aan als / anders en schakelaar verklaringen.
  • Cyclomatische complexiteit weerspiegelt de complexiteit van code door het aantal paden te geven dat nodig is om alle mogelijke paden in een code te bestrijken via lineaire combinatie.

Om een ​​triviaal voorbeeld te nemen, als er geen is als of schakelaar instructies in de code, zal de cyclomatische complexiteit 1 zijn, aangezien we slechts één uitvoeringspad nodig hebben om de volledige code te dekken.

Over het algemeen weerspiegelt de cyclomatische complexiteit het aantal testgevallen dat we moeten implementeren om de volledige code te dekken.

5. Uitsplitsing van het concept

JaCoCo werkt als een Java-agent, het is verantwoordelijk voor instrumenteren van de bytecode tijdens het uitvoeren van de tests. JaCoCo boort in elke instructie en laat zien welke lijnen tijdens elke test worden geoefend.

Om dekkingsgegevens te verzamelen, gebruikt JaCoCo ASM voor on-the-fly code-instrumentatie, waarbij gebeurtenissen worden ontvangen van de JVM Tool-interface in het proces:

Het is ook mogelijk om de JaCoCo-agent in servermodus te laten draaien, in dit geval kunnen we onze tests met uitvoeren jacoco: dump als doel, om een ​​dumpverzoek te initiëren.

U kunt de officiële documentatielink volgen voor meer diepgaande details over JaCoCo-ontwerp.

6. Score voor codedekking

Nu we een beetje weten hoe JaCoCo werkt, kunnen we onze codedekkingsscore verbeteren.

Om 100% codedekking te bereiken, moeten we tests introduceren die de ontbrekende delen dekken die in het eerste rapport worden getoond:

@Test openbare leegte whenPalindrom_thenAccept () {Palindrome palindromeTester = nieuwe Palindrome (); assertTrue (palindromeTester.isPalindrome ("middag")); } @Test openbare leegte whenNearPalindrom_thanReject () {Palindrome palindromeTester = nieuwe Palindrome (); assertFalse (palindromeTester.isPalindrome ("neon")); }

Nu kunnen we zeggen dat we genoeg tests hebben om onze volledige code te dekken, maar om er zeker van te zijn, laten we het Maven-commando uitvoeren mvn jacoco: rapport om het dekkingsrapport te publiceren:

Zoals je kunt zien, zijn alle lijnen / takken / paden in onze code volledig bedekt:

In real-world projecten, en naarmate de ontwikkelingen verder gaan, moeten we de codedekkingsscore bijhouden.

JaCoCo biedt een eenvoudige manier van aangifte minimumvereisten waaraan moet worden voldaan, anders mislukt de build.

We kunnen dat doen door het volgende toe te voegen controleren doel in ons pom.xml het dossier:

 jacoco-check check VERPAKKINGSLIJN GEDEKT RATIO 0.50 

Zoals u waarschijnlijk wel kunt raden, beperken we hier de minimumscore voor lijndekking tot 50%.

De jacoco: check doel is gebonden naar verifiëren, dus we kunnen het Maven-commando uitvoeren - mvn schoon verifiëren om te controleren of de regels worden gerespecteerd of niet. De logboeken zullen iets tonen als:

[FOUT] Kan doel org.jacoco: jacoco-maven-plugin: 0.7.7.201606060606: check (jacoco-check) bij projectmutatietesten niet uitvoeren: er is niet voldaan aan de dekkingscontroles.

7. Conclusie

In dit artikel hebben we gezien hoe u de JaCoCo maven-plug-in kunt gebruiken om codedekkingsrapporten voor Java-projecten te genereren.

Houd er echter rekening mee: 100% codedekking weerspiegelt niet noodzakelijk effectief testen, omdat het alleen de hoeveelheid code weergeeft die tijdens tests wordt gebruikt. In een vorig artikel hebben we het gehad over mutatie testen als een meer geavanceerde manier om de effectiviteit van tests te volgen in vergelijking met gewone code dekking.

U kunt het voorbeeld in dit artikel bekijken in het gekoppelde GitHub-project.