关于单元测试编写原则的一些思考

目的

单元测试编写的目的,是面向计算机特性的,基于函数的in-out,所以单元测试的好帮手就是断言,通过不断的构造输出并对结果进行断言,我们就可以针对一个对象以及它的函数,构建出充足的用例去包裹它,以期望它的任意行为满足我们的需要。

最终的目的也是为了通过用例对单元测试的包裹,达到对任意对象的任意函数进行修改后,既满足新的功能,又对旧有功能没有影响。

原则

基于单元测试编写的目的,在编写单元测试时,我们应当认为我们编写的单元测试所面向的过程是黑盒,我们应只对输入以及我们期望的输出负责,即只考虑起始输入以及最终态。

具体来说:

  • 针对Dao的单元测试,我们只应该关心测试后数据库各个字段的值;

  • 针对Service的测试,我们只应该关心Service方法执行最终涉及到的数据库字段,缓存,消息队列中的值,以及Service方法的返回;

  • 针对Controller的测试,我们仅应该关心Controller针对HttpRequst的输入以及HttpResponse的输出。而不该关心其中具体调用到的那些Service如何执行。

其中第3点或许令人疑惑,但是我们在编写单元测试时,我认为应该仅考虑执行的函数逻辑本身。对于其外部的依赖或者并不关心结果的方法,尽量mock掉。

虽然目前的场景下Service层与Dao层基本耦合在一起无法拆分开来进行单元测试,但是Controller层绝不应该严重依赖Service来进行单元测试,否则单元测试最终会沦为接口测试。

同时,如果我们在测试某个模块时,不对其外部依赖做mock,那么就会导致我们的测试依然非常臃肿。并且最可怕的是,我们对结果的断言无法实现。

比如当我们对Controller进行单元测试时,即便我们不mock它所依赖的Rpc(而是将他们启动着),但是我们如何对他所依赖的那些Rpc的执行正确与否进行断言呢?难道我们要在Controller层的单元测试执行完成后,在Controller层对数据库以及其他中间件的变化做查询以及断言吗?这显然是不现实的。

单元测试面向的应该是一个从不调用其他函数(不包括第三方jar包)的函数,从其开始自底向上一个个编写,直到Http接口层。

对于同一个单元测试来说,它的增加与修改应该与其对应测试功能的变化相同:

  • 当对应的功能增加了或扩展了,应在单元测试中对新增功能增加新的测试,对老的单元测试则应该不做修改,并保证新增功能也满足老的测试;

  • 当对应的功能修改了,并且不可能满足原有的测试,此时才应当去修改原有的测试,并应当加注释以说明。当需要修改单元测试时一定要谨慎,因为这意味着以前的经验已经不奏效了。

依靠这些原则去编写单元测试,我们会发现,想要写出一个好的便于测试的类也是比较难的。想要写出便于测试的类以及方法,会反向要求了我们减少代码间的耦合,提高代码的可读性。

Timing

单元测试的编写不应该是大家埋头一个月一起闭关编写(虽然码上行确实需要这样),而是一个不断渐进,防止犯过的错再犯的方式。

当开发一个新功能时,我们应当对新功能针对需求编写单元测试,这是理所应当的。

当对一个功能进行修改时,我们应该对该功能的单元测试进行修改,并完成该功能修改后的单元测试。

当发现某功能出现了某些意料之外的输出(一般来说就是bug),我们在修改时,应当针对该种特殊情况编写对应的单元测试。

经过以上3种情况的单元测试编写,我们的单元测试会覆盖的场景就会越来越多,我们的代码也会越来越健壮,久而久之,我们对于代码的修改可以纯粹依赖单元测试,而减少更多逻辑上复杂的思考。

感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取

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

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

相关文章

Agentic RAG核心解析(必收藏):从原理到架构,解锁大模型复杂查询能力

Agentic RAG(智能体增强检索增强生成)是将Agent自主规划与决策能力融入传统RAG的进阶技术,核心目标是破解传统RAG在复杂查询场景中的瓶颈。相较于传统RAG的固定流程,Agentic RAG可自主选择检索引擎、规划检索步骤、评估结果有效性…

5G矿山车载监控终端山河矿卡定位监控终端

5G智慧矿山监控终端——赋能矿山智能化转型,筑牢安全生产防线在矿山行业向“少人化、无人化”转型的关键阶段,安全生产与高效运营成为核心诉求。传统监控设备受限于通信带宽、时延及环境适应性,难以满足复杂矿山场景的实时管控需求。5G智慧矿…

【顶级SCI复现】高比例可再生能源并网如何平衡灵活性与储能成本?虚拟电厂多时间尺度调度及衰减建模附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码及仿真咨询…

软件测试工程师面试的时候该怎么样介绍自己?

一个好的自我介绍可以让人眼前一亮! 在求职面试时,大多数面试考官会要求应聘者做一个自我介绍,一方面以此了解应聘者的大概情况,另一方面考察应聘者的口才、应变和心理承受、逻辑思维等能力。 千万不要小视这个自我介绍&#xf…

Day 52:【99天精通Python】Web 开发入门 (Flask) - 5行代码写个网站

