我将我的Ant任务配置为
<target name="test" depends="init">
<jacoco:coverage destfile="target/jacoco.exec">
<junit printsummary="yes" haltonfailure="yes" fork="yes" forkmode="once">
<classpath refid="my_project.path"/>
<formatter type="plain"/>
<formatter type="xml"/>
<batchtest fork="false" todir="target/test-reports">
<fileset dir="test">
<include name="**/*Test.java"/>
</fileset>
</batchtest>
</junit>
</jacoco:coverage>
</target>
Run Code Online (Sandbox Code Playgroud)
这产生了预期的junit结果.但是,target/jacoco.exec永远不会创建.我在ant test report任务执行期间没有任何错误.
测试:[jacoco:coverage]用覆盖率增强junit
Run Code Online (Sandbox Code Playgroud)... [junit] Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 0,009 sec报告:[jacoco:report]加载执行数据文件/home/usr/Workspaces/my_project/target/jacoco.exec
BUILD FAILED /home/usr/Workspaces/my_project/build.xml:73:无法读取执行数据文件/home/usr/Workspaces/my_project/target/jacoco.exec
总时间:14秒
好像我错过了一些东西,无法看清楚到底是什么.
我在jenkins工作中运行SonarQube(使用Post-build Actions).我遇到了JaCoCo的以下问题 -
[INFO] [16:57:43.157] Sensor JaCoCoSensor...
[INFO] [16:57:43.157] Project coverage is set to 0% as no JaCoCo execution data has been dumped: /var/lib/jenkins/.../target/jacoco.exec
[INFO] [16:57:43.426] Sensor JaCoCoSensor done: 269 ms
Run Code Online (Sandbox Code Playgroud)
结果,我的项目获得了0%的代码覆盖率.找不到为什么没有创建jacoco.exec.
我没有将"JaCoCo"配置为由maven运行(在我的pom.xml中).我知道在过去jacoco.exec无论如何都是创建的(可能是Sonar本身).
我究竟做错了什么?我是否需要在我的pom.xml中配置JaCoCo才能使用?谢谢.
随着cobertura-maven-plugingetter和setter方法可排除使用代码覆盖ignoreTrivial选项.是否还有这种可能性jacoco-maven-plugin?
这是我目前的配置:
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.1.201405082137</version>
<configuration>
<excludes>
<exclude>com/welovecoding/web/blog/test/**/*.class</exclude>
</excludes>
</configuration>
<executions>
<execution>
<id>amend-unit-test-java-agent-option</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>report</id>
<phase>prepare-package</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud) 有没有办法从SonarQube中排除包(由gradle + sonar-runner配备)覆盖率报告(由jacoco生成),而不将它们完全排除在项目之外?
以下是我到目前为止尝试的内容:
// JaCoCo test coverage configuration
tasks.withType(Test) { task ->
jacoco {
append = false
// excluded classes from coverage defined in above configuration
excludes = excludedClasses()
}
jacocoTestReport {
doFirst {
classDirectories = fileTree(dir: "${buildDir}/classes/main/").exclude(excludedClasses())
}
}
}
Run Code Online (Sandbox Code Playgroud)
用于从声纳分析中排除包的属性设置.将此添加到我的配置会导致包在Sonar中根本不显示的情况.
property 'sonar.exclusions', excludedClasses().join(',')
Run Code Online (Sandbox Code Playgroud)
用于从jacoco中排除包的属性设置.设置此选项会导致包裹被排除在覆盖率分析之外,但会显示0%会累积到不良总分.
property 'sonar.jacoco.exclusions', excludedClasses().join(',')
Run Code Online (Sandbox Code Playgroud) 我试图寻找Jacoco离线仪器gradle脚本片段,但找不到.是否可以通过gradle脚本进行Jacoco离线检测?如果是的话...它的一个例子就是伟大的.谢谢.
我正在尝试在Gradle中生成Jacoco测试报告.当我尝试同步我的代码时,我将收到以下错误:
错误:(56,0)无法在类型为org.gradle.api.Project的项目':app'上找到参数[build_38ehqsoyd54r3n1gzrop303so $ _run_closure4 @ 10012308]的方法jacocoTestReport().
我的build.gradle文件包含以下项目:
apply plugin: 'jacoco'
jacoco {
toolVersion = "0.7.6.201602180812"
reportsDir = file("$buildDir/reports/jacoco")
}
jacocoTestReport {
group = "Reporting"
reports {
xml.enabled true
csv.enabled false
html.destination "${buildDir}/reports/coverage"
}
}
Run Code Online (Sandbox Code Playgroud)
当我查看文档时,我没有看到任何我做错的事情.
Gradle版本:3.3
为什么我收到此错误,我该如何解决?
更新到Android Gradle插件3.1.0(从3.0.1)后,我的JaCoCo单元测试覆盖率配置开始在Gradle配置阶段产生错误:
> Configuration with name 'androidJacocoAnt' not found.
Run Code Online (Sandbox Code Playgroud)
项目级build.gradle:
dependencies {
classpath 'com.android.tools.build:gradle:3.1.0'
classpath "org.jacoco:org.jacoco.core:0.8.1"
}
Run Code Online (Sandbox Code Playgroud)
模块级build.gradle:
apply plugin: 'jacoco'
...
android {
buildTypes {
debug {
testCoverageEnabled true
}
}
...
}
task jacocoTestReport(type: JacocoReport) {
dependsOn 'createDebugCoverageReport'
dependsOn 'testDebugUnitTest'
reports {
xml.enabled = true
html.enabled = true
csv.enabled = false
}
jacocoClasspath = configurations['androidJacocoAnt']
def fileFilter = [
'**/R.class',
'**/R$*.class',
'**/BuildConfig.*',
'**/Manifest*.*',
'**/*Test*.*',
'android/**/*.*'
]
def debugTree = fileTree(dir: "${buildDir}/intermediates/classes/debug", excludes: fileFilter)
def mainSrc = "${project.projectDir}/src/main/java"
print("${project.projectDir}/src/main/java") …Run Code Online (Sandbox Code Playgroud) 正如标题所说,这就是问题所在.我有一个带有模块的android风格的应用程序.该应用程序在android-studio和TeamCity服务器中使用gradle编译.我们有自定义任务来创建看起来像这样的代码覆盖:
task codeCoverageReport(type: JacocoReport) {
// Gather execution data from all subprojects
executionData fileTree(project.rootDir.absolutePath).include("**/build/jacoco/*.exec")
//Build class & source dirs
def classExcludes =['**/R.class',
'**/R$*.class',
'**/BuildConfig.class',
'**/*$InjectAdapter*.class',
'**/*$ModuleAdapter*.class',
'**/*$ViewInjector*.class']
sourceDirectories = files();
classDirectories = files();
subprojects.each{
sourceDirectories += files(it.projectDir.absolutePath + '/src/main/java')
def path1 = it.buildDir.absolutePath + '/intermediates/classes/debug'
def path2 = it.buildDir.absolutePath + '/classes/main'
classDirectories += fileTree(dir: path1, excludes: classExcludes, includes: ['**/*.class'])
classDirectories += fileTree(dir: path2, excludes: classExcludes, includes: ['**/*.class'])
}
reports {
xml.enabled true
html.enabled true
html.destination "${buildDir}/reports/jacoco"
csv.enabled false
}
doFirst …Run Code Online (Sandbox Code Playgroud) 我正在一个巨大的代码库上运行集成测试.在覆盖率报告中,我想知道哪个测试覆盖了代码中的某一行.无论如何使用jacoco吗?
我正在构建一个已经在分析我的Java 8/Gradle 3.3项目的SonarQube 6.2服务器.将JaCoCo添加到多模块gradle项目时,我意识到SonarQube正在"按模块"测量代码覆盖率:
如果一个类位于模块中A并且该类的测试位于模块中B,则SonarQube会指出该类未被覆盖.
我想测量所有模块的代码覆盖率,而不是基于每个模块.我该如何实现这一目标?
有很多类似的问题,但没有有用的答案,虽然这种情况对我来说似乎很常见.例如Jenkins默认情况下这样做.
主要build.gradle包括
plugins { id "org.sonarqube" version "2.2.1" }
subprojects {
apply plugin: 'java'
apply plugin: 'jacoco'
repositories { mavenCentral() }
dependencies { testCompile "junit:junit:4.12" }
}
Run Code Online (Sandbox Code Playgroud)
modA/build.gradle是空的.
它包括3类:TestedInModA,TestedInModATest和TestedViaModB.
modB/build.gradle只是声明一个依赖modA:
dependencies { compile project(':modA') }
Run Code Online (Sandbox Code Playgroud)
它只包含一个类:TestedViaModBTest,测试TestedViaModB位于的类modA.
我的(私有)Jenkins实例显示了包括的两个类的100%覆盖率,而SonarQube说只有类TestedInModA(在其自己的模块中测试)被覆盖.
如何修改构建过程以查看SonarQube中的"跨模块覆盖"?
我很想更新我的项目,以便将来访问此问题的访问者可以找到一个有效的例子.
我的工作解决方案(感谢@Godin)
将以下内容添加到subprojects闭包中 …