My Jacoco report is showing very little code coverage - java

I am trying to get an idea of how much code coverage I have with some unit tests in Scala and with the source code in Java(tests and code are in different packages). When I run the Jacoco report, it is showing only 4 percent code coverage.
When I go take a look at the report, it shows 0 percent for a lot of files that I have created tests for. What I suspect is that the unit tests are not being included in the report, maybe since all of the test class files are in the target/test-classes directory.
I have tried including the includeTests tag but that didn't have any effect.
Here is how the plugin looks like in the pom:
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>${jacoco-maven-plugin.version}</version>
<configuration>
<includeTests>true</includeTests>
<!--<includes>
<include>**/test-classes/**</include>
</includes>-->
<excludes>
<exclude>**/dto/**</exclude>
<exclude>**/exceptions/**</exclude>
</excludes>
</configuration>
<executions>
<execution>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>report</id>
<phase>prepare-package</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
Right now I have commentted out the include tag becasue if I include it, the test compiles with 0 classes. How else can I can include the target/test-classes directory?
Sorry if this is a simple fix, I'm very new with unit testing and Jacoco. Thanks!

This is my personal setup. It's a bit messy and I'm still working out some parts of it but it works for me. You could try this.
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.4</version>
<executions>
<execution>
<id>default-prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>default-report</id>
<phase>prepare-package</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
<execution>
<id>default-check</id>
<goals>
<goal>check</goal>
</goals>
<configuration>
<rules>
<rule>
<element>BUNDLE</element>
<limits>
<limit>
<counter>COMPLEXITY</counter>
<value>COVEREDRATIO</value>
<minimum>0.20</minimum>
</limit>
</limits>
</rule>
</rules>
</configuration>
</execution>
</executions>
</plugin>

Related

Not generate jacoco-ut.exec coverage report

Java 1.8. Maven 3.8. I want to generate coverage report of junit tests. So I use this in my pom.xml
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.4.201502262128</version>
<executions>
<execution>
<id>prepare-ut-agent</id>
<phase>process-test-classes</phase>
<goals>
<goal>prepare-agent</goal>
</goals>
<configuration>
<destFile>${project.build.directory}/jacoco-ut.exec</destFile>
<propertyName>jacoco.agent.ut.arg</propertyName>
<append>true</append>
</configuration>
</execution>
<execution>
<id>prepare-it-agent</id>
<phase>pre-integration-test</phase>
<goals>
<goal>prepare-agent</goal>
</goals>
<configuration>
<destFile>${project.build.directory}/jacoco-it.exec</destFile>
<propertyName>jacoco.agent.it.arg</propertyName>
<append>true</append>
</configuration>
</execution>
</executions>
</plugin>
Open terminal and run test like this:
mvn test -Dtest=com.my_company.myproject.ComponentServiceTest
Tests success finish. But coverage report to generate. File jacoco-it.exec is not exist in target folder
The pom.xml is missing the report goal as mentioned in the comment by #rajani-b.
Here is the configuration for the report goal.
<execution>
<id>report</id>
<goals>
<!--
Generate coverage reports in xml,csv,html formats
in folder ${project.build.directory}/site/jacoco
-->
<goal>report</goal>
</goals>
</execution>
Below is the complete <plugin> section for jacoco-maven-plugin for reference.
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.4.201502262128</version>
<executions>
<execution>
<id>prepare-ut-agent</id>
<phase>process-test-classes</phase>
<goals>
<goal>prepare-agent</goal>
</goals>
<configuration>
<propertyName>jacoco.agent.ut.arg</propertyName>
<append>true</append>
</configuration>
</execution>
<execution>
<id>prepare-it-agent</id>
<phase>pre-integration-test</phase>
<goals>
<goal>prepare-agent</goal>
</goals>
<configuration>
<propertyName>jacoco.agent.it.arg</propertyName>
<append>true</append>
</configuration>
</execution>
<execution>
<id>prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>report</id>
<goals>
<!--
Generate coverage reports in xml,csv,html formats
in folder ${project.build.directory}/site/jacoco
-->
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>

Code coverage for test framework written in Node and application is in Java

I have written my test framework which is a node service and the application is written in Java. I want to understand how to get code coverage? I have tried to use Jacoco but it did not generate any coverage details. Is there any dependency for node projects for jacoco that I should use ? Or is there any other way of generating code coverage for this type of scenario ?
I have added dependencies to pom.xml as here
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.1.201405082137</version>
<executions>
<execution>
<id>default-prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>default-report</id>
<phase>prepare-package</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
<execution>
<id>default-check</id>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
<configuration>
<dataFile>target/jacoco.exec</dataFile>
<outputDirectory>/target/jacoco</outputDirectory>
</configuration>
</plugin>

Code Coverage for Cucumber Tests using Jacoco

I am trying to integrate Jacoco to get the code coverage for my Cucumber tests using Maven. Following is my project structure:
-src-main-java-Pages
-src-main-java-Helper
-src-test-java-resources-features
-src-test-java-Steps
Following is the Jacoco configuration in my POM.xml
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.2</version>
<configuration>
<destFile>${basedir}/target/coverage-reports/jacoco.exec</destFile>
<dataFile>${basedir}/target/coverage-reports/jacoco.exec</dataFile>
<outputDirectory>${basedir}/target/coverage-reports/jacoco</outputDirectory>
</configuration>
<executions>
<execution>
<id>prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>report</id>
<goals>
<goal>report</goal>
</goals>
</execution>
<execution>
<id>check</id>
<goals>
<goal>check</goal>
</goals>
<configuration>
<rules>
<rule>
<element>PACKAGE</element>
<includes>
<include>**/*Steps.*</include>
</includes>
</rule>
<rule>
<element>PACKAGE</element>
<excludes>
<exclude>**/*Pages.*</exclude>
<exclude>**/*Page.*</exclude>
</excludes>
</rule>
</rules>
</configuration>
</execution>
</executions>
</plugin>
I am able to generate the code coverage report. However, in the report, it covers all the classes in the -src-main packages. As per different google researches and SO posts, I tried to modify my POM to exclude Pages and include only Steps in my code coverage report. But somehow, it keeps on displaying all the files in the main package.
Am I taking the wrong approach? I just want to create a report which does code coverage for only the tests that I execute rather than all the files in the main package.
See https://maven.apache.org/guides/mini/guide-configuring-plugins.html - you specify exclusions in configuration of
<execution>
<id>check</id>
<goals>
<goal>check</goal>
but not in configuration of
<execution>
<id>report</id>
<goals>
<goal>report</goal>
so it has effect on check, but not on report.

