請不要誤解,我絲毫沒有詆譭JUnit的任何意思,個人意思只是……咳……換個更好用的……並且即使如此,你也不能真正的丟掉它,由於Spock本身也須要JUnit。node
簡單地講,Spock是一個Groovy的BDD測試框架,若是你是第一次這個詞,那不妨先看個Spock的例子,而後再去訪問剛纔給出的BDD連接:sql
def "subscribers receive published events at least once"() { when: publisher.send(event) then: (1.._) * subscriber.receive(event) where: event << ["started", "paused", "stopped"] }
上面的例子已經很是明白的展現了Spock中的測試例子,但Spock的優勢遠不只此而已。數據庫
記得Groovy 1.7的新特性之一:Power Assert嗎?它最先就來源於Spock。對於沒有下載使用Groovy 1.7的讀者,這裏簡單說明一下。假設代碼中有一條Assert語句「assert 91 == a * b」,在a=10和b=9的狀況下,語句確定會失敗。那麼在console中會顯示:apache
Exception thrown Assertion failed: assert 91 == a * b | | | | | 10| 9 | 90 false at ConsoleScript2.run(ConsoleScript2:4)
是否是很是直觀?請屏住呼吸,Spock還有另外一個讓人激動的特性,若是你跟我同樣常常須要開發一些和數據庫打交道的應用,確定會爲之雀躍不已。它就是數據驅動測試。框架
看看下面的例子,不用我多說,你應該可以體會到給測試帶來的便捷:wordpress
def "maximum of two numbers"() { expect: Math.max(a, b) == c where: a << [3, 5, 9] b << [7, 4, 9] c << [7, 5, 9] }
忘掉一遍又一遍的書寫循環、賦值、計算、驗證的過程,只須要按以上寫法準備各個關鍵部分,測試就會自動地根據輸入數據進行循環,整個測試過程更加清晰。若是你以爲上面的例子過小兒科,那看看實際跟數據庫打交道的一個例子:學習
@Speck class DataDriven { @Shared sql = Sql.newInstance("jdbc:derby:spockdata" , "org.apache.derby.jdbc.EmbeddedDriver") def "maximum of two numbers"() { expect: Math.max(a, b) == c where: [a, b, c] << sql.rows("select a, b, c from maxdata") } }
現在,Spock 0.4發佈在即,它的做者Peter Niederwieser最近開始撰寫一系列該版本相關的文章。在Spock 0.4的新特性(1):數據表中,Peter展現了另外一個讓人尖叫的新功能。測試
在數據驅動的第一個例子中,where部分的賦值雖然簡化了咱們日常的作法,但依舊不太直觀。在0.4中,藉助數據表,你能夠寫成這樣:網站
def "maximum of two numbers"() { expect: Math.max(a, b) == c where: a | b | c 3 | 7 | 7 5 | 4 | 5 9 | 9 | 9 }
太棒了!真的是一個數據表!不知道此時你的感想如何?而這,正是我想要的。並且,也正是這讓我在旁觀了Spock一段時間以後,下定決心使用它的主要緣由。google
本站會繼續跟蹤Spock 0.4的新特性這一系列。關於Spock的學習資料,不用說,固然仍是官方網站上的最保險。