Spock数据驱动测试(Data Tables/Data Pipes)

标签:

本文出自jvm123.com-java技术分享站:http://jvm123.com/2019/10/spock-shu-ju-qu.html

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中可遍历的对象,包括  CollectionStringIterable等类型的对象和实现了 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数据驱动测试的内容,其中最基本的就是数据管道,将数据来源与数据变量关联,每次迭代,数据变量就可以被赋予新的值,即可进行面向数据的测试,即数据驱动测试。其中,对于比较固定的小量数据,可以使用数据表,数据表的写法更加清晰明了,是对数据管道的简化写法(语法糖)。

发表评论