写单元测试,没你想得那么简单!

前言

单元测试是什么我们就简单介绍一下

单元测试是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。

接下来是本人对单元测试的理解和实践。里面没有废话,希望每句话能说到你心坎里。

原则:只测自己

自己的含义:方法边界内的主体逻辑。一切下游方法、框架依赖、外部IO等都不是自己。如spring、 外部数据库都视为外部逻辑。

这一原则的动机

便于定位

每个方法有自己独立的单元测试,这有利于IDE在单元测试与逻辑代码间跳跃,便于定位,并降低代码结构调整的影响范围。

不重复,降低复杂度

因每个方法有自己的单元测试,所以当前测试不要涵盖下游方法的功能测试。以避免逻辑改动造成不必要的影响范围扩大。

实践与建议

要想单元测试更易于维护,良好的设计是前提

分层开发

开发也是可以分层的,先进行框架开发后进行具体开发。如先定义好所有的接口和要传递的数据,并组织好控制层,然后测试和具体开发便可同时展开。这样便可提前发现结构性问题,提前对设计进行验证,减少后期结构性调整对单元测试的影响。

单一职责

尽量应用单一职责设计模式,使逻辑模块化,并使用老板原则将这些模块串起来。这对于类的内部实现尤其重要,因为这会影响单元测试的覆盖能力。

只有这样每个方法的逻辑才能简单,对应的单元测试自然便于维护。作为老板的控制类或方法不必苛求单元测试,可酌情选择是否单元测试,因为控制是少数派,且实质逻辑已经被分摊到模块中。

逻辑与外部IO分离

这是单一职责的延申,数据的加载、处理与输出是可以作为独立的三个职责的。其中数据的加载和输出往往与外部环境依赖有关,本身的测试意义不大,即便测试也不能到处运行,且测试运行效率低下。

所以我们需要将IO逻辑从处理逻辑中剥离,并放到外层的控制逻辑中去并用mock来解决。这样没有外部依赖的处理逻辑——核心,将得到简化,从而单元测试得到简化。

如果中间实在需要外部IO可考虑在IO处进行逻辑拆分,这样拆分后的子逻辑中就没有了IO依赖,从而得到简化。

到处运行

有时候单元测试是脱离不了环境的,如我们想验证一下 SQL 的正确性。此时建议在单元测试上应用 @Disabled 注解,以便在 mvn test 中忽略这些测试,从而保证测试可以到处运行。

@Autowired

请尽量避免对框架的依赖,如 spring 的 @Autowired 注入机制,这会巨幅增加单元测试的构建难度,巨幅增加单元测试的耗时,因为这会对 mock 对象的注入造成困难。

建议,使用构造注入代替属性注入,这样就可以摆脱对 spring 的依赖。

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

 

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

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

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

相关文章

2020年计网408

第33题 下图描述的协议要素是( )。I. 语法 II. 语义 III. 时序 A. 仅 I B. 仅 II C. 仅 III D. I、II 和 III 本题考察网络协议三要素的相关知识。 网络协议的三要素分别是语法、语义、同步(时序)。语法:定义收发双…

LeetCode算法心得——打家劫舍(记忆化搜索)

大家好,我是晴天学长,准备开始深入动态规划啦,先从记忆化搜索开始,需要的小伙伴可以关注支持一下哦!后续会继续更新的。💪💪💪 1) .打家劫舍 你是一个专业的小偷,计划偷窃…

MySQL慢查询

快捷查看指令 ctrlf 进行搜索会直接定位到需要的知识点和命令讲解(如有不正确的地方欢迎各位小伙伴在评论区提意见,博主会及时修改) MySQL慢查询 MySQL 慢查询是指查询语句执行速度过慢,影响系统整体性能和查询效率的情况。MySQL…

设计模式——RBAC 模型详解

1.什么是 RBAC 呢? RBAC 即基于角色的权限访问控制(Role-Based Access Control)。这是一种通过角色关联权限,角色同时又关联用户的授权方式。 简单地说:一个用户可以拥有若干角色,每一个角色又可以被分配…

OSG文字-osgText3D(5)

osgText3D 三维立体文字比二维平面文字显示效果更好,相对二维平面文字,它有非常好的立体显示效果。 在实际虚拟现实项目中,过多使用三维立体文字会降低染效率,加重渲染负担,相对平面二维文字,它占用的内存是…

lombok 引入

lombok 依赖--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>

FPGA设计时序约束九、others类约束之Group Path

目录 一、序言 二、Group Path 2.1 基本概念 2.2 设置界面 2.3 命令语法 2.4 命令示例 三、工程示例 四、参考文件 一、序言 在Vivado的时序约束窗口中&#xff0c;存在一类特殊的约束&#xff0c;划分在others目录下&#xff0c;可用于设置忽略或修改默认的时序路径分…

毕业设计2349基于jsp的网上订餐系统【程序源码+文档+调试运行】

摘要 本文介绍了一个网上订餐系统的设计与实现。该系统分为前台用户模块和后台管理员模块&#xff0c;具有用户注册/登录、网站公告、菜品中心、购物车、用户后台、留言板等功能。管理员可以对用户信息、网站公告、菜品类别、菜品信息、订单信息、菜品评价信息、留言板信息和支…

OSG文字-渐变文字(4)

渐变文字(osgText::FadeText类)继承自osgText::Text类继承关系图如图9-6所示 图9-6 osgText::FadeText的继承关系图 从继承关系图中可以看出&#xff0c;它继承自osgText::Text类&#xff0c;因此&#xff0c;它具备一般文字属性的设置方法这里不再重复说明。创建渐变文字与一般…

Linux C IO复用

IO复用 概述IO模型阻塞式IO非阻塞式IOIO复用select、poll、epoll异同 信号驱动式IO异步IO select函数select示例代码 poll函数poll示例代码 epoll函数创建  epoll_create注册、修改、删除  epoll_ctl轮询 I/O 事件的发生  epoll_waitepoll示例代码 基于TCP和epoll在线多人…

Java8新特性 ----- Lambda表达式和方法引用/构造器引用详解

前言 在讲一下内容之前,我们需要引入函数式接口的概念 什么是函数式接口呢? 函数式接口&#xff1a;有且仅有一个抽象方法的接口 java中函数式编程的体现就是Lambda表达式,你可以认为函数式接口就是适用于Lambda表达式的接口. 也可以加上注解来在编译层次上限制函数式接口 Fun…

解决ESP32内部RAM内存不足的问题

一&#xff0c;为什么需要外部RAM ESP32有520kB的内部RAM空间可以使用&#xff0c;这对于一般的情况是够用的&#xff0c;但是如果设备需要涉及音频或者显示图像等处理时&#xff0c;需要更大的内存空间来处理这些数据。ESP32支持扩展外部RAM&#xff0c;其实乐鑫已经在其ESP32…