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

使用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.Specificationclass MathSpec extends Specification {def "addition test"() {given: "two numbers"def a = 5def b = 3when: "adding the numbers"def result = a + bthen: "the result should be correct"result == 8}def "division test"() {given: "two numbers"def a = 10def b = 2when: "dividing the numbers"def result = a / bthen: "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.Specificationclass MathSpec extends Specification {def "multiplication test"(int a, int b, int expected) {expect:a * b == expectedwhere:a | b | expected2 | 3 | 65 | 5 | 2510 | 4 | 40}@Unrolldef "division test"(int a, int b, int expected) {expect:a / b == expectedwhere:a | b | expected10 | 2 | 520 | 4 | 530 | 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 {@Autowiredprotected H2Flusher h2Flusher;void setup() {h2Flusher.flushDB();}void cleanup() {}
}

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

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

Springboot下H2数据库的配置

# 数据源配置
spring:datasource:type: com.zaxxer.hikari.HikariDataSourceurl: jdbc:h2:mem:database_name;DB_CLOSE_DELAY=-1;MODE=MYSQLusername: sapassword: driver-class-name: org.h2.Driverhikari:connection-test-query: SELECT 1maximum-pool-size: 10h2:console:path: /h2enabled: truesettings:trace: trueweb-allow-others: truesql:init:platform: h2schema-locations: classpath*:sql/init/schema/schema-{platform}.sqldata-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.hqwc.cn/news/659938.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用户中心(中)

文章目录 数据库设计用户表建表 登录/注册后端一、规整项目目录二、实现基本数据库操作自动生成器的使用**(1) 模型 user 对象自动生成****(2) 测试一下** 三、注册逻辑四、测试 数据库设计 1.什么是数据库?存数据的 2.数据库里有什么?数据表(理解为exce…

基于ST的STM32F407ZGT6嵌入式uCOS-III V3.08 操作系统工程实验

1.基于的开发板 2.原理图截图: 3.主控芯片框图与性能特点: High-performance foundation line, Arm Cortex-M4 core with DSP and FPU, 1 Mbyte of Flash memory, 168 MHz CPU, ART Accelerator, Ethernet, FSMC The STM32F405xx and STM32F407xx family is based on the high…

分布式与一致性协议之Paxos算法(二)

Paxos算法 如何达成共识 想象这样一个场景,某地出现突发事件,当地村委会、负责人等在积极研究和搜集解决该事件的解决方案,你也决定参与其中,提交提案,建议一些解决方法。为了和其他村民的提案做区分,你的…

Transformer实战 单词预测

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍦 参考文章:TensorFlow入门实战|第3周:天气识别🍖 原作者:K同学啊|接辅导、项目定制 一、定义模型 from tempfile import Tempor…

在config.json文件中配置出来new mars3d.graphic.PolylineCombine({大量线合并渲染类型的geojson图层

在config.json文件中配置出来new mars3d.graphic.PolylineCombine({大量线合并渲染类型的geojson图层 问题场景: 1.浏览官网示例的时候图层看到大量线数据合并渲染的示例 2.矢量数据较大量级的时候,这种时候怎么在config.json文件中尝试配置呢&#x…

大数据运维之数据质量管理

第1章 数据质量管理概述 1.1 数据质量管理定义 数据质量管理(Data Quality Management),是指对数据从计划、获取、存储、共享、维护、应用、消亡生命周期的每个阶段里可能引发的各类数据质量问题,进行识别、度量、监控、预警等一…

【好书推荐8】《智能供应链:预测算法理论与实战》

【好书推荐8】《智能供应链:预测算法理论与实战》 写在最前面编辑推荐内容简介作者简介目录精彩书摘前言/序言我为什么要写这本书这本书能带给你什么 致谢 🌈你好呀!我是 是Yu欸 🌌 2024每日百字篆刻时光,感谢你的陪伴…

ARP学习及断网攻击

1.什么是ARP ARP(Address Resolution Protocol)是一种用于在IPv4网络中将IP地址映射到MAC地址的协议。在计算机网络中,每个网络接口都有一个唯一的MAC地址(Media Access Control address),用于识别网络设备…

tomcat部署

1.客户端和服务器端的交互过程 客户端发送请求给服务器 由服务器中的服务器软件拦截请求 根据请求调动相应的Java业务逻辑执行相关的处理 我们前面知道Java代码的运行势必提前将其装载在JVM上 而服务器软件一般都是由Java代码编写 所以两者都要装载在JVM上 而Java业务逻辑装载…

个人学习资源整理

文章目录 视频相关stl源码讲解相关 网站相关CPP网站 视频相关 stl源码讲解相关 跳转 网站相关 CPP网站 https://cplusplus.com/ https://gcc.gnu.org/

C语言实验-函数与模块化程序设计

一: 编写函数fun,其功能是:输入一个正整数,将其每一位上为偶数的数取出重新构成一个新数并输出。主函数负责输入输出,如输入87653142,则输出8642。(main函数->fun函数) #define _…

解决RuntimeError: cuDNN error: CUDNN_STATUS_EXECUTION_FAILED

下图说明在一瞬间我的GPU就被占满了 我的模型在训练过程中遇到了 CUDA 相关的错误,这是由于 GPU资源问题或内存不足导致的。这类错误有时候也可能是由于某些硬件兼容性问题或驱动程序问题引起的。 为了解决这个问题,可以尝试以下几个解决方案&#xff1a…