当前位置: 首页 > news >正文

单元测试实战(六)其它

为鼓励单元测试,特分门别类示例各种组件的测试代码并进行解说,供开发人员参考。

本文中的测试均基于JUnit5。

单元测试实战(一)Controller 的测试

单元测试实战(二)Service 的测试    

单元测试实战(三)JPA 的测试    

单元测试实战(四)MyBatis-Plus 的测试

单元测试实战(五)普通类的测试

​​​​​​​单元测试实战(六)其它

其它测试注解

除了我们示例中用到的@WebMvcTest、@DataJpaTest、@MyBatisPlusTest等之外,Spring还有若干针对性的测试注解,如:

  • Controller层:@WebFluxTest、@GraphQlTest
  • 数据层:@DataRedisTest、@DataMongoTest、@DataElasticSearchTest、@DataLdapTest……

当然还有通用的@SpringBootTest。但@SpringBootTest太通用,它会拉起整个ApplicationContext,而其它有针对性的注解则是拉起裁剪过的ApplicationContext,因此有人认为@SpringBootTest更适合集成测试。

单元、集成、系统测试的分工

由此引出一个测试分工的问题。即,单元测试、集成测试、系统测试是否有清晰的边界。其实,只要把握一个原则就行了:随着测试粒度的增大,Mock/Spy逐渐减少,真实组件逐渐增多。单元测试一般是针对单个组件(类)的测试,因此它的依赖一般都需要Mock出来(除了测试数据),所以有“无Mock、不单测”的说法;集成测试则是针对完成一定功能的一组组件的测试,这一组组件都应该是真实的,它们的外部依赖则被Mock出来;而系统测试已经没有Mock/Spy,全部是真实组件了(当然,可以Mock外部接口)。

打桩率

同时请注意,如果测试一个类(乃至一个方法)需要打的桩(即Mock/Spy)太多,说明它的依赖太多,这个组件很可能违反了单一职责原则,要考虑重构。

测试数据的准备

前面的一些示例中,测试数据(业务实体)是作为测试类属性new出来的;有时同样一组数据在好几个测试类里都有,没有统一管理。更好的办法是将它们归集在一个管理组件里,且不一定写死,可以使用cvs文件或SQL文件(如MyBatis Plus的测试示例);JUnit5有很强的数据驱动能力。

测试衡量指标(覆盖率与Assertion)

通常,单元测试的指标是代码覆盖率。但我们都知道单纯地统计覆盖率意义不大,因为1)覆盖了的代码是否是主要业务代码?2)有覆盖、无验证(或曰断言,Assertion),等于什么也没有。

覆盖率分为行覆盖率、分支覆盖率、路径覆盖率和变异覆盖率。大多数团队都是从行、分支做起。路径覆盖较难,一般不会要求。

变异(mutation)覆盖率就是解决上面说的Assertion问题的。就是说,如果代码行为改变,测试是否会失败,如果没失败,就说明没有Assert或Assert不够。

就测试而言(不止单元测试),最重要的有两条:一要盖,二要验。盖就是覆盖,就是要有测试,测试要覆盖最重要的那些分支;验就是检查,Assertion。脱离Assertion的数量和质量,空谈测试覆盖率是毫无意义的。

自动生成工具

有些工具可以生成测试代码框架,然后我们再往里补内容,IDEA就自带;另外它还有个插件叫Squaretest,更强大,但只有30天免费。如今大模型在这方面做的都不错,国内能直接使用的有阿里的“通义灵码”。更多工具见这里。

工具只起辅助作用,测试的有效性最终还要靠人来保障。

不测什么

无论单元测试还是集成测试,都无需去测三方的组件。比如用到了Spring提供的某个组件,它自己是有测试的,不要专门去给它写测试。

单纯的CRUD,没有自写SQL、没有业务逻辑的,测的必要性也不大;我们的示例中有这种测试,主要还是为了示例。

更多参考资料

从爬行到奔跑 - 我们为什么需要单元测试?(阿里)

Java单元测试实战(阿里)

