使用groovy+spock优雅的进行单测

news2025/1/9 1:47:41

使用groovy+spock优雅的进行单测

  • 1. groovy+spock示例
    • 1.1 简单示例
    • 1.2 增加where块的示例
    • 1.3 实际应用的示例
  • 2. 单测相关问题
    • 2.1 与SpringBoot融合
    • 2.2 单测数据与测试数据隔离
    • 2.3 SQL自动转换(MySQL -> H2)
  • 参考

Groovy是一种基于JVM的动态语言,它可以与Java代码无缝集成。Spock是一个基于Groovy的测试框架,专注于简洁性和可读性。它提供了丰富的测试DSL(领域特定语言),支持行为驱动开发(BDD)风格的测试。

使用Groovy和Spock进行单元测试时,你可以利用Spock的特性编写清晰、易读的测试用例。通过given, when, thenwhere块,你可以清晰地描述测试的前提条件、操作和预期结果。同时,Spock还提供了@Unroll注解,可以让你以数据驱动的方式执行测试用例,从而更全面地覆盖不同的测试场景。

要使用Groovy和Spock进行单元测试,你可以创建一个继承自spock.lang.Specification的测试类,编写测试用例并使用given, when, thenwhere块来描述测试逻辑和数据驱动的测试场景。

1. groovy+spock示例

1.1 简单示例

import spock.lang.Specification

class MathSpec extends Specification {
    
    def "addition test"() {
        given: "two numbers"
        def a = 5
        def b = 3
        
        when: "adding the numbers"
        def result = a + b
        
        then: "the result should be correct"
        result == 8
    }
    
    def "division test"() {
        given: "two numbers"
        def a = 10
        def b = 2
        
        when: "dividing the numbers"
        def result = a / b
        
        then: "the result should be correct"
        result == 5
    }
}

在这个示例中,我们创建了一个MathSpec测试类,其中包含了两个测试用例addition test和division test。每个测试用例都包含了given, when和then块,分别描述了测试的前提条件、操作和预期结果。

你可以在given块中设置测试所需的初始条件,在when块中执行操作,而then块用于验证预期结果。这种清晰的结构使得测试用例易于理解和维护。

如果需要对多组数据执行相同的测试逻辑,可以使用where块和@Unroll注解来进行数据驱动的测试。

1.2 增加where块的示例

import spock.lang.Specification

class MathSpec extends Specification {

    def "multiplication test"(int a, int b, int expected) {
        expect:
        a * b == expected

        where:
        a | b | expected
        2 | 3 | 6
        5 | 5 | 25
        10 | 4 | 40
    }
    
    @Unroll
    def "division test"(int a, int b, int expected) {
        expect:
        a / b == expected

        where:
        a | b | expected
        10 | 2 | 5
        20 | 4 | 5
        30 | 3 | 10
    }
}

在这个示例中,我们定义了两个测试用例,分别是multiplication test和division test。每个测试用例都使用where块提供了多组输入数据。@Unroll注解用于展开测试结果,使得每组数据都会生成一个独立的测试用例。

通过这种方式,可以很方便地对多组输入数据执行相同的测试逻辑,并清晰地了解每组数据的测试结果。

1.3 实际应用的示例

在实际开发过程中,验证创建患者信息的不同场景,包含:

  • 创建成功
  • 重复创建
  • 患者信息为空的情形
    在这里插入图片描述

2. 单测相关问题

2.1 与SpringBoot融合

通常创建一个基类,添加@SpringBootTest注解,并继承 spock.lang.Specification 类。

@SpringBootTest
@ContextConfiguration(classes = Application.class)
class BaseTest extends Specification {
	@Autowired
    protected H2Flusher h2Flusher;

    void setup() {
        h2Flusher.flushDB();
    }

    void cleanup() {

    }
}

2.2 单测数据与测试数据隔离

通常采用内存数据库进行处理,比如H2,最好使用单独的Profile进行单测。

Springboot下H2数据库的配置

# 数据源配置
spring:
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    url: jdbc:h2:mem:database_name;DB_CLOSE_DELAY=-1;MODE=MYSQL
    username: sa
    password: 
    driver-class-name: org.h2.Driver
    hikari:
      connection-test-query: SELECT 1
      maximum-pool-size: 10
  h2:
    console:
      path: /h2
      enabled: true
      settings:
        trace: true
        web-allow-others: true
  sql:
    init:
      platform: h2
      schema-locations: classpath*:sql/init/schema/schema-{platform}.sql
      data-locations: classpath*:sql/init/data/data-{platform}.sql

