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
.
一起研究
根据您的情况,您有多种选择。
- 使用
setup
方法准备普通状态
- 使用在
given
/setup
块中调用的辅助方法
- 使用 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 中执行。
使用 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
.
根据您的情况,您有多种选择。
- 使用
setup
方法准备普通状态 - 使用在
given
/setup
块中调用的辅助方法 - 使用 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 中执行。