Spock与现有测试框架的对比

1、Spock是什么?java

  • Spock是一个能够应用于java或groovy的测试框架
  • 在编写单元测试过程当中去掉依赖的类/对象/资源,专一测试类自己,实现解耦
  • Spock测试框架基于Groovy并吸取了Junit、TestNG、Mockito等测试框架的优势
  • Spock编写的单元测试层次清晰,优雅,代码量少,可读性好

2、Spock+Groovy让咱们的测试代码更轻框架

  • groovy是一种很是相似java的语言,可是语法更加轻,每句代码结尾不用分号结束,也不须要用public修饰,由于pubilc是默认的。
  • 在spock中mock对象很是容易,只须要使用Mock(class)
  • Groovy可使用字符串文原本命名方法,这个特性使测试方法更加容易被阅读和理解。
  • expect能够看作精简版的when+then
  • “>>” 表示模拟对象的返回值
  • “>>>” 表示同一方法屡次按顺序调用返回不一样值
  • 下划线“_”表示匹配全部的输入值
  • Spock不使用Assert来校验结果,then声明后面的表达式result=="1"就至关于Junit中的Assert.assertTrue(result.equals("1"))
  • n * . 表示指望对对象的方法n次调用

3、spock的与其余框架的对比函数

一、Spock强制使用一套清晰的测试结构单元测试

使用Spock缘由是会让你感受层级分明,相对于其余框架来讲代码具备更高的可读性,而JUnit测试缺少正式的语义,在JUnit测试中,arrange-act-assert模式是隐含的很容易被忽略,例如一名java开发人员可将JUnit测试写成以下:测试

当arrange-act-assert模式结构被破坏了,代码可阅读性变差,当内容较长,逻辑复杂,这时单测的维护成本就变的很大,而Spock除了使用基本的given-when-then,还可使用其余的代码块来保证测试的结构完整性。rest

开发维护人员仅仅经过阅读对应的代码块的名字便可知道这个测试是作什么的,清晰明了。对象

二、参数化测试blog

JUnit和Mockito对于参数化的支持很是有限并且很受限制,JUnit测试很显然不符合DRY原则(Don't repeat yourself,不要重复本身),有太多的相同代码, 而Spock提供数据表格正好能解决这个问题, spock能以直观的方式编写参数化,并且代码不须要重复,将数据和描述以表格的形式放在一块儿。经过以上代码能够看到,这里讲三个JUnit的测试合并在一个单独的spock测试里,不须要写重复代码, 测试逻辑只要写一次,全部的输入和输出都集中在一个地方,可阅读性高,参数名称在表格头部清晰可见。资源

三、开箱即用开发

Groovy自动提供一个构造函数,构造函数接受一个名称-值对与类的属性相对应,是Groovy开箱即用的功能— 用于类中定义的任何属性,Groovy 容许将存储了大量值的映射传给构造函数,不用初始化对象的每一个属性,减轻代码。

新建一个类song:

可添加下面这个代码:

在JUnit只能一个个的set值,比较繁琐。

四、关于重载

在实际开发项目中,少不了用重载,在JUnit中测试重载须要写大量的重复代码,很是繁琐复杂,而在Spock中使用*匹配器,如上用restTemplate.exchange(*),便可测试全部的重载方法,简洁优雅。

五、断言异常

Spock还为咱们提供了一种表达方式来检查异常状况。在JUnit中,咱们的一些选项可能会使用try-catch块,在咱们测试的顶部声明,或者使用第三方库。 Spock的原生断言提供了一种处理exception状况的方法:

在这里,咱们不须要引入额外的库。另外一个优势是thrown()方法将断言异常的类型,但不会暂停执行测试。

六、mock和stubbing

经过使用mock和stub,可让mock对象进行交互,得到指望的返回值,这在JUnit和mockito中是很难实现的,而在Spock仅用几行代码就能够优雅实现了。

相关文章
相关标签/搜索