在H2数据库的URL中,MODE=MYSQL参数的意思是使用MySQL兼容模式。当你在H2数据库的URL中添加MODE=MYSQL参数时,H2数据库会尽可能地模拟MySQL的行为,以便在开发和测试过程中,更好地与MySQL进行集成和迁移。

这意味着你可以使用类似于MySQL的语法和功能,例如特定的SQL语法、函数、存储过程等。这对于在开发阶段使用H2数据库进行测试,并在生产环境中使用MySQL数据库的情况非常有用。

2.3 SQL自动转换(MySQL -> H2)

通常会在用例执行前后进行一些脚本加载和数据清理的工作,基于MySQL的SQL语句在H2环境中可能无法执行,我们又不想维护两套SQL。因此我们可以只提供MySQL的SQL语句,通过提供转换工具实现SQL语句的自动转换。可以使用开源工具,如

mysql2h2-converter

当将基于MySQL的SQL语句转换为H2数据库的SQL语句时,需要注意以下几个主要的差异点:

  • 数据类型差异:

    • MySQL中的DATETIME类型在H2中对应为TIMESTAMP类型。
    • MySQL中的AUTO_INCREMENT在H2中对应为IDENTITY。
    • MySQL中的INT类型在H2中对应为INTEGER类型。
  • SQL语法差异:

    • H2数据库对日期函数的支持可能有所差异,例如日期格式化函数或日期运算函数的语法可能略有不同。
    • 字符串函数的一些用法和语法可能在H2中略有不同,例如字符串拼接函数的语法。
  • 存储过程和触发器:

    • H2数据库的存储过程和触发器支持相对有限,一些复杂的存储过程和触发器可能需要重新设计为触发H2数据库的特定语法和功能。
  • SQL方言:

    • 在一些特定的SQL语句中,例如分页查询、行锁定等,MySQL和H2数据库的语法可能存在差异,需要根据H2数据库的语法规范进行调整。

这些差异点需要在进行数据库迁移时仔细考虑和验证,以确保转换后的SQL语句在H2数据库中能够正确执行。

参考

MySQL 脚本转 H2
mysql2h2-converter
how to get mysql2h2-converter v0.3.1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1636214.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安卓获取SHA

1:安卓通过签名key获取SHA 方式有两种, 1、电脑上来存在eclipse的用户或正在使用此开发工具的用户就简单了,直接利用eclipse 走打包流程,再打包的时候选择相应的签名,那么在当前面板的下面便会出现签名的相关信息。 2、…

Java根据模板动态生成Pdf(添加页码、文件加密、Spire免费版本10页之后无法显示问题、嵌入图片添加公章、转Base64)

Java根据模板动态生成Pdf:添加页码、文件加密、Spire免费版本10页之后无法显示问题、嵌入图片添加公章、转Base64 引言【Java根据模板动态生成Pdf资源地址】示例一:动态生成带页码的PDF报告示例二:加密PDF以保护敏感信息示例三:应…

netty整合springboot之后自动重连失效,如何解决?

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

【AIGC调研系列】InternVL开源多模态模型与GPT-4V的性能对比

InternVL和GPT-4V都是多模态模型,但它们在性能、参数量以及应用领域上有所不同。 InternVL是一个开源的多模态模型,其参数量为60亿,覆盖了图像/视频分类、检索等关键任务,并在32个视觉-语言基准测试中展现了卓越性能[2]。InternV…

设计模式-01 设计模式单例模式

设计模式-01 设计模式单例模式 目录 设计模式-01 设计模式单例模式 1定义 2.内涵 3.使用示例 4.具体代码使用实践 5.注意事项 6.最佳实践 7.总结 1 定义 单例模式是一种设计模式,它确保一个类只能被实例化一次。它通过在类内部创建类的唯一实例并提供一个全…

c#数据库: 10.调用存储过程查询信息,并显示在窗体上

查询女生信息,并将信息显示在窗体上: 原数据表//右键数据库名,新建查询 ------------- 新建查询窗口,添加新建存储过程Procedure_GetGirls1和查询代码如下 : CREATE PROCEDURE dbo.Procedure_GetGirls1 /*存储过程名称*/ AS SELECT * f…

变电站自动化控制系统应用案例分析

变电站自动化控制系统介绍 变电站自动化控制系统用于大中型企业变电站项目,这类企业变压器多,日耗电量大。把多个变压器集中到一个电器平台上,集中管理分析,优化厂区用电管理,从而达到集中控制、集中分析、集中管理的…

【Unity 自定义组件】

