gpt4 book ai didi

unit-testing - 使用 Groovy 模拟 Jenkins 管道

转载 作者:行者123 更新时间:2023-12-04 13:22:19 30 4
gpt4 key购买 nike

我对 Jenkins 管道的东西很陌生,我正在用 Groovy 构建一个小型共享库。
在这种情况下,我试图提出一些单元测试,然后我必须模拟管道对象。

基本上我有一个 Groovy 类,其中包含一个使用凭据执行某些操作的方法:

class MyClass implements Serializable {

def pipeline

MyClass(def pipeline) {
this.pipeline = pipeline
}

void my method(String version) {
pipeline.withCredentials([pipeline.usernamePassword(credentialsId: 'MY_ID', usernameVariable: 'MY_USER', passwordVariable: 'MY_PASSWORD')]) {
pipeline.sh "./release.sh complete --username ${MY_USER} --password ${MY_PASSWORD} --version '${version}'"
}
}
}

所以当谈到单元测试这个方法时,我创建了一个 PipelineMock Groovy 类来(尝试)模拟 withCredentialsusernamePassword

测试类是这样的(简化了一点):

class MyClassTest {

@Test
void callWithWithVersionShouldCallCommad() {
def pipelineMock = new PipelineMock()
def myClass = new MyClass(pipelineMock)
myClass('1.0.1')
assertTrue(pipelineMock.commandCalled.startsWith('./release.sh complete'))
}

}

我想出的 PipelineMock 是:

class PipelineMock {

String commandCalled

def sh(String command) {
commandCalled = command
}

def usernamePassword(Map inputs) {
inputs
}

def withCredentials(List args, Closure closure) {
for (arg in args) {
closure.setProperty(arg.get('usernameVariable'), 'the_login')
closure.setProperty(arg.get('passwordVariable'), 'the_password')
}
closure()
}

}

最初我只是调用 closure() 来执行代码,但是我得到了错误 groovy.lang.MissingPropertyException: No such property: MY_USER for class: MyClass 当执行到 pipeline.sh 行时。
因此,我尝试将测试值注入(inject)到 MY_USERMY_PASSWORD 中,以便可以使用 for 循环解析它们。我得到了完全相同的错误,但这次是在调用 closure.setProperty 时。我在调试时进行了检查,arg.get('usernameVariable') 正确解析为 MY_USER

好吧,我迷路了。我不是真正的 Groovy 专家,所以我可能会错过一些东西。任何有关了解正在发生的事情的帮助将不胜感激!

最佳答案

这看起来确实是使用 JenkinsPipelineUnit 的理想选择正如@mkobit 在评论中提到的,但出于学术兴趣,问题中的样本实际上可以与委托(delegate)人相关的微小变化一起使用。原始的 MyClass.my 方法 中也有错字,我认为应该是 MyClass.call。这是工作 PipelineMock

class PipelineMock {

String commandCalled

def sh(String command) {
commandCalled = command
}

def usernamePassword(Map inputs) {
inputs
}

def withCredentials(List args, Closure closure) {
def delegate = [:]
for (arg in args) {
delegate[arg.get('usernameVariable')] = 'the_login'
delegate[arg.get('passwordVariable')] = 'the_password'
}
closure.delegate = delegate
closure()
}

}

下面是没有错字的 MyClass:

class MyClass implements Serializable {

def pipeline

MyClass(def pipeline) {
this.pipeline = pipeline
}

void call(String version) {
pipeline.withCredentials([pipeline.usernamePassword(credentialsId: 'MY_ID', usernameVariable: 'MY_USER', passwordVariable: 'MY_PASSWORD')]) {
pipeline.sh "echo ./release.sh complete --username ${MY_USER} --password ${MY_PASSWORD} --version '${version}'"
}
}
}

测试应该按原样进行。

关于unit-testing - 使用 Groovy 模拟 Jenkins 管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49232842/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com