在上一次Spock实践中我们介绍了Spock的优点和Demo的搭建,今天我们继续介绍一些Spock常用的实践。
首先介绍下spock中的几个基本概念:
1、Specification
在Spock中,待测系统(system under test; SUT) 的行为是由规格(specification) 所定义的。在使用Spock框架编写测试时,测试类需要继承自Specification类。
2、Fields
Specification类中可以定义字段,这些字段在运行每个测试方法前会被重新初始化,跟放在setup()里是一个效果。
3、Fixture Methods
预先定义的几个固定的函数,与Junit或testNG中类似。
4、Feature Mehtods
这是Spock规格(Specification)的核心,其描述了SUT应具备的各项行为。每个Specification都会包含一组相关的Feature methods,如要测试1 1是否等于2,可以编写一个函数:
5、 Blocks
每个feature method又被划分为不同的block,不同的block处于测试执行的不同阶段,在测试运行时,各个block按照不同的顺序和规则被执行,如下图:
5.1 Setup Blocks
setup也可以写成given,在这个block中会放置与这个测试函数相关的初始化程序。一般会在这个block中定义局部变量,定义mock函数等。
5.2. When and Then Blocks
when与then需要搭配使用,在when中执行待测试的函数,在then中判断是否符合预期。
5.2.1 断言
条件类似junit中的assert,就像上面的例子,在then或expect中会默认assert所有返回值是boolean型的顶级语句。如果要在其它地方增加断言,需要显式增加assert关键字。
如果要验证有没有跑出异常,可以使用thrown
5.2.2 断言
要获取抛出的异常对象,可以用以下语法:
如果要验证没有抛出某种异常,可以用notThrown():
5.3 Expect Blocks
expect可以看做精简版的when then
5.4 Cleanup blocks
函数在退出前做一些清理的工作,比如关闭资源。
即使featuremethod中之前的一些执行会出现一些异常,cleanup仍然会被执行。
5.5 Where blocks
做测试时最复杂的事情之一就是准备测试数据,尤其是要测试边界条件、测试异常分支等,这些都需要在测试之前规划好数据。但是传统的测试框架很难轻松的制造数据,要么依赖反复调用,要么用xml或者data provider函数之类难以理解和阅读的方式。
而在spock中,通过where block可以让这类需求实现起来变得非常优雅。
可以为标记@Unroll的方法声明动态的spec名。运行时,名称会被替换为实际的参数值。
除此之外,where block还有两种数据定义的方法,并且可以结合使用。