Cobertura代码覆盖Freemarker自动生成的代码

时间:2012-06-22 15:46:33

标签: java code-coverage freemarker cobertura fmpp

我正在尝试在包含自动生成代码的项目上设置Cobertura代码覆盖率,该代码是使用Freemarker从模板创建的(显式地,使用fmpp maven插件)。

然后我对这些自动生成的类进行了单元测试。

然而,在计算代码覆盖率时,Cobertura没有考虑这些单元测试。自动生成的类出现在报告中,但这些类的覆盖率始终为0%。

首先,Cobertura是否有一些我缺失的配置?

SO question似乎一直在问类似的问题,但接受的答案是:

  

不应测试生成的代码,也不应在代码覆盖率指标中使用。

这对我来说似乎不对 - 我想我应该测试生成的代码(测试生成的类和模板),我想知道这个生成代码的代码覆盖率。

那么,第二,是否有充分的理由不应该测试生成的代码?

编辑:提及我使用cobertura-maven-plugin使用cobertura也是相关的。因此,我不确定问题是cobertura还是maven-plugin(或我的配置......)

N.b。要清楚,我不是要求自动生成测试类。这些是手动编写的,用于测试从模板创建的类。

1 个答案:

答案 0 :(得分:1)

这是报告迄今为止我学到的内容的部分答案......

首先,我看看cobertura是如何工作的,它似乎如下:

  • 修改了项目java类,以包含对整个代码中的TouchCollector.touch(...)(和类似方法)的调用,并进行编译。 (这是仪表任务。)
  • 测试在这些cobertura编译的类上运行,TouchCollector记录测试中已到达项目类的哪些行。此信息记录在cobertura.ser数据文件中。
  • cobertura / report任务读取cobertura.ser数据文件并生成html报告。

所以,我的第一个想法是自动生成的类没有正确检测。但是,在反编译这些cobertura类文件后,我可以确认正常和自动生成的类都已正确检测。

另外,我可以确认所有测试 - 包括自动生成的类的测试都在运行。

然后,我的下一个问题是为什么在运行测试时,自动生成的类没有被“触摸”。进一步的调查表明,当编译测试类(即测试编译)时,自动生成的类被添加到项目/目标/测试类中。打印自动生成的类(例如System.out.println(MyAutoClass.class.getResource("MyAutoClass.class"));)的文件位置的简单测试证实,当测试由cobertura运行时,它使用test-classes文件夹中的自动生成的类,而不是cobertura编译后的已编译类。

然后,接下来的问题是如何防止这些类被添加到test-classes文件夹中?好吧,一种方法是排除自动生成的类被编译。这可以通过仅包括测试类来完成 - 例如:

<plugin>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>x.y.z</version>
  <configuration>
    <testIncludes>
      <testInclude>**/*Test.java</testInclude>
    </testIncludes>
  </configuration>
</plugin>

或者应该可以排除自动生成的类(这是首选的) - 类似于以下内容:

<testExcludes>
  <testExclude>**/generated-sources/fmpp/**/*.java</testExclude>
</testExcludes>

然而,这不起作用,我不太清楚如何让它发挥作用。

另一种方法是将所有自动生成的类移动到一个包中,然后可能会出现以下内容:

<testExcludes>
  <testExclude>com/organisation/project/auto/**/*.java</testExclude>
</testExcludes>

最后,我选择了仅包含*Test.java个文件