1

我刚刚开始将Cobertura集成到我们使用Ivy作为依赖管理工具的主要产品的构建过程中。有几个库lib-a,没有测试用例,一个项目依赖于这些库并包含所有这些库的单元和集成测试lib-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 中的检测 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>

这应该足够了吗?

我想知道,因为报告的警告。所有报告的类都可以在 jar 中找到。

对于第二个问题,我什至不知道如何将来源作为罐子提供给 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

4

1 回答 1

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>

问题是,检测 ivy 提供的 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>

其他问题仍然存在。

于 2013-06-27T10:45:23.877 回答