JaCoCo 可以检测 groovy 脚本吗?

如何解决JaCoCo 可以检测 groovy 脚本吗?

我正在尝试使用 JaCoCo 检测 groovy 脚本,但似乎 JaCoCo 只能检测 groovy 类。我可以在报告中看到脚本,但它总是以 0% 的覆盖率显示它们。 我正在使用 groovyshell 来执行测试中的脚本。似乎由于脚本的执行方式,JaCoCo 无法将源代码与测试匹配。

这是我的 JaCoCo 配置:

dependency>
    <groupId>org.jacoco</groupId>
    <artifactId>org.jacoco.agent</artifactId>
    <classifier>runtime</classifier>
    <scope>test</scope>
    <version>0.8.7</version>
</dependency>

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.7</version>
    <executions>
        <execution>
            <id>default-instrument</id>
            <goals>
                <goal>instrument</goal>
            </goals>
        </execution>
        <execution>
            <id>default-restore-instrumented-classes</id>
            <goals>
                <goal>restore-instrumented-classes</goal>
            </goals>
        </execution>
        <execution>
            <id>report</id>
            <phase>prepare-package</phase>
            <goals>
                <goal>report</goal>
            </goals>
        </execution>
    </executions>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <systemPropertyVariables>
            <jacoco-agent.destfile>target/jacoco.exec</jacoco-agent.destfile>
        </systemPropertyVariables>
    </configuration>
</plugin>

解决方法

JaCoCo 可以检测 groovy 脚本。

没有必要使用离线检测。

JaCoCo 无法匹配文件,因为我正在编译脚本,但是当脚本执行时,GroovyShell 再次编译它们,生成具有不同类 Id 的其他字节码。 JaCoCo 使用类 Id 来匹配执行的类和分析的类。 解决方法是让 JaCoCo 代理转储目标文件夹下处理的文件,然后我们将拥有相同的类 ID,一切都会正常工作。

通过这种方法,JaCoCo 也将为所有库生成报告。为避免这种情况,我们需要指定要检测的包。

我们还需要从 gmavenplus-plugin 中删除 compile 目标,否则脚本将被编译两次并且 JaCoCo 将抛出重复类名的错误。

这是我最终的 pom 配置:

<plugin>
    <groupId>org.codehaus.gmavenplus</groupId>
    <artifactId>gmavenplus-plugin</artifactId>
    <version>1.12.1</version>
    <executions>
        <execution>
            <goals>
                <goal>addSources</goal>
                <goal>addTestSources</goal>
                <!-- <goal>compile</goal>-->
                <goal>compileTests</goal>
            </goals>
        </execution>
    </executions>
    ...
</plugin>


<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.7</version>
    <executions>
        <execution>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
            <configuration>
                <classDumpDir>target/classes</classDumpDir>
                <includes>
                    <include>packageToInclude/**</include>
                </includes>
            </configuration>
        </execution>
        <execution>
            <id>report</id>
            <phase>prepare-package</phase>
            <goals>
                <goal>report</goal>
            </goals>
        </execution>
    </executions>
</plugin>

进一步阅读类 ID:https://www.eclemma.org/jacoco/trunk/doc/classids.html 有关转储类文件的进一步阅读:https://www.jacoco.org/jacoco/trunk/doc/agent.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?