JaCoCo 不会在多项目的 HTML 覆盖率报告中显示源文件

ves*_*sii 11 java code-coverage eclipse-pde jacoco

我正在使用 PDE,并在 build.xml 中编译代码并尝试使用 JaCoCo 和 JUnit 创建覆盖率报告。我注意到它现在确实显示了源文件,即使我sourcefiles在. 为了调试它(因为它不打印任何错误),我尝试在本地运行它:structurejacoco:report

java -jar jacoco/jacococli.jar report /buildFiles/coverage/jacoco.exec --classfiles /buildFiles/plugins/com.gandu.da.util.test/bin/com/gandu/da/util/test/AllTests.class --sourcefiles /buildFiles/plugins/com.gandu.da.util.test/src/com/gandu/da/util/test/AllTests.java --html html_report
Run Code Online (Sandbox Code Playgroud)

但它仍然没有显示 html 文件中的源代码。在JaCoCo 官方常见问题解答中我看到:

为什么覆盖率报告不显示突出显示的源代码?确保满足以下先决条件才能在 JaCoCo 覆盖率报告中突出显示源代码:

  • 类文件必须使用调试信息进行编译以包含行号。
  • 必须在报告生成时正确提供源文件。即指定的源文件夹必须是定义 Java 包的文件夹的直接父级。

我用标志编译了代码-g以获取所有信息 - 它不起作用。另外我相信我确实按预期提供了 src/bin 文件,所以我不确定为什么它不起作用。如何让它发挥作用?

编辑:我必须提供src目录:

java -jar jacoco/jacococli.jar report /buildFiles/coverage/jacoco.exec --classfiles /buildFiles/plugins/com.gandu.da.util.test/bin/com/gandu/da/util/test/AllTests.class --sourcefiles /buildFiles/plugins/com.gandu.da.util.test/src
# WORKED!
Run Code Online (Sandbox Code Playgroud)

现在我想用我的 build.xml 解决这个问题。代码:

<jacoco:report>
    <executiondata>
        <file file="${coverage.file}"/>
    </executiondata>
    <structure name="Coverage Report">
        <classfiles>
            <fileset dir="${buildDirectory}/plugins/com.gandu.da.util.test/bin">
                <include name="**/*.class" />
            </fileset>
        </classfiles>
        <sourcefiles encoding="UTF-8">
            <fileset dir="${buildDirectory}/plugins/com.gandu.da.util.test/src">
                <include name="**/*.java" />
            </fileset>
        </sourcefiles>
    </structure>
    
    <html destdir="${coverage.html}"/>
</jacoco:report>
Run Code Online (Sandbox Code Playgroud)

该代码有效,并提供了覆盖率报告和源文件。但正如你所看到的,我只需要硬编码一个包 ( com.gandu.da.util.test)。我想从以下所有包创建覆盖率报告:

  • 源:${buildDirectory}/plugins/com.gandu*/src.
  • 垃圾桶:${buildDirectory}/plugins/com.gandu*/bin

所以我尝试:

<jacoco:report>
    <executiondata>
        <file file="${coverage.file}"/>
    </executiondata>
    <structure name="Coverage Report">
        <classfiles>
            <fileset dir="${buildDirectory}/plugins/com.gandu.*/bin">
                <include name="**/*.class" />
            </fileset>
        </classfiles>
        <sourcefiles encoding="UTF-8">
            <fileset dir="${buildDirectory}/plugins/com.gandu.*/src">
                <include name="**/*.java" />
            </fileset>
        </sourcefiles>
    </structure>
    
    <html destdir="${coverage.html}"/>
</jacoco:report>
Run Code Online (Sandbox Code Playgroud)

但它不起作用,因为路径(带有星星)不存在。这是有道理的,因为dir期望得到一条路径。所以我认为这<foreach>可能会有所帮助,但在阅读文档后,我无法找到使用它的方法。上面的代码就是我所需要的。我希望听到关于如何解决这个问题的建议。

还要注意一点,因为它很重要:源文件和类文件的结构:

  • 源文件位于${buildDirectory}/plugins/com.gandu*/src.
  • 类文件位于:${buildDirectory}/plugins/com.gandu*/bin.

我也尝试插入${buildDirectory}/plugins两者dir<classfiles><sourcefiles>没有成功。它确实创建了覆盖率报告,但不显示源文件。我想我需要提供src每个包的目录。

所以我想使用<foreach>将每个包插入到结构中。我可能需要用来jacoco:merge合并它们,但我不确定。

也尝试includes="**/usr/**过 和includes="**/bin/**

我还有一些不同的 ant 版本可以在这里使用。可能有帮助?另外,也许我可以以某种方式“硬编码”插件并“合并”报告?

编辑:看起来当您提供多个插件时它会起作用,如下所示:

<jacoco:report>
    <!--  This task needs the collected execution data and ...  -->
    <executiondata>
        <file file="${coverage.metadata.file}"/>
    </executiondata>
    <!--  the class files and optional source files ...  -->
    <structure name="JaCoCo Coverage Report">
        <classfiles>
            <fileset dir="${buildDirectory}/plugins/com.gandu.da.util.mangager.test/@dot">
                 <include name="**/*.class" />
            </fileset>
            <fileset dir="${buildDirectory}/plugins/com.gandu.da.util.alltests/@dot">
                 <include name="**/*.class" />
            </fileset>
        </classfiles>
        <sourcefiles encoding="UTF-8">
            <fileset dir="${buildDirectory}/plugins/com.gandu.da.util.mangager.test/src">
                <include name="**/*.java" />
            </fileset>
            <fileset dir="${buildDirectory}/plugins/com.gandu.da.util.alltests/src">
                <include name="**/*.java" />
            </fileset>
        </sourcefiles>
    </structure>
    
    <html destdir="${coverage.html.dir}"/>
    <csv destfile="${coverage.csv.file}"/>
    <xml destfile="${coverage.xml.file}"/>
</jacoco:report>
Run Code Online (Sandbox Code Playgroud)

是否可以将所有想要的名称(例如com.gandu.da.util.alltests)放入一个文件中,一一读取它们,然后对它们运行for(或foreach)并fileset可能添加它们(在将每个名称附加到路径之后)?

Mar*_*ler 2

该问题不满足声明的先决条件之一:

指定的源文件夹必须是定义 Java 包的文件夹的直接父级

--sourcefiles /buildFiles/plugins/com.gandu.da.util.test/src
Run Code Online (Sandbox Code Playgroud)

Gradle 可能比 CLI 或 Maven 更支持脚本化。