2012-06-22 117 views
1

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

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

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

首先,是否有一些我错过的Cobertura配置?

SO question似乎已经问过类似的问题,但接受的答案是:

生成的代码不应该进行测试,不应在代码覆盖率的指标来使用。

这看起来不太合适 - 我想我应该测试生成的代码(测试生成的类和模板),并且我想知道代码覆盖率是如何生成的。

那么,第二,是否有一个很好的理由为什么生成的代码不应该被测试?

编辑:这也是相关的提及,我正在使用cobertura-maven-plugin cobertura。因此,我不确定问题是否与cobertura或Maven插件(或我的配置...)

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

回答

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编译的类已被装备。

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

<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文件