Jasmine/Jest-Like 描述 Spock 中的块

Jasmine/Jest-Like Describe Blocks in Spock

使用 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', () => { ... })
  })
})

I was wondering if there is a way to achieve a similar describe-block structure using the Spock testing framework with Groovy?

我知道我可以很好地处理外部结构,例如:

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 文档中的 Fixture Methods,您会发现 setup 等同于 beforeEach。你在 Spock 中不做的是嵌套这些,如果你想从父级应用 setup 也可以使用继承。正如您所说,在大多数情况下,在单个测试中重复使用 when-then 是一种代码味道。如果你有这种特殊情况,那么你可能想结合 @Stepwise@Shared.

一起研究

根据您的情况,您有多种选择。

  1. 使用setup方法准备普通状态
  2. 使用在 given/setup 块中调用的辅助方法
  3. 使用 1 和继承一起组合 setup 方法

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:
  }
}

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