在Spock中,有没有办法可以将集合中每个项目的断言转换为自己的通过/失败的测试,类似于when
和@Unroll
的情况?
如果我遵循最简单,最明显的方法(记录在Asserting on a list of items in Spock)
when: def list = // do a bunch of stuff
then: list.each { ... assert it.foo == bar ... }
然后测试失败将停止迭代,而不是测试列表中的其他项目。我可以在循环中构建一个错误列表,然后将assert
拉出循环,但我希望从测试框架中获得一些好处。
我可以改用where
,
then: list[idx].foo == bar
where:
idx || bar
0 || ...
1 || ...
2 || ...
....
但是,这会多次重新运行整个测试,这也不是我想要的 - 我想要一个单独的测试执行,但是每个集合元素上的断言都报告为一个独立的测试传递/故障。
答案 0 :(得分:1)
Spock也是@Unroll
。
有关详细信息,请查看停靠栏:http://spockframework.github.io/spock/javadoc/1.0/spock/lang/Unroll.html
答案 1 :(得分:1)
如何使用辅助方法创建列表,然后使用@Unroll
,如OlgaMaciaszek建议的那样?
class UnrolledSpec extends Specification {
def bunchOfStuff() {
println "Doing a bunch of stuff"
return [-1, 1, 2, 3, 4, 5]
}
@Unroll
def "That all numbers are greater than zero [#number]"() {
expect:
println "Testing ${number}"
number > 0
where:
number << bunchOfStuff()
}
}
输出:
Doing a bunch of stuff
Testing -1
Condition not satisfied:
number > 0
| |
-1 false
at UnrolledSpec.That all numbers are greater than zero [#number](UnrolledSpec.groovy:20)
Testing 1
Testing 2
Testing 3
Testing 4
Testing 5
答案 2 :(得分:0)
它是在同一输出上进行多次测试的单次测试执行。
怎么样?
when:
def list = // do a bunch of stuff
then:
list*.foo == [bar1, bar2, ...]
最后,它就像两个集合之间的断言一样。如果您要检查所有foo
,则其值应与bar
完全相同:
then:
list*.foo.every { it == bar }