扔掉JUnit,迎接Spock

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

相关文章
相关标签/搜索