JaCoCo 可以检测 groovy 脚本吗?
Can JaCoCo instrument groovy scripts?
我正在尝试使用 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 再次编译它们生成具有不同 class ID 的其他字节码。
JaCoCo 使用 class ID 来匹配执行的 classes 和分析的 classes。
解决方法是让 JaCoCo 代理转储目标文件夹下处理的文件,然后我们将拥有相同的 class ID,一切都会正常工作。
通过这种方法,JaCoCo 也将为所有库生成报告。为避免这种情况,我们需要指定要检测的包。
我们还需要从 gmavenplus-plugin 中删除编译目标,否则脚本将被编译两次并且 JaCoCo 将针对重复的 classes 名称抛出错误。
这是我最终的 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>
进一步阅读 classes ID:https://www.eclemma.org/jacoco/trunk/doc/classids.html
关于转储 class 文件的进一步阅读:https://www.jacoco.org/jacoco/trunk/doc/agent.html
我正在尝试使用 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 再次编译它们生成具有不同 class ID 的其他字节码。 JaCoCo 使用 class ID 来匹配执行的 classes 和分析的 classes。 解决方法是让 JaCoCo 代理转储目标文件夹下处理的文件,然后我们将拥有相同的 class ID,一切都会正常工作。
通过这种方法,JaCoCo 也将为所有库生成报告。为避免这种情况,我们需要指定要检测的包。
我们还需要从 gmavenplus-plugin 中删除编译目标,否则脚本将被编译两次并且 JaCoCo 将针对重复的 classes 名称抛出错误。
这是我最终的 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>
进一步阅读 classes ID:https://www.eclemma.org/jacoco/trunk/doc/classids.html 关于转储 class 文件的进一步阅读:https://www.jacoco.org/jacoco/trunk/doc/agent.html