我将我的工作从单个Hudson机器转移到多从属Jenkins环境,现在JaCoCo覆盖不再有效.
工作(旧):Hudson 2.0.1,Jenkins Sonar插件1.7.1,声纳2.1.2
BROKEN(新):Jenkins 1.446,Jenkins Sonar Plugin 1.7.2,Sonar 2.1.2
我的Hudson工作被称为Pinnacle,它曾经在同一台机器上使用Sonar在单个Hudson服务器上运行.我通过执行以下操作来设置我的(NO MAVEN)构建.
1)在我的build.xml中添加了一个Ant目标 test-with-coverage
2)在Hudson中配置Pinnacle作业以"使用以下属性调用独立声纳分析":
sonar.projectKey=com.skyboximaging:pinnacle
sonar.projectName="Pinnacle"
sonar.projectVersion=1.0
sources=Pinnacle/src/java
tests=Pinnacle/test/java
binaries=Pinnacle/classes
sonar.jacoco.reportPath=Pinnacle/jacoco.exec
sonar.jacoco.antTargets=test-with-coverage
Run Code Online (Sandbox Code Playgroud)
(请注意,代码将签出到Jenkins作业工作区的Pinnacle目录中.)
3)配置声纳"常规设置"以使用JaCoCo进行代码覆盖
一切都很美妙!
但是在新的Jenkins环境中,我在Jenkins构建输出中看到了这个错误:
23:15:17.863 INFO Sensor JaCoCoSensor...
23:15:17.868 INFO Project coverage is set to 0% as no JaCoCo execution data has been dumped: /var/lib/jenkins/workspace/Pinnacle/Pinnacle/jacoco.exec
Run Code Online (Sandbox Code Playgroud)
该文件在构建运行的从站上不存在.(目录/ var/lib/jenkins/workspace/Pinnacle/Pinnacle 确实存在.)
所有其他传感器(FindBugs,PMD等)似乎正常工作.只是JaCoCo坏了.
Sonar/JaCoCo甚至可以在多从属Jenkins环境中工作吗?
我怀疑Ant任务test-with-coverage没有运行.Sonar如何找到build.xml?新老装置有什么不同?
正如标题所说,这就是问题所在.我有一个带有模块的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) 信息:java 版本:1.8.0_66 蚂蚁版本:1.9.6
我想做的事:
为在 AWS windows 2k12 服务器上运行的服务器代码提供代码覆盖率报告。
我做了什么:
结果:
出现错误无法读取执行数据文件 C:/path/to/exec/jacoco.exec
构建.xml:
<project name="Example" default="rebuild" xmlns:jacoco="antlib:org.jacoco.ant">
<description>
Example Ant build file that demonstrates how a JaCoCo coverage report
can be itegrated into an existing build in three simple steps.
</description>
<property name="result.dir" location="." />
<property name="result.classes.dir" …Run Code Online (Sandbox Code Playgroud) 尝试使用Jacoco在Android上的Robolectric测试中获得代码覆盖率,但它在创建报告时拒绝承认我的Robolectric测试.
我的jacoco.gradle文件如下:
apply plugin: 'jacoco'
jacoco {
toolVersion = "0.7.6.201602180812"
}
project.afterEvaluate {
android.applicationVariants.all { variant ->
def name = variant.name
def testTaskName = "test${name.capitalize()}UnitTest"
tasks.create(name: "${testTaskName}Coverage", type: JacocoReport, dependsOn: "$testTaskName") {
group = "Reporting"
description = "Generate Jacoco coverage reports for the ${name.capitalize()} build."
classDirectories = fileTree(
dir: "${project.buildDir}/intermediates/classes/${name}",
excludes: ['**/R.class',
'**/R$*.class',
'**/*$ViewInjector*.*',
'**/*$ViewBinder*.*',
'**/BuildConfig.*',
'**/Manifest*.*']
)
sourceDirectories = files(['src/main/java'].plus(android.sourceSets[name].java.srcDirs))
executionData = files("${project.buildDir}/jacoco/${testTaskName}.exec")
reports {
xml.enabled = true
html.enabled = true
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
有了这个设置,我可以得到覆盖报告,但我得到0%的覆盖率,尽管在"的src/test/java下"有Robolectric测试.
如果我将以下代码添加到该文件:
android { …Run Code Online (Sandbox Code Playgroud) 运行后mvn jacoco:report如何在控制台上打印覆盖率?
我可以在浏览器中看到它,但希望它在 jenkins 中打印。
我想在 Travis 构建完成后自动将我的 Jacoco 测试报告上传到 Coveralls。它适用于 Java,但如何为 Kotlin 配置它?
错误信息
我可以在本地和 Travis 上生成 Jacoco 测试报告,但是当 Travis 尝试提交给工作服时,它会失败并显示消息
> Task :coveralls
No source file found on the project: "kotlin-template-project"
With coverage file: /home/travis/build/myname/myreponame/build/reports/jacoco/test/jacocoTestReport.xml
Run Code Online (Sandbox Code Playgroud)
Google 将我链接到 Gradle 插件实现,它显示了它在哪里抛出此消息,它告诉我(我认为)找到了 Jacoco 报告文件,但没有找到工作人员显然需要的源文件。
我试过的
因此,我尝试通过所有这些方式将工作服任务指向我的源文件:
coveralls {
sourceDirs += allprojects.sourceSets.main.allSource.srcDirs.flatten()
sourceDirs += files(sourceSets.main.kotlin.srcDirs).files.absolutePath
project.extensions.coveralls.sourceDirs += project.sourceSets.main.kotlin.srcDirs
sourceDirs += ['src/main/kotlin']
jacocoReportPath = 'build/reports/jacoco/test/jacocoTestReport.xml'
sourceDirs += ['src/test/kotlin']
sourceDirs += ["${projectDir}/src/main/kotlin"]
}
Run Code Online (Sandbox Code Playgroud)
我也尝试添加sourceSets project.sourceSets.main到jacocoTestReport任务中。
项目设置
我的最小build.gradle文件:
plugins {
id 'org.jetbrains.kotlin.jvm' …Run Code Online (Sandbox Code Playgroud) 考虑以下最小的Kotlin示例:
fun <U> someWrapper(supplier: () -> U): () -> (U) {
return { supplier() }
}
fun foo(taskExecutor: TaskExecutor): Int {
val future = CompletableFuture.supplyAsync(someWrapper {
42
}, taskExecutor::execute)
return future.join()
}
@Test
public void shouldFoo() {
assertThat(foo(), is(42));
}
Run Code Online (Sandbox Code Playgroud)
我在Jacoco中有分支覆盖规则,该规则对上面的代码失败,说someWrapper呼叫行未覆盖2个分支中的1个。不幸的是,对于我来说,排除所有someWrapper被调用的类不是一个选择。
查看反编译的Java代码:
public final int foo(TaskExecutor taskExecutor) {
Object var10000 = WrappersKt.someWrapper((Function0)null.INSTANCE);
if (var10000 != null) {
Object var2 = var10000;
var10000 = new Foo$sam$java_util_function_Supplier$0((Function0)var2);
}
Supplier var3 = (Supplier)var10000;
Function1 var4 = (Function1)(new Function1(this.taskExecutor) { …Run Code Online (Sandbox Code Playgroud) 在运行 Gradle 的 Jacoco 插件时,我在选定的一组类上报告的代码覆盖率为零。我已经确认所有测试这些类的单元测试都已成功运行。
非常有趣的是,Eclipse 中的 EclEmma 生成了正确的代码覆盖率结果。我已经确认两个工具都使用相同版本的 Jacoco。
我想弄清楚这两种工具之间的区别是什么?我是否需要 Gradle Jacoco 插件的附加配置。
编辑:我的 Gradle Jacoco 输出显示“类 com/.... 的执行数据不匹配”
更新:我在 Eclipse 中打开了 Jacoco 生成的 test.exec 文件。它显示了缺失覆盖率的类执行了 80% 的探测。
我正在尝试为我的 Android 应用程序获取代码覆盖率,我注意到当测试失败时,不会生成 jacoco 报告,只会生成coverage.ec。
有谁知道如何将coverage.ec 文件转换为jacoco 报告?
这对我不起作用:Jacoco 将coverage.ec 转换为没有coverage.em 的报告
祝一切顺利!
约翰尼
我的假设场景是这样的:
现在我的 git diff 和 jacoco 信息的交集是覆盖了更改的 10 行代码中的 7 行。即 - 我对新代码有 70% 的覆盖率。
但我必须手动解决这个问题。
我想要一种自动化的方法来计算覆盖了多少新代码行的百分比。
我的问题是:有没有办法只在新代码上获得单位覆盖率(例如来自 jacoco)?
(请注意,如果您运行扫描仪并使用 JSON API 询问任务结果,我知道sonarqube可以做到这一点analysis.mode=publish- 我正在寻找开发人员可以在本地运行的轻量级东西。)