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

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

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 63w+ 字,讲解图 2808+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2200+ 小伙伴加入学习 ,欢迎点击围观

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


就是这样,祝测试愉快!

相关文章