Integration Test Code Coverage 0%

90 views
Skip to first unread message

kris ramanah

unread,
Jan 17, 2017, 10:02:12 PM1/17/17
to JaCoCo and EclEmma Users
Hi guys,
         
          I am building a Spring based Resful Api which is deployed on Jetty.
 
          I have tried a lot of combinations to get coverage for my integration tests, but nothing has worked so far.
              
          The command I am running is 

           
mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent install


          My pom config is shown below.


<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>${jacoco.maven.plugin.version}</version>

<configuration>
<excludes>
</excludes>
</configuration>
<executions>
<execution>
<id>default-prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
<configuration>
                       <destFile>${project.parent.build.directory}/jacoco.exec</destFile>
                       <excludes>
                           <exclude>**/*Test*</exclude>
                       </excludes>
                       <propertyName>surefireArgLine</propertyName>
                    </configuration>
</execution>
<execution>
                   <id>post-unit-test</id>
                   <goals>
                       <goal>report</goal>
                   </goals>
                   <configuration>
                       <dataFile>${project.parent.build.directory}/jacoco.exec</dataFile>
                       <outputDirectory>${project.parent.reporting.outputDirectory}/jacoco</outputDirectory>
                   </configuration>
               </execution>
<execution>
<id>prepare-agent-integration</id>
<phase>pre-integration-test</phase>
<goals>
<goal>prepare-agent-integration</goal>
</goals>
<configuration>
                       <destFile>${project.parent.build.directory}/jacoco-it.exec</destFile>
                       <excludes>
                           <exclude>**/*Test*</exclude>
                       </excludes>
                       <propertyName>jacoco.agent.itArgLine</propertyName>
                   </configuration>
</execution>
<execution>
                   <id>post-integration-test</id>
                   <phase>verify</phase>
                   <goals>
                       <goal>report-integration</goal>
                   </goals>
                   <configuration>
                       <dataFile>${project.parent.build.directory}/jacoco-it.exec</dataFile>
                       <outputDirectory>${project.parent.reporting.outputDirectory}/jacoco-it</outputDirectory>
                   </configuration>
               </execution>
</executions>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven.surefire.plugin.version}</version>
<configuration>
<includes>
<include>**/*Test*.class</include>
</includes>
<excludes>
<exclude>**/*IT</exclude>
</excludes>
<forkCount>3</forkCount>
    <reuseForks>true</reuseForks>
<argLine>${surefireArgLine} -Xmx1024m -XX:MaxPermSize=256m</argLine>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>${maven.failsafe.plugin.version}</version>
<executions>
<execution>
<id>integration-test</id>
<phase>integration-test</phase>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
<configuration>
<forkCount>3</forkCount>
    <reuseForks>true</reuseForks>
