如何让 Spock 重试失败的 Geb 测试?

问题描述 投票:0回答:3

我对使用 Geb 和 Spock 的 Grails 应用程序进行了功能测试。 有时,功能测试会因超时或其他零星行为而失败。在以前使用 TestNG 的项目中,我有一个 retryAnalyzer 只是在测试执行期间触发重试,看看它是否两次都失败(然后真正失败)。

如何让 Spock 重试失败的测试?

grails groovy spock geb
3个回答
9
投票

我知道这个问题已经存在一年了,但我们也遇到了同样的问题。按照 Peter 的建议,我创建了一个 Spock 扩展 (https://github.com/anotherchrisberry/spock-retry)。

如果您有基本规范(这是我们的情况),您只需添加

@RetryOnFailure
注释即可:

@RetryOnFailure
class BaseFunctionalSpec extends Specification {
    //    all tests will execute up to two times before failing
}

或者,您可以将其添加到特定功能:

class SomeSpec extends Specification {

    @RetryOnFailure(times=3)
    void 'test something that fails sporadically'() {
        // will execute test up to three times before failing
    }
}

2
投票

您必须编写一些 JUnit 规则(例如 https://gist.github.com/897229 )或 Spock 扩展。您可能必须忍受一些限制,例如重复使用相同的规范实例以及 JUnit 仅报告单个测试,但希望没有什么可以完全排除该方法。 (我想到的一件事是,模拟可能不起作用。)在 Spock 的未来版本中,重复测试(或其构建块)可能会成为一流的概念,从而消除这些限制。


0
投票

万一有人遇到这种情况。 Spock 从 1.2 版本开始就有注释

@Retry
。用法示例:

import spock.lang.Retry
import spock.lang.Specification

@Retry
class SomeSpec extends Specification {
    // all features will be retried on failure
}

或者可以应用于特定功能:

import spock.lang.Retry
import spock.lang.Specification

class SomeSpec extends Specification {
    @Retry
    def 'test something flaky'() {
        // this feature is retried up to 3 times (default)
    }

    def 'test something stable'() {
        // this feature is tested only once
    }
}

注解也可以应用于父类,在这种情况下,它应用于所有子类(除非它们声明自己的注解)。 默认情况下,如果抛出

Exception
AssertionError
,则会重试测试。

© www.soinside.com 2019 - 2024. All rights reserved.