单元测试的五个关键问题(阿里)

Spring boot Mybatis-Plus数据库单测实战

相关文章:

单元测试实战(六)其它

为鼓励单元测试,特分门别类示例各种组件的测试代码并进行解说,供开发人员参考。 本文中的测试均基于JUnit5。 单元测试实战(一)Controller 的测试 单元测试实战(二)Service 的测试 单元测试实战&am…...

jmeter 主从配置

配置 主从需要在同一子网。 可以修改从机的端口,主要是防火墙的原因,这样就可以在防火墙只配置一个端口,如果没有防火墙,可以不用配置 server_port1099 server.rmi.localport1099 centos防火墙开端口 sudo firewall-cmd --zonep…...

4

【任务 1】容器云平台搭建[5 分] 【题目 1】平台部署–部署容器云平台[1.5 分] 【题目 2】平台部署–部署 Istio 服务网格[0.5 分] 【题目 3】平台部署–部署 KubeVirt 虚拟化[1 分] 【题目 4】平台部署–部署 Harbor 仓库及Helm 包管理工具[1 分] 【题目 5】集群管理–备份 ET…...

C++ Day04 this指针,友元函数,重载

this指针 概念 谁调用 this 所在的函数 ,this 就存储谁的地址 特点 1, 在当前类的非静态成员函数中调用本类非静态成员时 , 默认有 this 关键字 2, 静态成员函数 , 没有 this 指针。 示例 #include <iostream> #include <cstring> using namespace std; class S…...

2023做车载测试真的可以远离内耗!转行车载月入20K!

2023年&#xff0c;车载测试正处于一个发展阶段&#xff0c;随着新能源汽车的蓬勃发展&#xff0c;电气化、智能化逐渐成为发展趋势。在汽车开发过程中&#xff0c;测试是非常重要的一个环节。现在软件越来越多地被应用到汽车上&#xff0c;对软件测试的需求也越来越多、越来越…...

LINUXZ

10.6.2 AT24C02 访问方法 设备地址 从芯片手册上可以知道&#xff0c;AT24C02 的设备地址跟它的 A2、A1、A0 引脚有关&#xff1a; 图 10.36 AT24C02 设备地址引脚配置 294 / 577 打开 I2C 模块的原理图&#xff1a; 开发板配套网盘资料\04_开发板原理图\ 04_Extend_modules\通…...

C#单例模式懒汉式与饿汉式

单例模式一般分为懒汉模式和饿汉模式&#xff0c;懒汉式单例在第一次引用时创建实例&#xff0c;不是在类加载时&#xff1b;饿汉式单例模式是一种在类加载时就创建实例的方式&#xff0c;因此也称为静态初始化。 单例模式实现的技巧时构造私有&#xff0c;向外提供静态实例。…...

小微初创企业,如何利用媒体宣传快速成长

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 对于小微初创企业来说&#xff0c;利用媒体宣传可以快速提升品牌知名度、扩大影响力&#xff0c;进而促进企业的成长。 1.确定宣传目标&#xff1a;是增加销售、提升品牌知名度、还是推…...

【封装UI组件库系列】全局样式的定义与重置

封装UI组件库系列第二篇样式 ​​​​​​&#x1f31f;前言 &#x1f31f;定义全局样式 生成主题色和不同亮度的颜色 ​编辑 中性色及其他变量 &#x1f31f;样式重置 &#x1f31f;总结 ​​​​​​​​​​​​​​&#x1f31f;前言 在前端开发中&#xff0c;大家…...

opencv将32位深图片合成视频跳帧解决办法

在合成视频时候&#xff0c;大多数的图片都是24位深度的&#xff08;即RGB三通道&#xff0c;一个通道8位&#xff09;&#xff0c;但是也存在少量的32位深的图片&#xff08;RGBA&#xff0c;三个颜色通道加上A这个透明度通道&#xff09;&#xff0c;32位和24位的格式是不一样…...

华为obs上传下载-Java版 2023-11-23

