Spock数据驱动测试的基本格式
Spock数据驱动测试( Data Driven Testing ),就是测试用例的书写格式更加面向数据,spock的数据驱动测试的书写格式,可即很清晰地汇集大量测试数据。基本格式如下:
class MathSpec extends Specification {
def "maximum of two numbers"(int a, int b, int c) {
expect:
Math.max(a, b) == c
where:
a | b | c
1 | 3 | 3
7 | 4 | 7
0 | 0 | 0
}
}
其中测试方法的参数 int a, int b, int c
称为数据变量(data variables),where 标签后的语句块称为数据表(data table)。
数据表(data table)
数据表(data table)就是一个看起来直观的存放测试数据的表格。数据表的第一行表头对应数据变量,从第二行开始就是数据行(data rows)。
如果测试方法只有一个数据变量a,则需要使用“_”补齐位置,使它成为一个数据表,如下:
where:
a | _
1 | _
7 | _
0 | _
数据表的简化写法
由于数据变量在被测试的语句Math.max(a, b) == c
中有所体现,所以测试方法的参数可以省略掉;此外,被测试的方法Math.max(a, b) == c
中,a,b为参数,c为结果,我们可以使用“||”将他们分开,这样看起来会更加直观。所以简化后的写法如下:
def "maximum of two numbers"() {
expect:
Math.max(a, b) == c
where:
a | b || c
1 | 3 || 3
7 | 4 || 7
0 | 0 || 0
}
数据管道(Data Pipes)
其实,上面介绍的数据表只是数据管道的语法糖。数据管道(data pipes)就是给每一个数据变量提供一组值,写法如下:
...
where:
a << [1, 7, 0]
b << [3, 4, 0]
c << [3, 7, 0]
一个数据管道,由两部分组成,<<
前面的是数据变量,<<
后面的是数据来源( data provider )。其中 数据来源( data provider ) 可以为任何Groovy中可遍历的对象,包括 Collection
, String
, Iterable
等类型的对象和实现了 Iterable
的对象。
数据来源( data provider )也不要求是一定是类似的集合,它也可以是从外部的文本文件、数据库、电子表格等获取数据的代码,甚至是自动生成数据的代码片段。
多变量的数据管道(Multi-Variable Data Pipes)
如果一个数据来源(data provider)每次迭代可以提供多个变量,则可以将它做为多个数据变量的数据来源 ,形成一个多变量的数据管道(Multi-Variable Data Pipes)。如下:
@Shared sql = Sql.newInstance("jdbc:mysql://localhost:3306/test", "com.mysql.jdbc.Driver", "root", "root")
def "maximum of two numbers"() {
expect:
Math.max(a, b) == c
where:
[a, b, c] << sql.rows("select a, b, c from maxdata")
}
如果数据来源的某列返回值我们并不使用,则可以使用下划线“_”,这样就会被忽略,如下:
...
where:
[a, b, _, c] << sql.rows("select * from maxdata")
Spock数据驱动测试小结
以上就是Spock数据驱动测试的内容,其中最基本的就是数据管道,将数据来源与数据变量关联,每次迭代,数据变量就可以被赋予新的值,即可进行面向数据的测试,即数据驱动测试。其中,对于比较固定的小量数据,可以使用数据表,数据表的写法更加清晰明了,是对数据管道的简化写法(语法糖)。