Day 52:【99天精通Python】Web 开发入门 (Flask) - 5行代码写个网站 前言 欢迎来到第52天! 在之前的 51 天里,我们写的代码都是在终端里跑的,或者生成一个本地的文件。如果你想让全世界的人都能用到你的程序,最好的…

【顶级SCI复现】虚拟电厂的多时间尺度调度:在考虑储能系统容量衰减的同时,整合发电与多用户负荷的灵活性研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码及仿真咨询…

前端项目打包部署完整流程

1. 环境准备确认项目为 Vue.js 前端项目已安装 Node.js (> 14.0.0) 和 npm (> 6.0.0)项目依赖已安装 (node_modules)2. 选择打包环境根据部署环境选择对应的打包命令:测试环境: npm run build:test生产环境: npm run build:prod3. 执行打包# 进入项目目录 cd web-master-…

【电压风险评估】基于720个样本与360个样本的Copula及蒙特卡罗推断结果比较研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码及仿真咨询…

【2025最新】基于SpringBoot+Vue的创新创业教育中心项目申报管理系统管理系统源码+MyBatis+MySQL

💡实话实说:有自己的项目库存,不需要找别人拿货再加价,所以能给到超低价格。摘要 随着高校创新创业教育的快速发展,传统项目申报管理模式已无法满足高效、透明和智能化的需求。当前,许多教育中心仍依赖纸质…

Java SpringBoot+Vue3+MyBatis 安康旅游网站系统源码|前后端分离+MySQL数据库

💡实话实说:有自己的项目库存,不需要找别人拿货再加价,所以能给到超低价格。摘要 随着信息技术的快速发展,旅游业逐渐向数字化、智能化转型。安康作为陕西省重要的旅游城市,拥有丰富的自然和文化资源&#…

【web安全】小白想入门web安全,应该从哪里开始下手!

一、Web 安全概述 (一)Web 安全的定义与重要性 1.定义 Web 安全是指保护 Web 应用程序免受各种网络威胁,确保 Web 服务的保密性、完整性和可用性。在当今数字化时代,Web 应用广泛存在于各个领域,从电子商务到社交媒…

【顶级EI复现】基于断线解环思想的配电网辐射状拓扑约束建模方法附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码及仿真咨询…

机器学习科学家分享:如何开启AI职业生涯并解密前沿技术

机器学习科学家分享:如何开启AI职业生涯并解密前沿技术 Parmida Beigi 的职业生涯涵盖了机器学习和数据科学的多个方面。从她在计算机视觉和时间序列预测的博士研究,到在 Alexa AI 端到端系统的工作。如今,Beigi 致力于语音识别和自然语言处理…

全网最全继续教育AI论文写作软件TOP10:深度测评与推荐

全网最全继续教育AI论文写作软件TOP10:深度测评与推荐 2026年继续教育AI论文写作工具测评:为何值得关注 随着人工智能技术的不断进步,AI写作工具在学术领域的应用日益广泛。对于继续教育群体而言,如何高效完成论文写作、提升内容质…

Java Web web酒店客房管理系统系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】

💡实话实说:有自己的项目库存,不需要找别人拿货再加价,所以能给到超低价格。摘要 随着信息技术的快速发展,酒店行业对高效、智能的管理系统需求日益增长。传统酒店客房管理依赖人工操作,存在效率低下、易出…

基于单片机的车辆超载系统

第三章 主要元器件的选择 3.1 单片机的选择 3.1.1单片机的概括 单片机,也叫单片微控器,是一种集成式的电流芯片。在单片机中主要包含CPU、只读存储器ROM和随机存储器RAM等,多样化数据采集与控制系统能够让单片机完成各项复杂的运算,无论是对运算符号进行…

谁还以为网安只会挖洞就行?2025 卷王标准:云原生 + AI 攻防,速来聊聊你的技能升级计划!

最近在后台回复粉丝的问题,已经遇到不少211/985高校信息安全专业、做安全攻防/渗透方向,却没找到暑期实习的粉丝了。 背景都很不错,有的CTF竞赛拿过奖,有的跟着导师做过项目,他们的提问甚至让我有点吃惊。 坦白来说&…

基于plc的八路抢答器设计

第二章 PLC相关技术概况 2.1 PLC的产生 可编程逻辑控制器PLC是一个新型的工业控制设备,通过科技的发展和生产力的提升,它已形成了现代和多部门的中小型制造企业。 对工业各种装置和生产工艺的控制系统一般由操纵机构、驱动机构、发动机和控制器完成。生产…

AI生成内容去重指南:10款专业工具深度测评与优化方案

核心工具对比速览 工具名称 核心功能 适用场景 处理速度 特色优势 aibiye 降AIGC率查重 学术论文优化 20分钟 适配知网/格子达/维普规则 aicheck AIGC检测 风险区域识别 实时 可视化热力图报告 askpaper 学术内容优化 论文降重 20分钟 保留专业术语 秒篇 …

电气自动化 PLC水塔水位控制

1 PLC相关介绍 1.1 可编程控制器 可编程控制器,主要应用于工业环境。微处理器是其主要部件,简称PLC。PLC拥有用来运行逻辑运算的存储器。这个存储器可以进行程序解读,在工业生产环境有着很重要的作用。继电器-接触系统是由开关、接触器等元件构成的一种…