Groovy Jasmine/斯波克中类似玩笑的描述块

Groovy Jasmine/斯波克中类似玩笑的描述块,groovy,spock,Groovy,Spock,使用JavaScript测试框架,如Jasmine或Jest,我可以这样组织测试: describe('someFunction', () => { beforeEach(() => { // do some setup for each describe block }) describe('some scenario', () => { beforeEach(() => { // do some setup before ea

使用JavaScript测试框架,如Jasmine或Jest,我可以这样组织测试:

describe('someFunction', () => {
  beforeEach(() => {
    // do some setup for each describe block
  })

  describe('some scenario', () => {
    beforeEach(() => {
      // do some setup before each test case
    })

    test('some test case', () => { ... })
    test('another test case', () => { ... })
  })

  describe('some other scenario', () => {
    beforeEach(() => {
      // do some setup before each test case
    })

    test('some test case', () => { ... })
    test('another test case', () => { ... })
  })
})
我想知道是否有一种方法可以使用Groovy的Spock测试框架来实现类似的描述块结构

我知道我可以拥有良好的外部结构,例如:

class SomeFunctionSpec extends Specification {
  def setup() {
    // do some setup before each feature method
  }

  void "some Function"() {
    given: "some setup before this test"
    // ...

    when: 
    // ...
    then: 
    // ...

    when:
    // ...
    then:
    // ...
  }
}
我觉得有太多的when-then会让事情变得太混乱,我想在不同的特性方法中分离测试用例,但是在相同的设置场景下。这样,我不必每次都在给定的块中执行相同的操作(但也不会影响外部块,也不会创建可能会影响其他场景的数据)。

如果您查看Spock文档中可以看到,
设置
相当于每个之前的
。在Spock中,您不需要嵌套这些,如果您想从父级应用
设置
,您可以使用继承。正如您所说,在单个测试中反复使用when-then在大多数情况下都是一种代码味道。如果您有这种特殊情况,那么您可能希望结合
@Shared
逐步研究
@Shared

根据您的场景,您有几个选项

  • 使用
    设置
    方法准备公共状态
  • 使用在
    给定
    /
    设置
    块中调用的帮助器方法
  • 将1与继承一起使用可组合
    设置
    方法

  • 请注意,在基类中声明的测试也将在子类中执行。

    给定的
    下的任何内容:“此测试之前的一些设置”
    可以转到规范本身内部的一个私有帮助器方法,然后在每个功能方法的
    给定:
    设置:
    块中调用该方法。对于每个继承的类,我必须在设置()中调用super吗?很高兴听到这个消息!顺便问一下,第二个类应该命名为Scenario2Spec吗?:)
    
    abstract class BaseScenarioSpec extends Specification {
      def setup() {
        // do some setup before each feature method
      }
    }
    
    class Scenario1Spec extends BaseScenarioSpec {
      def setup() {
        // do some setup before each test case
      }
    
      def "some test"() {
        when: //stimulus
        then: //verification
      }
    }
    
    
    class Scenario2Spec extends BaseScenarioSpec {
      def setup() {
        // do some setup before each test case
      }
    
      def "some other test"() {
        expect:
      }
    }