Cobertura在Tomcat中显示0%覆盖WAR的

时间:2016-07-15 17:46:21

标签: java tomcat code-coverage cobertura

我们针对完全部署的Java Web应用程序(除了单元测试)进行了大量自动化测试,并希望跟踪这些测试的代码覆盖率。该应用程序是用Java编写的,可以在Tomcat上运行。我们目前使用Cobertura来跟踪我们的单元测试的覆盖范围,所以我想坚持使用Cobertura。我已经对我们的战争进行了检测,并且能够从coberura.ser文件生成报告,但它始终显示0%的覆盖率。

以下是我要遵循的步骤:

  1. 在正常过程中构建jar并进行战争(无需仪表)。我们的应用程序类被打包到一个jar文件中,然后放在我们部署的战争的lib主管中。
  2. 解包jar和战争
  3. 重新重建,但这次是对班级进行修改。
  4. 将已检测的类复制到解压缩的jar目录中。我这样做是因为仪器似乎没有为没有可运行代码(如接口)的东西输出类文件。
  5. 从解压缩的jar目录
  6. 构建jar
  7. 将新的已检测jar和cobertura.jar添加到解压缩的war目录的lib目录中,并从中构建一个war。
  8. 将新的检测war和coberturaFlush.war添加到tomcat webapps目录
  9. 将cobertura.ser(在检测期间生成)添加到tomcat bin目录
  10. 启动Tomcat
  11. 在应用中执行操作
  12. 在浏览器中点击/ coberturaFlush / flushCobertura。
  13. 停止Tomcat
  14. 使用cobertura-report.bat从cobertura.ser文件生成报告
  15. 这是我迄今为止所尝试的内容:

    • 我确认jar中的类文件引用了cobertura,所以我确信它们已经过检测。
    • 我正在使用coberturaFlush.war,因为当我停止应用程序时,我收到一堆NoClassDefFound错误,因此它看起来不像关闭钩子正常工作。这似乎是一个常见的问题,coberturaFlush似乎是一个合理的解决方法。
    • 我确信Cobertura正在使用正确的.ser文件。当Tomcat启动时,我看到一些文件快速下降到0KB并创建了一个cobertura.ser.lock文件,然后恢复到原始大小并删除了锁定文件。当我调用flushCobertura以及关闭Tomcat时,我发现同样的事情发生了。
    • 我也尝试在调用flush之后使用.ser文件生成报告,但是在我停止Tomcat之前,这也没有用。

    我错过了什么吗?知道为什么Cobertura总是说0%的覆盖率?

    提前致谢。

1 个答案:

答案 0 :(得分:0)

我想你可能在“JAR地狱”。我遇到了同样的问题,并且能够绕过它:

  1. 在webapp环境中包含cobertura.jar文件
  2. 执行将cobertura.jar文件复制到Tomcat公共库目录
  3. coberturaFlush正在寻找Tomcat级别的lib;通过在Web应用程序中包含另一个实例,webapp的计数器与整个Tomcat计数器分开。

    另一个替代方案,不是最好的,但它的工作原理是让你的webapp调用Cobertura FAQ中概述的saveGlobalProjectData方法。这两种方法对我有用,但由于我不想在我的应用程序中添加任何特殊代码,所以我选择了第一种。