Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [jetty-users] run-forked and Jacoco integration test coverage

Kris,

Using the "start" goal would be incorrect:  AFAIK you need to start another process to pass the jacoco jvm args into.

So you want to use "run-forked". However, you shouldn't use "waitForChild=true". That will make the whole maven process wait for jetty to run and won't progress until jetty stops. So you want waitForChild=false.  That will kick off the new process (passing in any special jvm args you've specified), and read the output of the process looking for the signal that the process started correctly: it will read up to maxStartupLines looking for that signal. waitForChild=true is ok just for manual debugging purposes, but not for automated test runs.

How do you know the server wasn't starting when you used waitForChild=false? Was there any more output from the plugin?

If you've got a WEB-INF/jetty-web.xml file that will be found and applied to the webapp just before the startup is finished, you should also be trying to use it as a context xml file. In recent versions of the jetty plugin, you've been able to put a lot of configuration onto the <webApp> element instead of requiring a context file, so please have a look at the doco and see if you can do that.

Finally, have a look at your logging configuration for the forked jetty instance: are you trying to log everything to logback (ie including container messaging) or only application messaging? Try configuring logback to write to a log file so you can see what's going on, even if waitForChild=false.

Jan

On 21 January 2017 at 14:33, krisrr3 R <krisrr3@xxxxxxxxxxx> wrote:


Hi guys,

          I initially posted my question on the jacoco forum (https://groups.google.com/d/msg/jacoco/unzcby1_8DY/NbKiq3YGAwAJ), but I was told this forum would be more appropriate.

  

        So let me explain situation

  

          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.

  


Best regards

Kris


_______________________________________________
jetty-users mailing list
jetty-users@xxxxxxxxxxx
To change your delivery options, retrieve your password, or unsubscribe from this list, visit
https://dev.eclipse.org/mailman/listinfo/jetty-users



--
Jan Bartel <janb@xxxxxxxxxxx>
www.webtide.com
Expert assistance from the creators of Jetty and CometD


Back to the top