Spock - 将收集的断言扩展为单独的测试,如@Unroll

时间:2015-05-13 15:19:47

标签: unit-testing groovy spock

在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   ||  ...
....

但是,这会多次重新运行整个测试,这也不是我想要的 - 我想要一个单独的测试执行,但是每个集合元素上的断言都报告为一个独立的测试传递/故障。

3 个答案:

答案 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 }