想了解更多游戏开发知识,可以扫描下方二维码,免费领取游戏开发4天训练营课程 在Unity中,自定义组件(Custom Component)是指开发者根据游戏的具体需求编写的C#脚本,这些脚本可以附加到游戏对象(GameObject)…

如何远程访问服务器?

在现代信息技术的快速发展下,远程访问服务器已成为越来越多用户的需求。远程访问服务器能够让用户随时随地通过网络连接服务器,实现数据的传输和操作。本文将介绍远程访问服务器的概念,以及一种广泛应用于不同行业的远程访问解决方案——【天…

标准汽车试验铁地板的技术要求

在现代科技化发展的工作中,试验平台被广泛使用。铸铁试验平台(试验铁地板)又叫试验工作平台,听名字大家也不难想象出来这是一款带有箱式体的台面,这是一种有长方形或者圆形又或者正方形的试验工作台。 铸铁试验平台&a…

QT5制做两个独立窗口

目录 增加第二个窗口 主窗口文件添加一个私有成员为子窗口 定义两个槽函数和 关联按钮和子窗口和主窗口 添加子窗口成员 子窗口处理函数 补充回顾 增加第二个窗口 1、 2、 3 主窗口文件添加一个私有成员为子窗口 在mainwidget.h文件 同时添加两个槽;来处理…

(成品论文22页)24深圳杯数学建模A题1-4问完整代码+参考论文重磅更新!!!!

论文如下: 基于三球定位的多个火箭残骸的准确定位 针对问题一:为了进行单个残骸的精确定位,确定单个火箭残骸发生音爆 时的精确位置和时间,本文基于三球定位模型,考虑到解的存在性和唯一性, 选取了四个监测…

AI大模型日报#0430:疑似GPT4.5模型刷屏、上交实现「蛋白质功能定向进化」、微软紧急撤回WizardLM-2

导读: 欢迎阅读《AI大模型日报》,内容基于Python爬虫和LLM自动生成。目前采用“文心一言”生成了今日要点以及每条资讯的摘要。 《AI大模型日报》今日要点: 在AI大模型领域,多项研究进展和行业应用动态引发关注。一夜之间&#x…

第9篇:创建Nios II工程之读取Switch的值<二>

Q:上一期我们完成了Quartus硬件工程部分,本期我们创建Nios II软件工程这部分。 A:创建完BSP和Nios II Application之后,在source文件main.c中添加代码:system.h头文件中新增了Switch PIO IP的硬件信息,包括…

气象数据nc数据矢量化处理解析及可视化

气象数据可视化是将气象学领域中复杂的数据集转化为图形或图像的过程,以直观展示天气现象、气候模式、趋势和预报结果。气象数据的可视化技术广泛应用于科学研究、气象预报、航空、航海、农业生产、灾害预警系统、城市规划、公众服务等领域。以下是一些关键的气象数…

Stability AI 推出稳定音频 2.0:为创作者提供先进的 AI 生成音频

概述 Stability AI 的发布再次突破了创新的界限。这一尖端模型以其前身的成功为基础,引入了一系列突破性的功能,有望彻底改变艺术家和音乐家创建和操作音频内容的方式。 Stable Audio 2.0 代表了人工智能生成音频发展的一个重要里程碑,为质量…

口袋实验室--使用AD2学习频谱参数测试

目录 1. 简介 2. 频谱相关参数 2.1 频谱相关基本概念 2.1.1 采样时间间隔 2.1.2 采样频率 2.1.3 采样点数 2.1.4 采样时间长度 2.1.5 谱线数 2.1.6 奈奎斯特频率 2.1.7 频谱分辨率 2.1.8 最高分析频率 2.1.9 频谱泄露 2.2 窗函数 2.2.1 AD2的窗函数 2.2.2 测试矩…

Cesium 3dTileset 支持 uv 和 纹理贴图

原理: 使用自定义shader实现uv自动计算 贴图效果: uv效果:

链表算法题总结

链表作为一个基础的数据结构,在开发中经常被使用。 链表往往使用如下的数据结构来表示,struct node 表示链表中的一个节点,data 表示节点的数据;next 表示这个节点指向的下一个节点,如果是链表的尾节点,那…

Vulnhub-DIGITALWORLD.LOCAL: VENGEANCE渗透

文章目录 前言1、靶机ip配置2、渗透目标3、渗透概括 开始实战一、信息获取二、smb下载线索三、制作字典四、爆破压缩包密码五、线索分析六、提权!!! Vulnhub靶机:DIGITALWORLD.LOCAL: VENGEANCE ( digitalworld.local: VENGEANCE …