Spock测试框架实践(二)

2020-07-29 10:03:02 浏览数 (1)

在上一次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还有两种数据定义的方法,并且可以结合使用。

0 人点赞