请不要误解,我丝毫没有诋毁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的学习资料,不用说,固然仍是官方网站上的最保险。