我有一个 Maven 多模块项目,其中 JaCoCo 没有根据源文件生成报告。
通常,如果MyService是正在测试的类,它将以两种方式报告,一种通过MyService.html基于适当包的位置中的文件名和方法列表,以数字和图表的形式提供覆盖范围的整体图 - 列出所有方法在类中,每个方法都有一个指向另一个 html 的可点击链接,MyService.java.html其中包含带有红色/绿色/黄色背景的源代码以显示覆盖状态。
在我的场景中,只MyService.html生成而不是MyService.java.html和 方法在前者中列出并包含覆盖详细信息,但没有指向其他报告的超链接,如下所示。
问题在这里变得更有趣,我的 Maven 配置未在此模块中配置,但在父模块和其他子模块中能够正确生成报告。下面是maven插件配置供参考。
父 POM:
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>${jacoco.version}</version>
<configuration>
<destFile>${project.basedir}/target/jacoco-unit.exec</destFile>
<dataFile>${project.basedir}/target/jacoco-unit.exec</dataFile>
<append>true</append>
</configuration>
<executions>
<execution>
<id>jacoco-initialize</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>jacoco-site</id>
<phase>package</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
子POM:
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
</plugin>
Run Code Online (Sandbox Code Playgroud)
尝试切换 JaCoCo 版本,但没有任何帮助,现在坚持使用最新的 0.8.2。Maven 是最新的 - 3.6.0。除此之外,子 pom 中配置的另一个插件是 PMD——它的存在与否对报告没有任何影响。
我正在尝试配置 Jacoco 以从分析中排除某些类,但找不到任何工作示例:(
我找到了一些样本,afterEvaluate但没有成功
我正在尝试使用基于 API 命中的 Jacoco 获得端到端测试覆盖率,而不是通过运行单元测试。我跟着这个教程:https : //dzone.com/articles/code-coverage-report-generator-for-java-projects-a
但是我收到了这个错误:
Caused by: java.lang.LinkageError: loader 'bootstrap' attempted duplicate class definition for java.lang.$JaCoCo. (java.lang.$JaCoCo is in module java.base of loader 'bootstrap')
Run Code Online (Sandbox Code Playgroud)
我不知道是什么导致了错误:该项目使用 gradle,我还应用了 jacoco 插件进行单元测试(我需要对单元测试和端到端测试进行覆盖)。
但我不确定这是否会导致,LinkageError因为如果我从 gradle 中删除所有与 jacoco 相关的东西,同样的错误仍然出现。
如何正确设置 jacoco 覆盖率以使用 gradle 进行端到端测试?如果不可能,有什么替代方法吗?
为了生成单元和 Ui 测试的代码覆盖率,我实现了这个jacoco.gradle脚本
apply plugin: 'jacoco'
jacoco {
toolVersion = "0.8.5"
}
tasks.withType(Test) {
jacoco.includeNoLocationClasses = true
}
project.afterEvaluate {
android.applicationVariants.all { variant ->
def variantName = variant.name
def testTaskName = "test${variantName.capitalize()}UnitTest"
def uiTestCoverageTaskName = "create${variantName.capitalize()}CoverageReport"
tasks.create(
name: "${testTaskName}Coverage",
type: JacocoReport,
dependsOn: ["$testTaskName", "$uiTestCoverageTaskName"]) {
group = "Reporting"
description = "Generate Jacoco coverage reports for the ${variantName.capitalize()} build."
reports {
html.enabled = true
xml.enabled = true
}
def excludes = [
'**/R.class',
'**/R$*.class',
'**/BuildConfig.*',
'**/Manifest*.*',
'**/*Test*.*',
'android/**/*.*',
'**/*Application*.*', …Run Code Online (Sandbox Code Playgroud) 我尝试将我的项目从 JDK 11 升级到 JDK 14,但在将 java 版本设置为 14 后运行测试失败。由于我将 jacoco 与 JMockit 结合使用,我配置了我的构建如下(编辑:JaCoCo 版本是 0.8.3 / 0.8.5,JMockit 版本 1.49):
<build>
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>${version.jacoco}</version>
<executions>
<execution>
<id>coverage-initialize</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>coverage-report</id>
<phase>post-integration-test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${version.surefire-plugin}</version>
<configuration>
<argLine>
@{argLine} -javaagent:"${settings.localRepository}"/org/jmockit/jmockit/${version.jmockit}/jmockit-${version.jmockit}.jar
</argLine>
</configuration>
</plugin>
...
Run Code Online (Sandbox Code Playgroud)
如果我在 Java 版本设置为 11 的情况下运行 Maven,一切正常,但是当我将 Java 版本设置为 14 时,surefire 插件会抛出此错误:
[ERROR] java.lang.instrument.IllegalClassFormatException: Error while instrumenting sun/util/resources/cldr/provider/CLDRLocaleDataMetaInfo.
[ERROR] at org.jacoco.agent.rt.internal_1f1cc91.CoverageTransformer.transform(CoverageTransformer.java:93)
[ERROR] sun.util.locale.provider.LocaleDataMetaInfo: Unable to load sun.util.resources.cldr.provider.CLDRLocaleDataMetaInfo …Run Code Online (Sandbox Code Playgroud) 我lombok.config在根目录中创建了一个包含以下内容的文件:
config.stopBubbling = true
lombok.addLombokGeneratedAnnotation = true
Run Code Online (Sandbox Code Playgroud)
但 Lombok 生成的代码(Getters、Setters、Builders 等)仍然出现在我的 Jacoco 测试报告上。
Jacoco 版本是 0.8.6,Lombok 版本是 1.18.12。
如何从报告中删除 Lombok 代码?
我们最近将 lombok 添加到我们的项目中,但是它降低了 Intellij 中的测试覆盖率,因为它检测到 getter/setter 未经测试。
我们已经添加了 lombok.config 来添加 @Generate 注释,但是只有 JaCoCo 会忽略它们。这适用于 SonarQube,但在 Intellij 中使用 JaCoCo 作为覆盖运行器不起作用,因为它不适用于 powermock。到目前为止,我们发现的唯一解决方法是修改 pom.xml 以使用 JaCoCo 离线工具,运行 Maven 测试,然后手动导入测试覆盖率,但这不是一个非常干净的解决方案。
有没有办法让 Intellij 覆盖率运行程序忽略 @Generate 带注释的方法?如果失败,我们如何设置 JaCoCo 以便我们可以从 intellij 运行测试,而不必执行 Maven 测试解决方法?
以下是我的声纳属性片段:
sonarqube {
properties{
property "sonar.junit.reportPaths", "build/test-results/testDebugUnitTest/*.xml"
property("sonar.coverage.jacoco.xmlReportPaths", "build/reports/jacocoTestReport.xml"
}
}
Run Code Online (Sandbox Code Playgroud)
Jacoco 配置和属性工作正常,我如何确认这一点?我创建了一个 java 类并为其编写了一个单元测试,sonarqube 识别了这一点并将其记录为代码覆盖率的一部分,而它基本上忽略了所有 Kotlin 文件测试。我继续将 kotlin 文件更改为 java,并为其编写了一个 UnitTest,是的,它被识别并添加为代码覆盖率的一部分,再次,kotlin 文件测试被忽略。
顺便说一句,下面是我的 Jacoco.gradle:
apply plugin: 'jacoco'
ext {
coverageExclusions = [
'**/*Activity*.*',
'**/*Fragment*.*',
'**/R.class',
'**/R$*.class',
'**/BuildConfig.*',
]
}
jacoco {
toolVersion = '0.8.6'
reportsDir = file("$buildDir/reports")
}
tasks.withType(Test) {
jacoco.includeNoLocationClasses = true
jacoco.excludes = ['jdk.internal.*']
}
tasks.withType(Test) {
finalizedBy jacocoTestReport // report is always generated after tests run
}
task jacocoTestReport(type: JacocoReport, dependsOn: ['testDebugUnitTest']) {
group = "Reporting" …Run Code Online (Sandbox Code Playgroud) 我的 Android 应用程序中有多个模块。我需要在 CI/CD 管道中自动执行代码覆盖率报告,其中 \xe2\x80\x99t 没有物理/虚拟 Android 设备,并且无法附加设备。
\n集成 Jacoco 来自 - https://github.com/gouline/android-samples/blob/master/jacoco/jacoco.gradle
\n当我尝试通过 gradle 命令生成覆盖率报告时
\n>> ./gradlew createDebugCoverageReport\nRun Code Online (Sandbox Code Playgroud)\n它失败并显示以下错误日志
\n* What went wrong:\nExecution failed for task \':app:connectedDebugAndroidTest\'.\n> com.android.builder.testing.api.DeviceException: No connected devices!\nRun Code Online (Sandbox Code Playgroud)\n所以我尝试通过命令排除 gradle 任务 (connectdDebugAndroidTest)
\n>> ./gradlew createDebugCoverageReport -x app:connectedDebugAndroidTest -x module1:connectedDebugAndroidTest\nRun Code Online (Sandbox Code Playgroud)\n出现如下错误 -
\n> Task :module1:createDebugAndroidTestCoverageReport FAILED\n\nFAILURE: Build failed with an exception.\n\n* What went wrong:\nExecution failed for task \':vpn:createDebugAndroidTestCoverageReport\'.\n> java.io.IOException: No coverage data to process in directories [/Users/abc/ws/prjName/module1/build/outputs/code_coverage/debugAndroidTest/connected]\n …Run Code Online (Sandbox Code Playgroud) 在 Jenkins 中运行测试项目时出现以下错误
Caused by: java.lang.LinkageError: loader 'bootstrap' attempted duplicate class definition for java.lang.$JaCoCo. (java.lang.$JaCoCo is in module java.base of loader 'bootstrap')
Jacoco 在父 pom 和当前测试 pom 中定义,具有不同的目标。
父pom.xml
<build>
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.5</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>validate-headless</id>
<phase>validate</phase>
<goals>
<goal>prepare-agent</goal>
</goals>
<configuration>
<skip>true</skip>
<propertyName>failsafe.argLine</propertyName>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Run Code Online (Sandbox Code Playgroud)
测试项目-pom.xml
<properties>
<maven.repo.local>${user.home}/.m2/repository</maven.repo.local>
<itCoverageAgent>-javaagent:${maven.repo.local}/org/jacoco/org.jacoco.agent/0.8.5/org.jacoco.agent-0.8.5-runtime.jar=destfile=${basedir}/target/jacoco-it.exec</itCoverageAgent>
</properties>
<build>
<plugins>
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
<configuration>
<argLine>${failsafe.argLine} ${itCoverageAgent}</argLine>
<testFailureIgnore>true</testFailureIgnore>
<reuseForks>true</reuseForks>
</configuration>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>coverage</id>
<build> …Run Code Online (Sandbox Code Playgroud)