【问题标题】:Writing a parameterized test method in spock在 spock 中编写参数化测试方法
【发布时间】:2017-12-18 06:23:13
【问题描述】:

我正在 Spock 中编写测试,目前,这是基本结构:

def "someTest"(String str, Class<? extends SomeClass> clazz) {

    setup:
       (current implementation)
       obj.get("Sample1")
       obj.get("Sample2")
       obj.get("Sample3")
       ... so on

       (what I want to implement)
       object.get(str)

    when:
    ...

    then:
    ...
}

我需要在setup:when:then: 中使用strclazz,所以我需要一种方法来多次调用该方法。

我已经在网上阅读了一些 tuts:https://www.testwithspring.com/lesson/writing-parameterized-tests-with-spock-framework/ 但真的不知道如何用非原始类型实现它

【问题讨论】:

  • 多次调用什么方法?测试?
  • @doelleri 是的,我需要多次调用它(如果它可能在 spock 中)。我当然可以通过复制粘贴每个 str 和 clazz 的所有内容来进行测试,但这会太长
  • @HeanzyZabala 你需要在一个测试场景中执行这么多次 obj.get(str) 还是你有多个测试场景?
  • 如果“当前实现”实际编译会有所帮助。

标签: testing groovy spock


【解决方案1】:

在 spock 中,您在 where: 部分中提供参数化测试的值,作为 Ascii“表”或列表。 Spock 使用 AST 转换将此类表转换为单独的方法调用。所以看起来很神奇。

  @Unroll // formats method name. Can be on class level
  def "Name of #clazz is not #str"(String str, Class clazz) {
    setup:
    // TODO: real setup
    str == clazz.name

    // TODO: when/ then only useful for stimulus-response tests
    when:
    str == clazz.name

    then:
    str == clazz.name

    // TODO: expect not needed when using when/then
    expect:
    str == clazz.name

    where:
    str                  | clazz
    "java.lang.String"   | String.class
    "java.lang.Integer"  | Integer.class

  }

这可能看起来不像,但该方法对值“表”中的每一行运行多次,您可以通过使用无效值并使每个方法调用失败来检查。

【讨论】:

  • 别忘了@Unroll 注释 ;-)
  • 为什么每个区块都有str == clazz.name,即使是那些毫无意义的?对于此示例,一个简单的 expect 将是适当的块。
  • @LeonardBrünings OP 询问“我需要在安装时使用 str 和 clazz”,我只是试图证明它是可能的。我懒得做一个更好的例子,随意大胆地编辑例子(我不介意)。我添加了 cmets 来澄清一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-12
  • 1970-01-01
  • 2013-11-27
  • 1970-01-01
  • 2012-02-18
相关资源
最近更新 更多