如何让Cobertura和Ivy一起工作?

时间:2013-06-27 09:50:05

标签: ant ivy cobertura

我刚刚开始将Cobertura集成到我们主要产品的构建过程中,该过程使用Ivy作为依赖关系管理工具。有几个库lib-alib-blib-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

  • 查看报告时,它会显示所有类,但所有依赖库的类都报告为0%覆盖率。
  • 查看详细信息时,会报告找不到任何来源。

现在我认为问题可能是,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提供?

1 个答案:

答案 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>

其他问题仍然存在。