2015-05-13 15 views
0

在Spock中,有沒有辦法將集合中每個項目的斷言轉化爲自己的測試,以便通過/失敗,類似於when@UnrollSpock - 將收集的斷言擴展爲單獨的測試,例如@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

這是在同一輸出上進行多次測試的單次測試執行。

這個怎麼樣?

when: 
def list = // do a bunch of stuff 

then: 
list*.foo == [bar1, bar2, ...] 

最後,它只是兩個集合之間的斷言。如果你正在檢查所有foo S的關係是完全一樣的值bar

then: 
list*.foo.every { it == bar } 
+0

這將仍然表現爲一個單一的測試失敗 - 在度量方面,它是相同的集合中的一個元素是否失效的所有元素失敗。 – wrschneider

1

也正是在斯波克@Unroll

詳情檢查碼頭:http://spockframework.github.io/spock/javadoc/1.0/spock/lang/Unroll.html

+0

是的,我的觀點是,當我使用'where'和'@ Unroll'時,它會多次執行整個測試。我正在尋找一種方法來選擇性地展開測試中的一些循環。 – wrschneider

+0

我不認爲它真的多次執行測試。我認爲這隻會改變報告的呈現方式。至少這是我從文檔中解釋這個陳述的方式:「請注意,展開對方法的執行沒有影響,它只是報告的一個變更。」你可以在這裏找到它:http://spockframework.github.io/spock/docs/1.0/data_driven_testing.html。 – OlgaMaciaszek

+0

'@ Unroll'和'where'是兩個不同的東西。 「哪裏」是導致測試重複的原因; '@ Unroll'改變了結果的呈現方式。 – wrschneider

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 
+0

問題是沒有得到名單首先。這是「where」和「@ Unroll」的行爲 - 我不想多次執行整個測試。相反,我想要執行一次測試,但將單個集合元素的斷言拆分爲單獨報告成功/失敗。 – wrschneider

+0

這就是這裏發生的事情。你把你的測試代碼放入'bunchOfStuff()'中,它將被執行_once_,然後你將在where子句中執行並單獨報告你的斷言。 – Raniz