我刚刚开始将Cobertura集成到我们主要产品的构建过程中,该过程使用Ivy作为依赖关系管理工具。有几个库lib-a
,lib-b
和lib-c
没有测试用例,一个项目依赖于这些库,并包含所有这些库的单元和集成测试。
通常,仪表,运行仪表化测试和生成Cobertura报告都有效。但是,有几个问题:
在仪器测试期间,报告了几个警告(约10个):
Problems instrumenting archive entry: a.b.c.MyClassFoo java.lang.RuntimeException: java.lang.ClassNotFoundException: a.b.c.MyClassBar
然而,报道的课程正在进行中。在仪器结束时,它会报告
Saved information on 364 classes
现在我认为问题可能是,Cobertura有问题 - 检测作为jar文件提供的类文件 - 从jar文件中获取源代码
build.xml中的instrumentation ant任务执行以下操作:
<cobertura-instrument todir="${build.dir}/instrumented-classes">
<includeClasses regex="com\.mycompany.*" />
<instrumentationClasspath>
<path refid="default.test.classpath" />
<pathelement location="${build.classes.dir}" />
</instrumentationClasspath>
</cobertura-instrument>
这应该足够吗?
我想知道,因为报道的警告。所有报告的课程都可以在罐子里找到。
对于第二个问题,我甚至不知道如何将来源作为罐子提供给cobertura-report ...
我试过
<cobertura-report destdir="${build.dir}/coverage">
<fileset dir="${src.dir}">
<include name="**/*.java" />
</fileset>
<ivy:cachefileset conf="runtime-test" type="sources"/>
</cobertura-report>
但它表示不支持cachefileset
。我也尝试使用pathid
,我也无法在cobertura-report
中提供。
我之前是否必须解压缩所有来源(这将非常耗时)然后将它们作为正常fileset
提供?
答案 0 :(得分:1)
好的,在重构我的Cobertura Ant任务时,我能够解决问题,依赖类被报告为0%覆盖率。
首先,我的测试任务包含以下内容:
<junit printsummary="yes" haltonfailure="no">
<classpath>
<pathelement path="${build.test.classes.dir}"/>
<pathelement path="${build.dir}/instrumented-classes"/>
<pathelement path="${build.classes.dir}"/>
<path refid="default.test.classpath"/>
<path refid="cobertura.classpath"/>
</classpath>
(...)
</junit>
问题是,检测常春藤提供的jar文件导致${build.dir}/instrumented-classes
目录中的jar文件。但是,pathelement
应该只查找类文件。所以我添加了一个fileset
来包含已检测的罐子:
<junit printsummary="yes" haltonfailure="no">
<classpath>
<pathelement path="${build.test.classes.dir}"/>
<pathelement path="${build.dir}/instrumented-classes"/>
<fileset dir="${build.dir}/instrumented-classes">
<include name="*.jar" />
</fileset>
<pathelement path="${build.classes.dir}"/>
<path refid="default.test.classpath"/>
<path refid="cobertura.classpath"/>
</classpath>
(...)
</junit>
其他问题仍然存在。