我怎么能在Spock / groovy中做到这一点?
package org.jenkinsci.plugins
import hudson.matrix.*
import spock.lang.*
import org.junit.Rule
import org.jvnet.hudson.test.JenkinsRule
class xxxx extends Specification {
@Rule JenkinsRule rule = new JenkinsRule()
def 'matrix'() {
given:
def matrixProject = rule.createMatrixProject()
AxisList axl = new AxisList();
def axis = new TextAxis('TEST', "1", "2", "3")
axl.add(axis)
matrixProject.setAxes(axl)
expect: matrixProject.scheduleBuild2(0).get().logFile.text.contains("Some String!")
matrixProject.scheduleBuild2(0).get().getRuns().each(){
expect: it.logFile.text.contains("Another String")
}
}
}
具体来说,如何使用嵌套测试运行闭包? “另一个字符串”测试不起作用
答案 0 :(得分:1)
这有用吗?
def 'matrix'() {
given:
def matrixProject = rule.createMatrixProject()
def axis = new TextAxis('TEST', "1", "2", "3")
matrixProject.axes.add(axis)
expect:
with( matrixProject.scheduleBuild2(0).get() ) {
logFile.text.contains("Some String!")
runs.every { it.logFile.text.contains("Another String") }
}
}
}
答案 1 :(得分:1)
使用every
代替each
,或使用嵌套assert
。
答案 2 :(得分:0)
我不确定我是否理解你的问题。但是,如果通过嵌套测试表示评估每个闭包内的语句,为什么不使用assert
expect:
matrixProject.scheduleBuild2(0).get().logFile.text.contains("Some String!")
matrixProject.scheduleBuild2(0).get().getRuns().each() {
assert it.logFile.text.contains("Another String")
}
@ tim_yates的方法似乎也很好,而且更像是Spock的方式。我没有测试过它。
修改强>
如果你想确保所有logFiles都包含测试字符串,那么就像Peter建议的那样使用'every'方法。
expect:
...
matrixProject.scheduleBuild2(0).get().getRuns().every {
it.text.contains('Another String')
}
其他方法,如果您想知道有多少logFiles在测试时不包含测试字符串,则计算它们并将结果大小与零进行比较:
expect:
...
matrixProject.scheduleBuild2(0).get().getRuns().count {
!it.text.contains('Another String')
} == 0
另一方面,如果您想知道哪些文件导致测试失败,请获取那些不包含测试字符串的文件的名称,并将其与空列表进行比较:
expect:
...
matrixProject.scheduleBuild2(0).get().getRuns().findAll {
!it.text.contains('Another String')
}*.name == []