Spock扩展的start方法多次调用

时间:2017-05-15 14:40:29

标签: testing spock geb

我有很多基于Spock和Geb的功能测试。我想在执行这些测试之前和之后执行一些操作。所以我创建了全局扩展并为该扩展的start()和stop()方法添加了所需的功能。但问题是,在每个Spock规范之前/之后调用启动/停止方法,尽管Spock文档(http://spockframework.org/spock/docs/1.1/all_in_one.html#_global_extensions)声明:

  

start()在Spock执行的最开始时调用一次

     

stop()在Spock执行结束时调用一次

我做错了什么或Spock文档对这些方法的行为不正确?

2 个答案:

答案 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,这个   在实践中不应该成为一个大问题。

根据您的目的,还有其他方法:

  1. 您可以使用JUnitRunListener并使用testRunStarted / testRunFinished个钩子。请注意,您需要通过surefire注册。
  2. 如果你真的只想运行一次,那么你可以使用故障保护而不是万无一失,并使用预集合和后整合目标。
  3. 您可以使用静态字段和计数器为每个start / stop调用进行攻击,并在计数器为0时执行启动操作,并在计数器达到0时执行停止操作。当然,你需要使这个线程安全。
  4. 请注意,surefire还支持forking multiple JVMs,这也会影响选项1和3。