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 <= allowedwhere: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.vwimport org.spockframework.runtime.extension.IGlobalExtension
import org.spockframework.runtime.model.SpecInfoclass 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)}@Overridevoid 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

Spock VW:编写自定义的Spock框架扩展相关推荐

  1. spock框架_Spock VW:编写自定义的Spock框架扩展

    spock框架 Spock框架具有多个内置扩展 ,这些扩展支持许多核心功能,例如@Ignore和@Timeout批注. 但更重要的是,鼓励开发人员编写自己的扩展. 例如, SpringExtensio ...

  2. EFCore3.1+编写自定义的EF.Functions扩展方法

    前言 本文主要是讲解EF Core3.0+ 如何实现自定义的数据库扩展函数,虽然EF.Functions 提供了很多数据库函数,但是并不全面.比如加密解密...这样的话 我们就需要自己扩展这些数据库函 ...

  3. Robot Framework自动化测试框架核心指南-如何使用Java编写自定义的RobotFramework Lib

    如何使用Java编写自定义的RobotFramework Lib 本文包括2个章节 1. Robot Frdamwork中如何调用java Lib库 2.使用 java编写自定义的Lib 本文作者为: ...

  4. PHP: 手把手编写自己的 MVC 框架实例教程

    1 什么是MVC MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller ...

  5. django 1.8 官方文档翻译: 6-4-2 编写自定义的django-admin命令

    编写自定义的django-admin命令 应用可以通过manage.py注册它们自己的动作.例如,你可能想为你正在发布的Django应用添加一个manage.py动作.在本页文档中,我们将为教程中的 ...

  6. 如何在ASP.NET Core中编写自定义日志记录提供程序

    目录 介绍 如何实现所需的接口 基础类和附件 FileLoggerProvider具体类及其附件 1. ConfigureLogging() 2. appsettings.json文件 介绍 源代码可 ...

  7. 从零开始编写自己的C#框架(8)——后台管理系统功能设计

    还是老规矩先吐下槽,在规范的开发过程中,这个时候应该是编写总体设计(概要设计)的时候,不过对于中小型项目来说,过于规范的遵守软件工程,编写太多文档也会拉长进度,一般会将它与详细设计合并到一起来处理,所 ...

  8. 在VSCode中自定义文件类型和扩展名关联

    目录 标题 概述 实现步骤 总结 标题 在 VSCode 中自定义文件类型和扩展名关联 Customize file type and extension associations in VSCode ...

  9. CodeGen编写自定义表达式标记

    CodeGen编写自定义表达式标记 CodeGen支持开发人员通过编写plug-in modules插件模块来定义自定义表达式标记的能力,以提供与这些标记相关联的逻辑.这种plug-in module ...

最新文章

  1. FFmpeg简介及在vc2010下编译步骤
  2. 聊一聊Java 泛型通配符 T,E,K,V,?
  3. Service Mesh — APIGW vs ServiceMesh
  4. 羡慕女设计师啊,天生色感好!
  5. c语言删除结构体数组的数据库,结构体数组的删除问题
  6. 51nod 1402 最大值 3级算法题 排序后修改限制点 时间复杂度O(m^2)
  7. 欢迎使用Augury[翻译]
  8. 新版Microsoft Edge支持跨平台跨设备浏览
  9. Dapr微服务应用开发系列4:状态管理构件块
  10. 开课吧9.9元学python靠谱吗-开课吧的Python课程怎么样?大概是多少钱?讲师是廖雪峰吗?...
  11. css中的.clearfix是什么意思?
  12. Redis.conf 详解
  13. 《数学建模与数学实验》第1章学习笔记
  14. c语言乘法除法结合律,C语言运算符的优先级和结合律
  15. UBI文件系统的制作与挂载案例
  16. [历史]读大卫的《犹太人历史》
  17. Linux:查看主机显卡
  18. 基于JAVA学生用品采购系统计算机毕业设计源码+系统+数据库+lw文档+部署
  19. [文摘20080131]89个管理定律及点评
  20. ESP32 报错is installed, but the tool failed to run

热门文章

  1. Shell入门(一)之简介
  2. 输入框限定保留三位小数点
  3. asp.net中条件查询+分页
  4. java实现人脸识别源码【含测试效果图】——Dao层(IBaseDaoUtil)
  5. Json、Gson、Jackson
  6. 交换两个数字的三种方式
  7. Android音频处理 PCM格式
  8. 小米路由器青春版装linux,比较费心的折腾 篇二:小米路由器青春版折腾负载均衡...
  9. css黑科技有限公司,css动画之黑科技
  10. kafka和storm集成_Storm和Kafka集成的重要生产错误和修复