Jenkins具有交叉变量交互作用的共享库单元测试

问题描述

我有一个詹金斯(Jenkins)共享库,与公司中的许多贡献者一样。我最近开始研究使用jenkins-spock库对该库实施一些单元测试。

但是,我在测试以下问题(该问题的简化版本)时遇到了一些麻烦,希望能有所帮助。

假设在vars文件夹中有两个脚本的共享库分别为archive.groovyfs.groovy。这两个脚本都以return this结尾。

这是fs.groovy内容

void copyFiles(pattern,destination) {
    fileOperations([
        filecopyOperations(includes: pattern,excludes: "*.log",targetLocation: destination,flattenFiles: false)
    ])
}

return this

这是archive.groovy内容

void call(src) {
    fs.copyFiles(src,"/opt/archival_dir")
}

return this

在我的pom.xml文件中,我添加了提供filecopyOperations步骤的插件

<dependency>
    <groupId>sp.sd</groupId>
    <artifactId>file-operations</artifactId>
    <version>1.11</version>
    <scope>test</scope>
</dependency>

我的测试如下:

class ArchiveSpec extends JenkinsPipelinespecification {

    def archive = null

    def setup() {
        archive = loadPipelinescriptForTest("/vars/archive.groovy")
    }

    def "calling archive copies the files to the right location"() {
        setup:
        String sourceFiles = ["a","b","c"].join(",")

        when:
        archive.call(sourceFiles)

        then:
        1* getPipelineMock("filecopyOperation.call")(_) >> {
                it.includes == sourceFiles
                it.excludes == "*.log"
                it.targetLocation == "/opt/archival_dir"
        }
    }
}

但是,以上结果导致出现以下错误

org.spockframework.mock.TooFewInvocationsError: 
Too few invocations for:

1* getPipelineMock("filecopyOperation.call")(_) >> {
            it.includes == sourceFiles
            it.excludes == "*.log"
            it.targetLocation == "/opt/archival_dir"
        }   (0 invocations)

唯一匹配的调用如下:

Mock for type 'Closure' named '(implicit-runtime) getPipelineMock("fs.copyFiles")'

因此,我似乎无法从fs.copyFiles中测试archive.call内容

另一方面,当我尝试直接测试fs.copyFiles函数调用时,我可以执行如下的filecopyOperation步骤:

class Fsspec extends JenkinsPipelinespecification {

    def fs= null

    def setup() {
        fs = loadPipelinescriptForTest("/vars/fs.groovy")
    }

    def "call fs.copyFiles uses right args"() {
        setup:
        String sourceFiles = ["a",")
        String dst = "destination"

        when:
        fs.copyFiles(sourceFiles,dst)

        then:
        1* getPipelineMock("filecopyOperation.call")(_) >> {
                it.includes == sourceFiles
                it.targetLocation == dst
        }
    }
}

我想我应该做一些explicitlyMockPipelineVariable("fs"),但似乎无法使它工作。我也尝试加载fs.groovy文件,就像在archive = loadPipelinescriptForTest("/vars/archive.groovy")的设置功能中使用ArchiveSpec一样,但这并不能解决问题。

是否可以使用jenkins-spock测试这种情况?如果没有,如何使用https://github.com/jenkinsci/JenkinsPipelineUnit达到相同的目的?

谢谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...