如何使特征方法成为条件

How do you make a feature method conditional

在我的测试中,我有一些特征方法只需要 运行 在某些情况下。我的代码看起来像这样:

class MyTest extends GebReportingSpec{

    def "Feature method 1"(){
        when:
        blah()
        then:
        doSomeStuff()
    }

    def "Feature method 2"(){
        if(someCondition){
            when:
            blah()
            then:
            doSomeMoreStuff()
        }
    }

    def "Feature method 3"(){
        when:
        blah()
        then:
        doTheFinalStuff()
    }
}

我应该注意,我使用的是自定义 spock 扩展,它允许我 运行 规范的所有特征方法,即使以前的特征方法失败也是如此。

我刚刚意识到的事情和我做这个 post 的原因是因为 "Feature method 2" 由于某种原因没有出现在我的测试结果中,但是方法 1 和 3 出现了。即使 someCondition 设置为 true,它也不会出现在构建结果中。所以我想知道为什么会这样,以及如何使这个特征方法成为条件

为了解决这个问题,我只是在 if 语句之前放置了一个具有 10 毫秒休眠的 when/then 块,现在正在执行该功能方法

您的测试没有出现在报告中,因为您不能在条件语句中包含 givenwhenthen 块。

您应该始终 运行 测试,但允许测试优雅地失败:

使用 @FailsWith 属性。 http://spockframework.org/spock/javadoc/1.0/spock/lang/FailsWith.html

@FailsWith(value = SpockAssertionError, reason = "Feature is not enabled")
def "Feature method 2"(){

    when:
    blah()
    then:
    doSomeMoreStuff()
}

重要的是要注意,当此测试因指定异常而失败时,将报告为 passed。如果启用该功能并且测试实际通过,它也会报告为 passed

Spock 对条件执行功能有特别的支持,看看@IgnoreIf and @Requires

@IgnoreIf({ os.windows })
def "I'll run everywhere but on Windows"() { ... }

你也可以在条件闭包中使用静态方法,他们需要使用限定版本。

class MyTest extends GebReportingSpec {
  @Requires({ MyTest.myCondition() })
  def "I'll only run if myCondition() returns true"() { ... }

  static boolean myCondition() { true }
}