Spock框架具有多个内置扩展 ,这些扩展支持许多核心功能,例如@Ignore
和@Timeout
批注。 但更重要的是,鼓励开发人员编写自己的扩展。 例如, SpringExtension
很好地将Spock与Spring框架集成在一起。 编写自定义扩展没有很好的文档记录。 在本文中,我们将编写非常简单的扩展。 它不是一个全面的指南,而只是一个有趣的展示。
介绍Spock大众扩展
在某些工程部门[1],只有在进行外部审核时,才必须通过严格的测试。 在编程中,这将是一个连续集成服务器。 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服务器:
package com.nurkiewicz.vw
import org.spockframework.runtime.extension.IGlobalExtension
import org.spockframework.runtime.model.SpecInfo
class VwExtension implements IGlobalExtension {
private static final CONTROLLED_ENV = [
'bamboo.buildKey',
'BUILD_ID', 'BUILD_NUMBER', 'BUILDKITE',
'CI', 'CIRCLECI',
'CONTINUOUS_INTEGRATION',
'GOCD_SERVER_HOST',
'HUDSON_URL', 'JENKINS_URL',
'TEAMCITY_VERSION',
'TRAVIS',
]
private static final boolean EVERYTHING_IS_FINE =
CONTROLLED_ENV.any {prop ->
System.getProperty(prop) || System.getenv(prop)}
@Override
void visitSpec(SpecInfo spec) {
if (EVERYTHING_IS_FINE) {
spec.features*.skipped = true
}
}
}
VwExtension
就像代码库中每个Specification
一个方面。 它检查已知环境变量的列表,并且如果存在any()
环境变量( EVERYTHING_IS_FINE
常量),则将跳过此Spec
中的所有features
(测试)。 还有一件事。 不会自动发现扩展,您必须在CLASSPATH的META-INF/services
目录下创建一个特殊的org.spockframework.runtime.extension.IGlobalExtension
文件(当然它可以在其他JAR中)。 该文件的内容只是扩展类的完全限定名称,例如com.nurkiewicz.vw.VwExtension
。
就是这样,祝您测试愉快!
翻译自: https://www.javacodegeeks.com/2015/10/spock-vw-writing-custom-spock-framework-extensions.html