2013-11-21 33 views
4

我正在编写一个多模块应用程序。一些模块只是基本的Java库,然后包含在Web应用程序的WAR中。客户端/服务器Web应用程序的代码覆盖范围

我想运行在下列情况下的代码覆盖率:

  • 我通过通过Maven的启动嵌入式的Jetty运行web应用程序。

  • 我有测试正在执行对web应用程序的HTTP请求。

  • 我想得到的代码涵盖在Web应用程序和测试。

这是可能的吗?如何用Cobertura,JaCoCo或Emma实现?据我所知,在这种情况下,代码覆盖率将只覆盖客户端代码。我对么?

+0

出于兴趣:你能解释你如何执行测试吗?这是否会自动工作,或者您是否需要手动测试码头和来电者? – PepperBob

+0

好吧,目前我有一个基于Maven的项目,它启动了一个Web模块的Jetty。代码覆盖率使用Sonar插件在Jenkins中执行。测试是JUnit 4.x.如果可能的话,我想我需要使用JaCoCo。我是否需要为此使用一些Maven插件,还是会被Sonar拾起...? – carlspring

+0

项目中的JaCoCo Maven插件将启动代理,Jenkins中的生成后操作将对Sonar进行测试。这就是它在单元测试中的作用。 – PepperBob

回答

2

我想如果您能够将JaCoCo代理附加到运行jetty的jvm,那么它应该能够测量在您针对您的webapp运行集成测试时所调用的代码。所以你应该得到一个统计数据来显示你的代码覆盖率。

有一个JaCoCo Maven插件 - 尽管我不确定这是否会对你有帮助。在单元测试中使用它。

编辑:发现了一个博客,帖子,似乎在指向这里的正确方向 Measure Code Coverage by Integration Tests with Sonar

1

您可以使用Jacoco插件生成代码覆盖率下面是我用JUnit测试代码覆盖插件配置。

<plugin> 
       <groupId>org.jacoco</groupId> 
       <artifactId>jacoco-maven-plugin</artifactId> 
       <version>0.5.10.201208310627</version> 
       <configuration> 
        <skip>${maven.test.skip}</skip> 
        <output>file</output> 
        <append>true</append> 
       </configuration> 
       <executions> 
        <execution> 
         <id>jacoco-initialize</id> 
         <goals> 
          <goal>prepare-agent</goal> 
         </goals> 
        </execution> 
        <execution> 
         <id>jacoco-site</id> 
         <phase>verify</phase> 
         <goals> 
          <goal>report</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 

注:你可以在Maven中获得生命周期不是盖的错误,而使用Eclipse,一种方法是使用你的插件管理明确提到的生命周期。我安装了从市场上它解决了我的问题jacoco插件

+0

我不使用Eclipse。我更感兴趣的是在CI服务器上运行它们时生成报告(我的情况是Jenkins)并将结果存储到Sonar。这项工作会......? – carlspring

+0

不确定。我使用eclipse /命令提示符。所以在命令提示符下运行mvn测试,它将在运行测试用例的同时在fork到jvm之后生成jacoco exec文件。然后运行mvn jacoco:报告以html格式生成报告 –

1

这里是我如何实现它

假设你已经有一个最小的pom.xml配置:

<plugin> 
    <groupId>org.jacoco</groupId> 
    <artifactId>jacoco-maven-plugin</ 
    <version>0.7.4.201502262128</vers 
</plugin> 
  1. Download JaCoCo's agent并将jacocoagent.jar复制到合适的位置(例如$HOME/tools/jacocoagent0.7.4.jar

  2. 附上JaCoCo的代理Maven的JVM通过:

    export MAVEN_OPTS="$MAVEN_OPTS \ 
    -javaagent:$HOME/tools/jacocoagent0.7.4.jar=output=tcpserver,port=6300" 
    
  3. 例如运行嵌入式Jetty服务器应用程序mvn jetty:run

  4. 运行的集成测试

  5. 在另一个shell,倾倒并通过mvn jacoco:dump jacoco:report

  6. 报告./target/site/index.html打开报表(默认)

1

我们有类似的情景集成测试在码头服务器上运行。我们还需要所有测试单元和集成的综合报告。我们实现的解决方案是运行分支jetty并将jvoco的javaagent细节传递给jvmargs。我们的代码覆盖率报告涵盖了所有其余的api和服务层java代码。 为jacoco

<plugin> 
    <groupId>org.jacoco</groupId> 
    <artifactId>jacoco-maven-plugin</artifactId> 
    <version>${jacoco-maven-plugin.version}</version> 
    <configuration> 
     <append>true</append> 
    </configuration> 
    <executions> 
     <execution> 
      <id>prepare-test</id> 
      <goals> 
       <goal>prepare-agent</goal> 
      </goals> 
      <configuration> 
       <destFile>${project.build.directory}/jacoco.exec</destFile> 
       <propertyName>surefireArgLine</propertyName> 
      </configuration> 
     </execution> 
     <execution> 
      <id>prepare-integration</id> 
      <goals> 
       <goal>prepare-agent-integration</goal> 
      </goals> 
      <configuration> 
       <destFile>${project.build.directory}/jacoco.exec</destFile> 
       <propertyName>failsafeArgLine</propertyName> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

利用上述配置的配置POM我们产生两个单元和集成测试的共同EXEC文件。接下来我们将码头配置为分叉

<plugin> 
    <groupId>org.eclipse.jetty</groupId> 
    <artifactId>jetty-maven-plugin</artifactId> 
    <version>${jetty-maven-plugin.version}</version> 
    <configuration> 
     <stopKey>foo</stopKey> 
     <stopPort>9999</stopPort> 
     <webApp> 
      <contextPath>/myway</contextPath> 
      <descriptor>src/main/webapp/WEB-INF/web.xml</descriptor> 
     </webApp> 
     <!-- passing the jacoco plugin as a jvmarg --> 
     <jvmArgs>${failsafeArgLine}</jvmArgs> 
    </configuration> 
    <executions> 
     <execution> 
      <id>start-jetty</id> 
      <phase>pre-integration-test</phase> 
      <configuration> 
       <daemon>true</daemon> 
       <waitForChild>false</waitForChild> 
      </configuration> 
      <goals> 
       <goal>run-forked</goal> 
      </goals> 
     </execution> 
     <execution> 
      <id>stop-jetty</id> 
      <phase>post-integration-test</phase> 
      <goals> 
       <goal>stop</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

这将启动码头与jvmargs单独的jvm。最后,我们在pom的报告标签中生成报告。我们注意到将报告添加到构建插件并未捕获码头运行的集成测试。

<reporting> 
    </plugins> 
    <plugin> 
     <groupId>org.jacoco</groupId> 
     <artifactId>jacoco-maven-plugin</artifactId> 
     <version>${jacoco-maven-plugin.version}</version> 
     <reportSets> 
      <reportSet> 
       <id>jacoco-report</id> 
       <reports> 
        <report>report</report> 
       </reports> 
      </reportSet> 
     </reportSets> 
     </plugin> 
    </plugins> 
</reporting> 

该报告可在目标/网站/ jacoco/index.html的访问,交替,你可以在命令行中运行它。

MVN jacoco:报告

希望它能帮助。

相关问题