弄了半天&#xff0c;老师帮弄成功了&#xff0c;经过同意&#xff0c;分享到网上&#xff0c;希望能帮助更多人&#xff0c;至于怎么弄的&#xff0c;我也不知道。 创建idea项目后&#xff0c;项目结构&#xff0c;对应文件没有的创一个 pom.xm 注意改Java版本&#xff0c;我…...

2023年中国农业机器人行业市场规模及发展趋势分析[图]

农业机器人是一种机器&#xff0c;是机器人在农业生产中的运用&#xff0c;是一种可由不同程序软件控制&#xff0c;以适应各种作业,能感觉并适应作物种类或环境变化&#xff0c;有检测(如视觉等)和演算等人工智能的新一代无人自动操作机械。 农业机器人分类 资料来源&#xf…...

12英寸双轴半自动划片机:颠覆传统划切工艺的五大优势

随着科技的飞速发展&#xff0c;半导体行业对精密划切设备的需求日益增长。在这篇文章中&#xff0c;我们将深入探讨12英寸双轴半自动划片机的优势&#xff0c;这种划片机在半导体制造过程中扮演着至关重要的角色。以下是这种划片机的五大优势。 一、高精度划切 12英寸双轴半自…...

动态神经网络时间序列预测

大家好&#xff0c;我是带我去滑雪&#xff01; 神经网络投照是否存在反锁与记忆可以分为静态神经网络与动态神经网络。动态神经网络是指神经网络带有反做与记忆功能&#xff0c;无论是局部反馈还是全局反锁。通过反馈与记忆&#xff0c;神经网络能将前一时刻的数据保留&#x…...

Unity 三维场景的搭建 软件构造实验报告

实验2&#xff1a;仿真系统功能实现 1.实验目的 &#xff08;1&#xff09;熟悉在Unity中设置仿真场景&#xff1b; &#xff08;2&#xff09;熟悉在Unity中C#语言的使用&#xff1b; &#xff08;3&#xff09;熟悉仿真功能的实现。 2.实验内容 新建一个仿真场景&#x…...

2024贵州大学计算机考研分析

24计算机考研|上岸指南 贵州大学 贵州大学计算机科学与技术学院&#xff08;贵州大学省级示范性软件学院&#xff09;位于贵州省贵阳市花溪区贵州大学东校区。 计算机科学与技术学院&#xff08;软件学院&#xff09;自1972年创办计算机软件本科专业开始&#xff0c;至今已有…...

Spring高级bean的实例化方法

bean的实例化方法 构造方法 实例化bean第一种&#xff1a;使用默认无参构造函数(常用) 第二种创建bean实例&#xff1a;静态工厂实例化&#xff08;了解&#xff09; 第三种&#xff1a;实例工厂&#xff08;了解&#xff09;与FactoryBean&#xff08;实用&#xff09;...

Vue2系列 — 渲染函数 (render + createElement)

官网文档&#xff1a;https://v2.cn.vuejs.org/v2/guide/render-function.html 1 render 函数 render 函数 不使用模板&#xff0c;使用 js 生成虚拟 dom 2 createElement() 接受的参数&#xff1a; 参数1 节点类型参数2 attribute参数3 子节点 3 DEMO <template>&…...

加载SSL证书

使用JDK1.8 开发工具包bin目录下的keytool.exe工具生成ssl密钥&#xff1a; keytool -genkey -alias mykey -keyalg RSA -keysize 2048 -validity 365 -keystore mykeystore.p -genkey&#xff1a; 表示创建密钥。-alias&#xff1a; 保存时的别名。-keyalg&#xff1a;加密算…...

redis 非关系型数据库

redis 非关系型数据库 redis 非关系型数据库&#xff0c;缓存型数据库 关系型数据库和非关系型数据库的区别&#xff1a; 关系型数据库是一个结构化的数据库&#xff0c;行和列 列&#xff1a;声明对象 行&#xff1a;记录对象的属性 表与表之间是有关联的&#xff0c;使用…...

全网最细:Rag+LangChain 文档加载全实战