Jacoco Integration test report is not correct

I have a restful api and the workflow of integration test cases is that we build the project -> Then start a tomcat using maven on a predefined port -> Deploy the built war on that tomcat instance and then maven runs the integration test cases with respect to that war. Build is succeeded only if the unit as well as integration test cases pass. I want to generate code coverage report for integration as well unit test cases. Though Jacoco is correctly generating report for unit test cases but it is not generating the correct report for integration test cases . As in all the folders are shown with zero percent coverage.
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.4.201502262128</version>
<executions>
<execution>
<id>default-report</id>
<phase>prepare-package</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
<execution>
<id>pre-unit-test</id>
<goals>
<goal>prepare-agent</goal>
</goals>
<configuration>
<destFile>${basedir}/target/jacoco-unit.exec</destFile>
<propertyName>surefireArgLine</propertyName>
</configuration>
</execution>
<execution>
<id>post-unit-test</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
<configuration>
<dataFile>${basedir}/target/jacoco-unit.exec</dataFile>
<append>true</append>
</configuration>
</execution>
<execution>
<id>pre-integration-test</id>
<phase>pre-integration-test</phase>
<goals>
<goal>prepare-agent-integration</goal>
</goals>
<configuration>
<destFile>${basedir}/target/jacoco-it.exec</destFile>
<propertyName>failsafeArgLine</propertyName>
</configuration>
</execution>
<execution>
<id>post-integration-test</id>
<phase>verify</phase>
<goals>
<goal>report</goal>
</goals>
<configuration>
<includes>
</includes>
<dataFile>${basedir}/target/jacoco-it.exec</dataFile>
<outputDirectory>${basedir}/target/site/jacoco-it</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
On failsafe plugin :
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.17</version>
<configuration>
<includes>
<include>**/*IT.java</include>
</includes>
<argLine>${failsafeArgLine}</argLine>
<skipTests>false</skipTests>
</configuration>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
<configuration>
<includes>
<include>**/*IT.java</include>
</includes>
</configuration>
</execution>
</executions>
</plugin>

Jetty sealed javax.naming

I have a legacy application using struts 1 and torque. I have made an effort last week to refactor it a bit and tried to decouple some groups of classes and introduced unit tests. As I can not test all areas of the application through unit tests, I wanted to add HtmlUnit tests.
To to this, I added the maven-failsafe-plugin and jetty to my project, like so:
<build>
...
<plugins>
...
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.16</version>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
<stopPort>8005</stopPort>
<stopKey>STOP</stopKey>
<contextPath>/</contextPath>
</configuration>
<executions>
<execution>
<id>start-jetty</id>
<phase>pre-integration-test</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<scanIntervalSeconds>0</scanIntervalSeconds>
<daemon>true</daemon>
</configuration>
</execution>
<execution>
<id>stop-jetty</id>
<phase>post-integration-test</phase>
<goals>
<goal>stop</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
The problem is, that when I run mvn verify, I get the following exception:
java.lang.SecurityException: sealing violation: can't seal package javax.naming: already loaded
I am using javax.naming in some classes, but can't find any dependency that overrides javax.naming!
Does anybody have a clue about how to figure this problem out?

Categories