Spock中的Jasmine / Jest-Like描述块

时间:2017-04-27 17:53:00

标签: groovy spock

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

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 测试框架来实现类似的describe-block结构?

我知道我的外部结构可以很好,因此:

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

我觉得有太多时间 - 然后让事情太混乱,并且想要在不同的功能方法中分离测试用例,但是在相同的设置方案下。这样,我不必每次都在给定的块中做同样的事情(但也不会影响外部块,而不会创建可能影响其他场景的数据)。

1 个答案:

答案 0 :(得分:1)

如果您查看Spock文档中的Fixture Methods,您可以看到,setup相当于beforeEach。你在Spock中没有做的就是嵌套这些,你可以使用继承,如果你想从父应用中setup。正如你所说的那样,在一次测试中反复使用,然后在大多数情况下使用代码气味。如果您有这种特殊情况,那么您可能希望与@Stepwise一起调查@Shared

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

  1. 使用setup方法准备公共状态
  2. 使用given / setup
  3. 中调用的辅助方法
  4. 将1与继承结合使用以合并setup种方法
  5. 
    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:
      }
    }
    

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