【问题标题】:How to execute setupSpec() only once for all inheritable classes in Spock如何对 Spock 中的所有可继承类只执行一次 setupSpec()
【发布时间】:2020-06-13 12:34:01
【问题描述】:

我的测试位于不同的类中,这些类从 BaseSpec 类扩展而来,而后者又从 Spock 框架的 Specification 类扩展。

class BaseSpec extends Specification {
    def setupSpec() {
        println('run setupSpec() from BaseSpec')
    }

    def cleanupSpec() {
        println('run cleanupSpec() from BaseSpec')
    }
}
class FirstTestClass extends BaseSpec {
    def setup() {
        println('run setup() from FirstTestClass')
    }

    def cleanup() {
        println('run cleanup() from FirstTestClass')
    }

    def 'do test1'() {
        given:
        println('run "do test1" from FirstTestClass')
    }
}
class SecondTestClass extends BaseSpec {
    def setup() {
        println('run setup() from SecondTestClass')
    }

    def cleanup() {
        println('run cleanup() from SecondTestClass')
    }

    def 'do test2'() {
        given:
        println('run "do test2()" from SecondTestClass')
    }
}

正如预期的那样,setupSpec()cleanupSpec() 为每个可继承类执行。

run setupSpec() from BaseSpec
run setup() from FirstTestClass
run "do test1" from FirstTestClass
run cleanup() from FirstTestClass
run cleanupSpec() from BaseSpec

run setupSpec() from BaseSpec
run setup() from SecondTestClass
run "do test2()" from SecondTestClass
run cleanup() from SecondTestClass
run cleanupSpec() from BaseSpec

有没有办法只执行一次setupSpec()cleanupSpec()?或者我只能将所有特征方法放在一个类中?

谢谢!

【问题讨论】:

  • 有趣。我能问一下你为什么想要吗?
  • 但在回答你的问题时,我不相信你可以
  • 是的,就在setupSpec 我想打开与服务器的连接。目前,在每个类的运行测试期间打开然后关闭连接看起来很奇怪。这是测试的历史结构。
  • 我会警惕打开持续所有测试的连接。将其移至基类听起来很明智,然后必须使用相同连接的测试可以在相同规范中

标签: groovy spock


【解决方案1】:

我认为你不应该这样做,我同意蒂姆的观点。但是如果你坚持,如果你实现了global extension,你可以在Spock执行的开始/结束时做一些事情:

只需使用start()stop() 方法。您还可以保持全局状态并使用 visitSpec(SpecInfo) 为特定的一组测试做您想做的事情 - 无论您的创意是什么。

如果此指针给您留下后续问题,请告诉我。

【讨论】:

  • 感谢您的建议!还有一个问题。如果我需要一个共享对象(用于连接的客户端)来进行所有测试怎么办。因此,对象应该只初始化一次并且在所有测试中都可用(在所有测试类中)。执行完所有测试后,对象应该被销毁。在这种情况下,实施 GlobalExtension 没有帮助,我说得对吗?
  • 是什么让你这么想?我告诉你的正是解决了这种情况。请再读一遍,也请点击链接。
【解决方案2】:

如果你只想运行一次setupSpec,你可以在你的BaseSpec类中做这样的事情:

static INITIALIZED_BASESPEC = false

def setupSpec() {
    if (!INITIALIZED_BASESPEC) {

        //Do setup stuff
        
        INITIALIZED_BASESPEC = true
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 2013-12-08
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多