2017-05-15 6 views
0

Spock 및 Geb를 기반으로 한 기능 테스트가 있습니다. 이러한 테스트를 실행하기 전후에 몇 가지 작업을 수행하려고합니다. 그래서 나는 전역 확장을 만들고 그 확장의 start() 메소드와 stop() 메소드에 필요한 기능을 추가했다. 그러나 문제는 스팍 문서 (http://spockframework.org/spock/docs/1.1/all_in_one.html#_global_extensions)이 상태지만/정지 방법은 각 스팍 사양 후/전에 호출되는 시작이다 :Spock 확장 프로그램의 시작 메소드가 여러 번 호출되었습니다.

시작 (이것은 스팍 실행의 바로 그 시작에 한 번이라고합니다)

stop() Spock 실행의 마지막 순간에 한 번 호출됩니다.

이 방법의 동작에 대해 잘못된 것이 있습니까? 또는 Spock 설명서가 올바르지 않습니까?

+0

당신이 테스트를 실행하는 방법에 대한 자세한 정보를 제공 할 수 없습니다. (Maven/Gradle/...) –

+0

'mvn clean test'명령을 사용하여 테스트를 실행합니다. 그것은 전역 확장으로 구현 된 Spock 보고서 라이브러리를 사용하므로 동일한 방법으로 작동하기 때문에 각 사양 전후에 시작/중지 메서드를 호출하는 것이 좋습니다. 하지만 내가 원하는 것을 성취 할 수있는 다른 방법이있을 수 있습니다.모든 테스트 사양을 시작하기 직전에 그리고 작업을 마친 직후에 몇 가지 조치를 취할 수 있습니까? – MantasG

답변

0

@MantasG Spock은 JUnit Runner를 구현하고 실행 방법을 제어하지 않습니다. 글로벌 확장은 RunContext에서 관리되며 ThreadLocal에 보관됩니다. 확실한 테스트가 여러 스레드를 사용하여 테스트를 실행하는 경우 자체 확장 목록이 각각 RunContext 인 여러 인스턴스가 만들어집니다. EmbeddedSpecRunner을 사용하는 경우이 또한 새 격리 된 컨텍스트를 만듭니다.

이 문맥은 스레드가 죽을 때까지 머무를 것입니다. 하지만 테스트 실행이 끝나면 문맥을 제거하는 것이 더 정확할 수 있지만 JUnit Runner SPI는 적절한 후크를 제공하지 않습니다. 그 은 대부분의 환경이 각 테스트 실행에 대해 새로운 JVM을 포크하므로이 은 실제로 많은 문제가되어서는 안됩니다.

  1. 당신이 JUnitRunListener를 사용하고 testRunStarted/testRunFinished 후크를 사용할 수 있습니다 다른 방법이 수행 할 작업에 따라

. 참고로이 등록을 확실하게해야합니다.

  • 정말로 한 번만 실행하려면 확실한 대신 안전 장치를 사용하고 사전 및 통합 목표를 사용할 수 있습니다.
  • start/stop에 대해 정적 필드와 카운터를 사용하여 뭔가를 해킹하고 카운터가 0이면 시작 동작을 수행하고 카운터가 0에 도달하면 중지 동작을 수행 할 수 있습니다. 물론이 작업을 수행해야합니다. 스레드 안전. 확실한
  • 참고도 forking multiple JVMs 지원하며,이 또한 옵션 1에 영향을 미칠 3.

    +0

    Leonard, 귀하의 답변은 매우 포괄적입니다. 모든 권장 옵션을 사용하여 필요한 것을 얻을 수 있었지만 제 경우에는 Surefire 구성에서 ' false'이 있었기 때문에이 중 아무 것도 작동하지 않았습니다. 'reuseForks = true'로 전환 한 후 모든 것이 작동하기 시작했습니다. 이제는 Spock 확장을 사용하여 필요한 것을 구현할 수도 있습니다. – MantasG

    0

    내가 스팍이 당신의 테스트 스위트의 모든 테스트 사양의 시작 부분에서 호출 생각, 그래서 시작하고 중지는

    나는 당신이기구의 방법에서 살펴 봐야 할 것 같아요 그 실행의 모든 ​​일에 실행됩니다 같은 질문에 링크 된 동일한 문서에서 찾을 수 있습니다 : http://spockframework.org/spock/docs/1.1/all_in_one.html#_specification