Testing Spock扩展';s的start方法被多次调用

Testing Spock扩展';s的start方法被多次调用,testing,spock,geb,Testing,Spock,Geb,我有一系列基于Spock和Geb的功能测试。我想在执行这些测试之前和之后执行一些操作。所以我创建了全局扩展,并添加了该扩展的start()和stop()方法所需的功能。但问题是,在每个Spock规范之前/之后都会调用start/stop方法,尽管Spock documentation()声明: start()在Spock执行的最开始调用一次 stop()在Spock执行的最后调用一次 我是否做了一些错误的事情,或者Spock文档对这些方法的行为不正确?我相信Spock在测试套件中的每个测试规范开

我有一系列基于Spock和Geb的功能测试。我想在执行这些测试之前和之后执行一些操作。所以我创建了全局扩展,并添加了该扩展的start()和stop()方法所需的功能。但问题是,在每个Spock规范之前/之后都会调用start/stop方法,尽管Spock documentation()声明:

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

stop()在Spock执行的最后调用一次


我是否做了一些错误的事情,或者Spock文档对这些方法的行为不正确?

我相信Spock在测试套件中的每个测试规范开始时都会被调用,所以每次执行时都会运行start和stop

我想您可能想看看您在问题中链接的同一文档中找到的Fixture方法:
@MantasG Spock实现JUnit Runner,不控制它的执行方式。全局扩展是在
RunContext
中管理的,它保存在
ThreadLocal
中。如果surefire使用多个线程执行测试,那么这将创建多个
RunContext
实例,每个实例都有自己的全局扩展列表。如果您使用的是
EmbeddedSpecRunner
,那么这也会创建一个新的隔离上下文

该上下文将一直存在,直到线程结束。是的 更准确地说,在测试运行完成后删除上下文, 但是JUnitRunner SPI没有提供足够的钩子。那个 也就是说,由于大多数环境在每次测试运行时都会产生一个新的JVM,因此 在实践中应该不是什么大问题

根据您想做什么,还有其他方法:

  • 您可以使用和使用
    testRunStarted
    /
    testRunFinished
    挂钩。请注意,您需要通过surefire进行注册
  • 如果您真的只想运行一次,那么您可以使用failsafe而不是surefire,并使用集成前后的目标
  • 您可以为每个
    开始
    /
    停止
    调用使用一个静态字段和一个计数器来破解某些东西,如果计数器为0,则执行开始操作,一旦计数器达到0,则执行停止操作。当然,您需要确保此线程的安全性

  • 请注意,surefire还支持,这也会影响选项1和3。

    能否提供有关如何运行测试的更多信息。(Maven/Gradle/…)我使用“mvn clean test”命令运行测试。我想在每个规范之前/之后调用start/stop方法是出于设计考虑的,因为我使用了Spock reports库,它也是作为全局扩展实现的,并且以同样的方式工作。但也许还有其他方法可以实现我所需要的,即在开始所有测试规范之前和完成之后调用一些操作一次?谢谢你Leonard,你的答案非常全面。所有建议的选项都可以用来实现我所需要的,但在我的情况下,这些选项都不起作用,因为我的Surefire配置中有“false”。在我切换到“reuseForks=true”之后,一切都开始工作了。现在我甚至可以使用Spock扩展来实现我所需要的。