一、前言在基于 LangChain 构建 RAG 检索增强生成系统时&#xff0c;文档加载是整个项目的第一步、也是最基础最关键的一环。无论后续向量嵌入、向量数据库、检索链、大模型问答做得多完善&#xff0c;只要文档加载解析出错、乱码、漏内容、格式解析不全&#xff0c;整个 RAG 系…...

5分钟掌握Switch游戏文件管理的完整解决方案

5分钟掌握Switch游戏文件管理的完整解决方案 【免费下载链接】NSC_BUILDER Nintendo Switch Cleaner and Builder. A batchfile, python and html script based in hacbuild and Nuts python libraries. Designed initially to erase titlerights encryption from nsp files an…...

Linux x64 ROP链不够用?试试这个藏在__libc_csu_init里的‘万能’gadget(附Python pwntools脚本)

突破ROP链限制&#xff1a;深入挖掘__libc_csu_init中的通用gadget 在64位Linux系统的漏洞利用开发中&#xff0c;构造可靠的ROP链常常面临一个棘手问题——难以找到控制所有必要寄存器的gadget片段。特别是当需要精确设置rdx、rsi等寄存器时&#xff0c;传统的ROP技术往往会遇…...

Restbed问题排查手册:常见错误及解决方案汇总

Restbed问题排查手册&#xff1a;常见错误及解决方案汇总 【免费下载链接】restbed Corvusofts Restbed framework brings asynchronous RESTful functionality to C applications. 项目地址: https://gitcode.com/gh_mirrors/re/restbed Restbed是Corvusoft推出的一款为…...

ARM Cortex-M33 安全实战:手把手教你用 SAU 划分安全与非安全内存区域

ARM Cortex-M33 安全实战&#xff1a;手把手教你用 SAU 划分安全与非安全内存区域 在嵌入式系统开发中&#xff0c;安全性已经从"可有可无"变成了"必不可少"的核心需求。想象一下&#xff0c;你的智能门锁固件被恶意攻击者篡改&#xff0c;或者工业控制设备…...

LinkSwift直链助手:免费解锁八大网盘极速下载的终极指南

LinkSwift直链助手&#xff1a;免费解锁八大网盘极速下载的终极指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天…...

【DN-DETR论文阅读】:基于查询去噪的DETR训练加速范式,从根源解决双边匹配不稳定问题

论文信息 标题&#xff1a;DN-DETR: Accelerate DETR Training by Introducing Query Denoising会议&#xff1a;CVPR 2022 (Oral)单位&#xff1a;香港科技大学、清华大学、IDEA研究院代码&#xff1a;github.com/IDEA-Research/DN-DETR论文&#xff1a;https://arxiv.org/pdf…...

容器资源爆满却无告警?Docker 27.0+内置监控体系深度激活:启用experimental metrics API并对接Prometheus的7步密钥配置

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Docker 27资源监控实时告警配置全景概览 Docker 27&#xff08;即 Docker Engine v27.x&#xff09;引入了原生增强的 docker stats --no-stream 批量采集能力与 Prometheus 指标导出协议深度集成&…...

新手友好:通过快马平台轻松入门222yn页面升级开发实战指南

作为一名刚接触前端开发的新手&#xff0c;最近在InsCode(快马)平台尝试了222yn页面升级的练习&#xff0c;整个过程比想象中顺利很多。这个平台最让我惊喜的是&#xff0c;不需要从零开始写代码&#xff0c;通过简单的描述就能生成基础框架&#xff0c;让我可以更专注在理解代…...

ESXi 8.0U3i 官方原版离线安装 / 升级包|纯净原版|离线部署教程|常见问题

现如今企业虚拟化、私有云、数据中心运维&#xff0c;都离不开稳定、纯净、官方原版的 ESXi 底层系统。ESXi 8.0U3i 作为目前 8.0 系列最新、最稳的正式版本&#xff0c;不仅修复大量 BUG、强化安全补丁&#xff0c;还优化了 NVMe、多核调度与内存稳定性&#xff0c;是生产环境…...