groovy 在JenkinsPipelineUnit测试上生成代码覆盖率

dfuffjeb  于 2022-11-01  发布在  Jenkins
关注(0)|答案(1)|浏览(324)

我正在构建一个jenkins共享库(在groovy中),并在JenkinsPipelineUnit和gradle中对此进行测试。则不存在覆盖。
以下是我的build.gradle的相关部分:

plugins {
    id 'groovy'
    id 'application'
    id 'jacoco'
}

dependencies {
    compile 'org.codehaus.groovy:groovy-all:2.5.4'
    testCompile 'junit:junit:4.12'
    testCompile 'com.lesfurets:jenkins-pipeline-unit:1.1.1-custom' // minor adaptations, but that's another story
}

test {
    systemProperty "pipeline.stack.write", System.getProperty("pipeline.stack.write")
}

jacocoTestReport {
    group = "Reporting"
    reports {
        xml.enabled true
        csv.enabled false
    }
    additionalSourceDirs = files('vars')
    sourceDirectories = fileTree(dir: 'vars')
}

我认为问题在于,我的“源”文件驻留在vars目录中,而不是在普通groovy项目中所期望的src/groovy中。
我试着指定

sourceSets {
    main {
        groovy {
            srcDir 'vars'
        }
    }
}

但是gradle会在使用时加载该共享库时开始编译它;这就打破了一切。
我的文件夹结构如下所示:

├── build.gradle
├── src
│   └── test
│       ├── groovy
│       │   └── TestSimplePipeline.groovy
│       └── resources
│           └── simplePipeline.jenkins
└── vars
    ├── MyPipeline.groovy
    └── sh.groovy

我认为我的问题与https://github.com/jenkinsci/JenkinsPipelineUnit/issues/119有关,但我不知道如何使用gradle中为maven提出的修改(甚至不确定它们是否适用于jacoco)。

8gsdolmq

8gsdolmq1#

问题是JenkinsPipelineUnit在运行时评估你的脚本,这意味着jacoco代理不能检测运行时生成的字节码。
要解决此问题,您需要进行两项更改。
1.使用jacoco offline instrumentalisation
在我的例子中,我使用了maven,所以我不能提供gradle配置的具体示例。
1.在你的测试中加载编译过的类而不是groovy脚本。

def scriptClass = helper.getBaseClassloader().loadClass("fooScript")
def binding = new Binding()
script = InvokerHelper.createScript(scriptClass, binding)
InterceptingGCL.interceptClassMethods(script.metaClass, helper, binding)

这里的fooScript是类的名称(假设在本例中有一个名为fooScript.groovy的源文件)。
现在,您可以通过

def result = script.invokeMethod(methodName, args)

相关问题