我有很多基于Spock和Geb的功能测试。我想在执行这些测试之前和之后执行一些操作。所以我创建了全局扩展并为该扩展的start()和stop()方法添加了所需的功能。但问题是,在每个Spock规范之前/之后调用启动/停止方法,尽管Spock文档(http://spockframework.org/spock/docs/1.1/all_in_one.html#_global_extensions)声明:
start()在Spock执行的最开始时调用一次
stop()在Spock执行结束时调用一次
我做错了什么或Spock文档对这些方法的行为不正确?
答案 0 :(得分:0)
我相信Spock是在测试套件中每个测试规范的开头调用的,所以每次执行都会启动和停止
我想你可能想看一下你在问题中链接的同一个doc中找到的Fixture方法: http://spockframework.org/spock/docs/1.1/all_in_one.html#_specification
答案 1 :(得分:0)
@MantasG Spock实现了一个JUnit Runner,但不控制它的执行方式。全局扩展程序以RunContext
进行管理,并保存在ThreadLocal
中。如果surefire使用多个线程来执行测试,那么这将创建多个RunContext
实例,每个实例都有自己的全局扩展列表。如果您使用的是EmbeddedSpecRunner
,那么这也会创建一个新的隔离上下文。
此上下文将一直存在,直到线程死亡。这将是 测试运行完成后,更准确地删除上下文 但是JUnit Runner SPI并没有提供足够的钩子。那 说,因为大多数环境为每次测试运行分叉一个新的JVM,这个 在实践中不应该成为一个大问题。
根据您的目的,还有其他方法:
testRunStarted
/ testRunFinished
个钩子。请注意,您需要通过surefire注册。 start
/ stop
调用进行攻击,并在计数器为0时执行启动操作,并在计数器达到0时执行停止操作。当然,你需要使这个线程安全。请注意,surefire还支持forking multiple JVMs,这也会影响选项1和3。