<argLine>${jacoco.agent.itArgLine} -Xmx1024m -XX:MaxPermSize=256m</argLine>
<skipTests>false</skipTests>
<includes>
<include>**/*IT.class</include>
</includes>
<systemPropertyVariables>
</systemPropertyVariables>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>properties-maven-plugin</artifactId>
<version>1.0-alpha-2</version>
<executions>
<execution>
<goals>
<goal>set-system-properties</goal>
</goals>
<phase>pre-integration-test</phase>
<configuration>
<properties>
<property>
<name>logs.output</name>
<value>${project.parent.basedir}/Api/target/logs</value>
</property>
<property>
<name>logs.api.name</name>
<value>a-sample-api</value>
</property>
<property>
<name>logback.configurationFile</name>
<value>${project.parent.basedir}/Api-bundle/config/logback.xml</value>
</property>
<property>
<name>apibundle.dir</name>
<value>${project.parent.basedir}/Api-bundle</value>
</property>
<property>
<name>lib</name>
<value>${project.parent.basedir}/Api/target/dependency/lib</value>
</property>
<property>
<name>org.apache.cxf.Logger</name>
<value>org.apache.cxf.common.logging.Slf4jLogger</value>
</property>
<property>
<name>org.jboss.logging.provider</name>
<value>slf4j</value>
</property>
<property>
<name>org.eclipse.jetty.annotations.maxWait</name>
<value>120</value>
</property>
<property>
<name>application.properties</name>
<value>${project.parent.basedir}/Api-bundle/config/env/application-integrationtest.properties</value>
</property>
<property>
<name>sensitive.properties</name>
<value>${project.parent.basedir}/Api/src/test/resources/sensitive.properties</value>
</property>
<property>
<name>javax.net.ssl.trustStore</name>
<value>${project.parent.basedir}/Api-bundle/config/env/certs.jks</value>
</property>

</properties>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>${jetty.version}</version>
<configuration>
<!-- Ensure context xml is set to significantly increase application startup time -->
<contextXml>${project.parent.basedir}/Api/src/main/webapp/WEB-INF/jetty-web.xml</contextXml>
                    <!--
                        NOTE: To enable SSL locally make sure you the following line below
                        ${project.parent.basedir}/Api-bundle/config/env/jetty-https_ssl-dev.xml
                    -->
                    <jettyXml>${project.parent.basedir}/Api-bundle/config/jetty/jetty.xml,${project.parent.basedir}/Api-bundle/config/env/jetty-http-dev.xml</jettyXml>
                    
<dumpOnStart>true</dumpOnStart>
<scanIntervalSeconds>0</scanIntervalSeconds>
<stopPort>${jetty.stop.port}</stopPort>
<stopKey>${jetty.stop.key}</stopKey>
<stopWait>10</stopWait>
<jvmArgs>${jacoco.agent.itArgLine} -Dlib=${project.parent.basedir}/Api/target/dependency/lib -Dlogback.configurationFile=${project.parent.basedir}/Api-bundle/config/jetty/logback.xml -Dapplication.properties=${project.parent.basedir}/Api-bundle/config/env/application-integrationtest.properties</jvmArgs>

</configuration>
<dependencies>
<dependency>
<groupId>au.com.company.toolkit</groupId>
<artifactId>company-toolkit-logging-jetty</artifactId>
<version>${toolkit.logging.version}</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>start-jetty</id>
<phase>pre-integration-test</phase>
           <goals>
                        <goal>run-forked</goal>
                    </goals>
                    <configuration>
                    <daemon>true</daemon>
                       <waitForChild>true</waitForChild>
                       <maxStartupLines>1000</maxStartupLines>
                   </configuration>
</execution>
<!-- execution>
<id>start-jetty</id>
<phase>pre-integration-test</phase>
           <goals>
                        <goal>start</goal>
                    </goals>
</execution-->
<execution>
<id>stop-jetty</id>
<phase>post-integration-test</phase>
<goals>
<goal>stop</goal>
</goals>
<configuration>
<stopWait>1</stopWait>
<stopPort>${jetty.stop.port}</stopPort>
<stopKey>${jetty.stop.key}</stopKey>
</configuration>
</execution>
</executions>
</plugin>

</plugins>

  • If I use the jetty start goal, my tests run and I get coverage for the unit tests. But integration tests coverage is 0%.

  • I changed it to run-forked, as recommended by a few posts, including this But I could not get it to work. As I launched the build, the server would not even start and I was seeing this in the logs
[INFO] Webapp directory = C:\workspace\Api\src\main\webapp
[INFO] Quickstart generating
[INFO] Started o.e.j.m.p.JettyWebAppContext@13137835{/,file:///C:/workspace/Api/src/main/webapp/,AVAILABLE}{file:///C:/workspace/Api/src/main/webapp/}
[INFO] Stopped o.e.j.m.p.JettyWebAppContext@13137835{/,file:///C:/workspace/Api/src/main/webapp/,UNAVAILABLE}{file:///C:/workspace/Api/src/main/webapp/}
[INFO] Forked process starting

       The whole of the logs were not visible, so I changed the property waitForChild to true, and the end of the logs seemed to indicate something but it was not an error.

[STDOUT] 13:52:24.872 [main] DEBUG org.springframework.jndi.JndiLocatorDelegate - Converted JNDI name [java:comp/env/spring.liveBeansView.mbeanDomain] not found - trying original name [spring.liveBeansView.mbeanDomain]. javax.naming.NameNotFoundException; remaining name 'spring.liveBeansView.mbeanDomain'
[STDOUT] 13:52:24.872 [main] DEBUG org.springframework.jndi.JndiTemplate - Looking up JNDI object with name [spring.liveBeansView.mbeanDomain]
[STDOUT] 13:52:24.872 [main] DEBUG org.springframework.jndi.JndiPropertySource - JNDI lookup for name [spring.liveBeansView.mbeanDomain] threw NamingException with message: null. Returning null.
[STDOUT] 13:52:24.873 [main] DEBUG org.springframework.core.env.PropertySourcesPropertyResolver - Could not find key 'spring.liveBeansView.mbeanDomain' in any property source


     I guess my questions are :
  1. Can I get the coverage to work with jetty start goal?
  2. What could help me investigate the issue I am facing with run-forked?

Thanks a lot for your time.

Evgeny Mandrikov

unread,
Jan 18, 2017, 2:31:57 PM1/18/17
to JaCoCo and EclEmma Users
Hi,

  1. Can I get the coverage to work with jetty start goal?

As described in documentation of "jacoco:prepare-agent" ( http://www.jacoco.org/jacoco/trunk/doc/prepare-agent-mojo.html ) - it simply prepares property that should be passed to JVM to use JaCoCo Java Agent ( http://www.jacoco.org/jacoco/trunk/doc/agent.html ).  "jetty:start" does not start new Java process, so there is no way it can work with JaCoCo Java Agent.

You can have a look on offline instrumentation with "jacoco:instrument" ( http://www.jacoco.org/jacoco/trunk/doc/instrument-mojo.html ) and "jacoco:restore-instrumented-classes" ( http://www.jacoco.org/jacoco/trunk/doc/restore-instrumented-classes-mojo.html ) , but it has its own drawbacks compared to agent ( http://www.jacoco.org/jacoco/trunk/doc/offline.html ).

  1. What could help me investigate the issue I am facing with run-forked?
As this is solely about usage of "jetty:run-forked", I would advice to ask Jetty Maven Plugin community/developers.

Hope this helps,
Evgeny

kris ramanah

unread,
Jan 19, 2017, 4:53:04 PM1/19/17
to JaCoCo and EclEmma Users
Thanks mate...I'll do that
Reply all
Reply to author
Forward
This conversation is locked
You cannot reply and perform actions on locked conversations.
0 new messages