使用参数化Spock框架进行行为测试

时间:2020-10-30 14:18:27

标签: groovy spock

我有一组行为测试,应该会得出相同的结果

def 'behaviour tests for route A'() {
 when:
   doA();

 then:
  data == 'Hi'
}

def 'behaviour tests for route B'() {
 when:
   doB();

 then:
  data == 'Hi'
}

void doA(){
 ...
}

void doB(){
 ...
}

代码看起来很难看,我更愿意使用参数化测试。与此同时:

@Unroll
def 'behaviour tests for route #name'() {
     when:
       route
    
     then:
      data == 'Hi'

     where:
      name | route
      'A'  | doA()
      'B'  | doB()
}

有办法吗?

1 个答案:

答案 0 :(得分:3)

您可以使用闭包来提取要在when块中执行的代码。

class ClosureSpec extends Specification {

  @Unroll
  def 'behaviour tests for route #name'() {
    when:
    def data = route()

    then:
    data == 'Hi'

    where:
    name | route
    'A'  | { doA() }
    'B'  | { doB() }
  }

  def doA() {
    return 'Hi'
  }

  def doB() {
    return 'Hi'
  }
}

或者您可以使用groovys动态特性来传递方法名称

class DynamicSpec extends Specification {

  @Unroll
  def 'behaviour tests for route #name'() {
    when:
    def data = this."do$name"()

    then:
    data == 'Hi'

    where:
    name | route
    'A'  | _
    'B'  | _
  }

  def doA() {
    return 'Hi'
  }

  def doB() {
    return 'Hi'
  }
}

根据用例,我会使用闭包,但是动态方法名称有其用途,尤其是在您要传递参数的情况下。