我正在尝试在包含自动生成代码的项目上设置Cobertura代码覆盖率,该代码是使用Freemarker从模板创建的(显式地,使用fmpp maven插件)。
然后我对这些自动生成的类进行了单元测试。
然而,在计算代码覆盖率时,Cobertura没有考虑这些单元测试。自动生成的类出现在报告中,但这些类的覆盖率始终为0%。
首先,Cobertura是否有一些我缺失的配置?
此SO question似乎一直在问类似的问题,但接受的答案是:
不应测试生成的代码,也不应在代码覆盖率指标中使用。
这对我来说似乎不对 - 我想我应该测试生成的代码(测试生成的类和模板),我想知道这个生成代码的代码覆盖率。
那么,第二,是否有充分的理由不应该测试生成的代码?
编辑:提及我使用cobertura-maven-plugin使用cobertura也是相关的。因此,我不确定问题是cobertura还是maven-plugin(或我的配置......)
N.b。要清楚,我不是要求自动生成测试类。这些是手动编写的,用于测试从模板创建的类。
答案 0 :(得分:1)
这是报告迄今为止我学到的内容的部分答案......
首先,我看看cobertura是如何工作的,它似乎如下:
所以,我的第一个想法是自动生成的类没有正确检测。但是,在反编译这些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
个文件