Spock VW:编写自定义 Spock 框架扩展

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前,正在 星球 内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 204 小节,累计 32w+ 字,讲解图:1416 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 870+ 小伙伴加入,欢迎点击围观

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


就是这样,祝测试愉快!