news 2026/6/10 0:48:57

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
关于单元测试编写原则的一些思考

目的

单元测试编写的目的,是面向计算机特性的,基于函数的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种情况的单元测试编写,我们的单元测试会覆盖的场景就会越来越多,我们的代码也会越来越健壮,久而久之,我们对于代码的修改可以纯粹依赖单元测试,而减少更多逻辑上复杂的思考。

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

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 19:49:43

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

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

作者头像 李华
网站建设 2026/6/9 19:50:22

基于单片机的家庭防盗报警器设计

1 系统方案设计 1.1 方案论证 防盗报警系统要求实现的功能,按照本设计的要求,可分为三个部分,即控制器部分、信号检测部分、报警部分。当有人经过报警器工作范围内,报警系统的信号检测模块会把检测到的信号转为电信号送到单片机&a…

作者头像 李华
网站建设 2026/6/9 19:45:52

6024NR14130电源模块

6024NR14130 电源模块 — ABB Taylor 系列型号: 6024NR14130 类型: 模块化电源模块功能与应用6024NR14130 是一款工业级模块化电源模块,主要用于 ABB Taylor 系列或 MOD300 控制系统中。它为控制系统的 CPU、I/O 模块、通信模块等提供稳定电源,保证整个系…

作者头像 李华
网站建设 2026/6/9 22:31:11

脸都不要了!美国开始正式出售委内瑞拉石油

当地时间1月14日,一位美国政府官员透露,美国已完成首批委内瑞拉石油的销售。 这笔交易价值5亿美元,该官员补充说,预计未来几天和几周还将进行更多石油销售,图2为委内瑞拉一处炼油厂。 1月3日凌晨,美国对委…

作者头像 李华
网站建设 2026/6/7 1:41:00

综合评估显示,这些工具在准确性和自然度方面已达到实用化水平

在众多AI论文工具中,选择一款适合自己需求的平台可能令人眼花缭乱。本文将对比8款热门工具,重点聚焦降重、降AIGC率、写论文等功能。工具排名基于实测数据和用户反馈,确保客观实用性。以下是简要排行表(基于效率、准确性和易用性&…

作者头像 李华