Spock 框架 有多个 内置扩展 ,支持许多核心功能,例如:
@Ignore
、
@Timeout
和注解。但更重要的是,鼓励开发人员编写自己的扩展。例如,SpringExtension 很好地将 Spock 与 Spring 框架集成在一起。编写自定义扩展没有很好的文档记录。在本文中,我们将编写非常简单的扩展。这不是一个全面的指南,而只是一个有趣的展示。
介绍 Spock VW Extension
Spock VW 扩展 确保所有测试都在 CI 服务器上通过,即使它们在开发人员机器或生产环境中失败。这个想法很大程度上受到了 phpunit-vw 的启发。让我们来看这个简单的、完全编造的测试,但它不可能成功:
@Unroll
class EmissionsSpec extends Specification {
def 'nitrogen oxide emission (#emission) in #model must not exceed #allowed'() {
expect:
emission <= allowed
where:
model | emission || allowed
'Jetty' | 1.5 || 0.022
'Pascal' | 0.67 || 0.016
}
def 'carbon dioxide'() {
expect:
105 < 130
}
}
两个样本的第一次测试显然都失败了,但我们可以透明地添加一个 Spock 扩展,以确保没有 CI 服务器捕获到这个问题。该扩展只是检查所有系统属性和环境变量,试图发现主机环境是否实际上是一个 CI 服务器:
@Unroll
class EmissionsSpec extends Specification {
def 'nitrogen oxide emission (#emission) in #model must not exceed #allowed'() {
expect:
emission <= allowed
where:
model | emission || allowed
'Jetty' | 1.5 || 0.022
'Pascal' | 0.67 || 0.016
}
def 'carbon dioxide'() {
expect:
105 < 130
}
}
VwExtension
就像是代码库中每个
Specification
一个方面。它检查已知环境变量的列表,如果存在其中的
any()
(
EVERYTHING_IS_FINE
常量),则所有
跳过此
Spec
中的
features
(测试)。还有一件事。不会自动发现扩展,您必须在
META-INF
中创建
org.spockframework.runtime.extension.IGlobalExtension
;
CLASSPATH
上的目录(当然它可以在不同的 JAR 中)。该文件的内容只是扩展类的完全限定名称,例如
com.nurkiewicz.vw.VwExtension
就是这样,祝测试愉快!