代码质量保障第2讲:单元测试 - 浅谈单元测试
代码质量保障第2讲:单元测试 - 浅谈单元测试
本文是代码质量保障第2讲,浅谈单元测试。单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。这是基础,所以围绕着单元测试,我从网上搜集和总结了相关的概念,以助你完善体系。
文章目录
- 代码质量保障第2讲:单元测试 - 浅谈单元测试
- 1、什么是单元测试?
- 2、为什么要写单元测试?
- 3、什么时候写单元测试?
- 4、单元测试要写多细?
- 5、有哪些单元测试相关的概念?
- 5.1、被测系统
- 5.2、测试依赖组件(DOC)
- 5.3、测试替身(Test Double)
- 5.4、Test fixture
- 5.5、测试用例(Test case)
- 5.6、测试套件
- 6、参考文章
1、什么是单元测试?
来自百度百科。
单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。
2、为什么要写单元测试?
使用单元测试可以有效地降低程序出错的机率,提供准确的文档,并帮助我们改进设计方案等等。
以下列举了一些我为什么使用单元测试的好处:
- 允许你对代码做出任何改变,因为你了解单元测试会在你的预期之中;
- 单元测试可以有效地降低程序出现BUG的机率;
- 帮助你更深入地理解代码–因为在写单元测试的时候,你需要明确程序所有的执行流程及对应的执行结果等等;
- 允许在任何时候代码重构,而不必担心破坏现有的代码。这使得我们编写程序更灵活;
- 确保你的代码的健壮性,因为所有的测试都是通过了的;
- 文档记录。单元测试就是一种无价的文档,它是展示函数或类如何使用的最佳文档,这份文档是可编译、可运行的、并且它保持最新,永远与代码同步。
- 具有回归性。自动化的单元测试避免了代码出现回归,编写完成之后,可以随时随地地快速运行测试,而不是将代码部署到设备之后,然后再手动地覆盖各种执行路径,这样的行为效率低下,浪费时间。
3、什么时候写单元测试?
写单元测试的时机不外乎三种情况:
- 一是在具体实现代码之前,这是测试驱动开发(TDD)所提倡的;
- 二是与具体实现代码同步进行。先写少量功能代码,紧接着写单元测试(重复这两个过程,直到完成功能代码开发)。其实这种方案跟第一种已经很接近,基本上功能代码开发完,单元测试也差不多完成了;
- 三是编写完功能代码再写单元测试。我的实践经验告诉我,事后编写的单元测试“粒度”都比较粗。对同样的功能代码,采取前两种方案的结果可能是用10个“小”的单测来覆盖,每个单测比较简单易懂,可读性可维护性都比较好(重构时单测的改动不大);而第三种方案写的单测,往往是用1个“大”的单测来覆盖,这个单测逻辑就比较复杂,因为它要测的东西很多,可读性可维护性就比较差。
- 目前采用的这种方案
建议:我个人是比较推荐单元测试与具体实现代码同步进行这个方案的。只有对需求有一定的理解后才能知道什么是代码的正确性,才能写出有效的单元测试来验证正确性,而能写出一些功能代码则说明对需求有一定理解了。
4、单元测试要写多细?
单元测试不是越多越好,而是越有效越好!进一步解读就是哪些代码需要有单元测试覆盖:
- 逻辑复杂的
- 容易出错的
- 不易理解的,即使是自己过段时间也会遗忘的,看不懂自己的代码,单元测试代码有助于理解代码的功能和需求
- 公共代码。比如自定义的所有http请求都会经过的拦截器;工具类等。
- 核心业务代码。一个产品里最核心最有业务价值的代码应该要有较高的单元测试覆盖率。
5、有哪些单元测试相关的概念?
5.1、被测系统
被测系统(System under test, SUT)表示正在被测试的系统,目的是测试系统能否正确操作。根据测试类型的不同,SUT 指代的内容也不同,例如 SUT 可以是一个类甚至是一整个系统.
5.2、测试依赖组件(DOC)
被测系统所依赖的组件,例如进程 UserService 的单元测试时,UserService 会依赖 UserDao,因此 UserDao 就是 DOC.
5.3、测试替身(Test Double)
一个实际的系统会依赖多个外部对象, 但是在进行单元测试时,我们会用一些功能较为简单的并且其行为和实际对象类似的假对象来作为 SUT 的依赖对象,以此来降低单元测试的复杂性和可实现性。在这里,这些假对象就被称为 测试替身(Test Double)。测试替身有如下 5 种类型:
- Test stub
为 SUT 提供数据的假对象,我们举一个例子来展示什么是 Test stub.
假设我们的一个模块需要从 HTTP 接口中获取商品价格数据, 这个获取数据的接口被封装为 getPrice 方法. 在对这个模块进行测试时, 我们显然不太可能专门开一个 HTTP 服务器来提供此接口, 而是提供一个带有 getPrice 方法的假对象, 从这个假对象中获取数据. 在这个例子中, 提供数据的假对象就叫做 Test stub.
- Fake object
实现了简单功能的一个假对象。Fake object 和 Test stub 的主要区别就是 Test stub 侧重于用于提供数据的假对象,而 Fake object 没有这层含义.
使用 Fake object 的最主要的原因就是在测试时某些组件不可用或运行速度太慢,因而使用 Fake object 来代替它们.
- Mock object
用于模拟实际的对象, 并且能够校验对这个 Mock object 的方法调用是否符合预期。
实际上,Mock object 是 Test stub 或 Fake object 一种,但是 Mock object 有 Test stub/Fake object 没有的特性,Mock object 可以很灵活地配置所调用的方法所产生的行为,并且它可以追踪方法调用,例如一个 Mock Object 方法调用时传递了哪些参数,方法调用了几次等。
- Dummy object
在测试中并不使用的,但是为了测试代码能够正常编译/运行而添加的对象。例如我们调用一个 Test Double 对象的一个方法,这个方法需要传递几个参数,但是其中某个参数无论是什么值都不会影响测试的结果,那么这个参数就是一个 Dummy object。Dummy object 可以是一个空引用,一个空对象或者是一个常量等。
简单的说,Dummy object 就是那些没有使用到的,仅仅是为了填充参数列表的对象。
- Test Spy
可以包装一个真实的 Java 对象,并返回一个包装后的新对象。若没有特别配置的话,对这个新对象的所有方法调用,都会委派给实际的 Java 对象。
mock 和 spy 的区别是:mock 是无中生有地生出一个完全虚拟的对象,它的所有方法都是虚拟的;而 spy 是在现有类的基础上包装了一个对象,即如果我们没有重写 spy 的方法,那么这些方法的实现其实都是调用的被包装的对象的方法。
5.4、Test fixture
所谓 test fixture,就是运行测试程序所需要的先决条件(precondition)。即对被测对象进行测试时所需要的一切东西(The test fixture is everything we need to have in place to exercise the SUT)。这个 东西 不单单指的是数据,同时包括对被测对象的配置,被测对象所需要的依赖对象等。JUnit4 之前是通过 setUp, TearDown 方法完成, 在 JUnit4这, 我们可以使用@Before 代替 setUp 方法, @After 代替 tearDown 方法。
注意,@Before 在每个测试方法运行前都会被调用,@After 在每个测试方法运行后都会被调用。
因为 @Before 和 @After 会在每个测试方法前后都会被调用,而有时我们仅仅需要在测试前进行一次初始化,这样的情况下,可以使用@BeforeClass 和@AfterClass 注解。
5.5、测试用例(Test case)
在 JUnit 3中, 测试方法都必须以 test 为前缀,且必须是 public void 的,JUnit 4之后,就没有这个限制了,只要在每个测试方法标注 @Test 注解,方法签名可以是任意的。
5.6、测试套件
通过 TestSuit 对象将多个测试用例组装成一个测试套件,测试套件批量运行。
通过@RunWith 和@SuteClass 两个注解,我们可以创建一个测试套件。通过@RunWith 指定一个特殊的运行器,即 Suite.class 套件运行器,并通过@SuiteClasses 注解,将需要进行测试的类列表作作为参数传入。
6、参考文章
- https://coolshell.cn/articles/8209.html
- https://segmentfault.com/a/1190000006731125
- https://blog.csdn.net/flysqrlboy/article/details/79301241
相关文章:
代码质量保障第2讲:单元测试 - 浅谈单元测试
代码质量保障第2讲:单元测试 - 浅谈单元测试 本文是代码质量保障第2讲,浅谈单元测试。单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。这是基础,所以围绕着单元测试,我从…...
“五度晟企通”企业发展服务平台正式发布,帮扶企业行稳致远!
在数字中国建设的大背景下,“五度易链”以企业实际发展需求为牵引,以帮扶企业行稳致远为目标,基于全体量产业大数据,运用NLP、AI等新一代信息技术,打造了数字化ToB企业发展服务平台“五度晟企通”,旨在以数…...
Java类和对象(七千字详解!!!带你彻底理解类和对象)
目录 一、面向对象的初步认知 1、什么是面向对象 2、面向对象和面向过程 (1)传统洗衣服的过程 (2)现代洗衣服过程 编辑 二、类的定义和使用 1、类的定义格式 三、类的实例化 1、什么是实例化 2、类和对象说明 四、t…...
机器学习笔记:node2vec(论文笔记:node2vec: Scalable Feature Learning for Networks)
2016 KDD 1 intro 利用graph上的节点相似性,对这些节点进行embedding 同质性:节点和其周围节点的embedding比较相似 蓝色节点和其周围的节点结构等价性 结构相近的点embedding相近 比如蓝色节点,都处于多个簇的连接处 2 随机游走 2.1 介绍…...
go基础10 -字符串的高效构造与转换
前面提到过,Go原生支持通过/操作符来连接多个字符串以构造一个更长的字符串,并且通过/操作符的字符串连接构造是最自然、开发体验最好的一种。 但Go还提供了其他一些构造字符串的方法,比如: ● 使用fmt.Sprintf; ● 使…...
VR钢铁实训 | 铁前事业部虚拟仿真培训软件
随着科技的发展,虚拟现实技术在各个行业中的应用越来越广泛。在钢铁冶炼行业中,VR技术也逐渐得到了应用,其中铁前事业部虚拟仿真培训软件就是一项非常有优势的技术。 铁前事业部虚拟仿真培训软件是广州华锐互动打造的《钢铁生产VR虚拟培训系统…...
DevOps
DevOps 是开发 (Dev) 和运营 (Ops) 的复合词,它将人、流程和技术结合起来,不断地为客户提供价值。 DevOps 对团队意味着什么? DevOps 使以前孤立的角色(开发、IT 运营、质量工程和安全)可以协调和协作,以生…...
IJ中PHP环境的搭建和使用教程
目录 目录 前言 思维导图 1,PHP环境下载 1.下载链接 2.进行安装 3,自定义路径 4.进行相关的一些库的选择下载 2,进行IJ中PHP环境的配置 2.1,下载PHP插件 2.2,下载过程中的注意事项 3,为什么这么做呢? 3.1,原因 3.2,进行代码…...
java开发之个人微信的二次开发
简要描述: 修改我在某群的昵称 请求URL: http://域名/updateIInChatRoomNickName 请求方式: POST 请求头Headers: Content-Type:application/jsonAuthorization:login接口返回 参数: 参…...
ISYSTEM调试实践11-Profiler Timeline和软件运行时间分析
一 前言 本文主要内容是讨论嵌入式软件的时间分析,供大家探讨,如果有疑问欢迎探讨。 对于汽车软件,往往对执行的时序和代码运行的时间有着严格要求。对于在主循环内执行的任务函数,不论是手写还是Autosar生成,能否节拍执行到&…...
第十八章 ObjectScript - 使用例程
文章目录 第十八章 ObjectScript - 使用例程例程Procedures, Functions, and Subroutines 过程、函数和子程序procedurefunctionsubroutine 第十八章 ObjectScript - 使用例程 例程 可以将例程视为 ObjectScript 程序。例程可以从头开始编写,也可以在编译类时自动…...
Linux中select poll和epoll的区别
在Linux Socket服务器短编程时,为了处理大量客户的连接请求,需要使用非阻塞I/O和复用,select、poll和epoll是Linux API提供的I/O复用方式,自从Linux 2.6中加入了epoll之后,在高性能服务器领域得到广泛的应用࿰…...
新知同享|Cloud 开发加速创新,更加安全
谷歌在云平台中深度集成了生成式 AI 功能 帮助出海企业及开发者 轻松借力 AI 推动和实现创新 一起来看 2023 Google 开发者大会上 Google Cloud 如何加速创新,加强信息安全 关注 Google Cloud 的 3 个 AI 重点发展领域 了解生成式 AI 功能如何助推创意落地 精彩大会…...
el-form内容重置(解决点击保存关闭后再点击新增会有编辑携带的数据的问题)
主要代码: this.$refs[ruleForm].resetFields() <template><div class"add-edit-coupon"><el-dialog title"商品优惠券" top"10vh" :visible.sync"dialogVisible" width"660px" :before-close&…...
怎样吃透一个java项目?
前言 对于刚开始看视频敲代码,最忌讳的便是一上来就完全照着视频做,这么做就算完完全全的跟着视频做出来一个项目,始终都无法将里面具体的知识化为己有,单纯来说只是简单的复刻,视频的作者本身是不会对他在做该项目过…...
linux 网络命令
网络命令 配置ip 配置ip有两种方式 #方式一#setup可以使用配置工具进行配置setup#方式二 linux服务器默认网卡配置文件的目录/etc/sysconfig/network-scripts,进行配置网卡的配置文件类型- ifcfg-ethX 有线网卡的配置文件,eth0表示第一块网卡,eth1表示第…...
QUIC协议科普导入(一)
一:QUIC协议导入 QUIC是一个通用的传输层网络协议,最初由Google的Jim Roskind设计,2012年实现并部署,2013年随着实验范围的扩大而公开发布,并向IETF描述。虽然长期处于互联网草案阶段,但在从Chrome浏览器到…...
matlab 矩阵逆运算的条件数
目录 一、概述1、算法概述2、主要函数3、参考文献二、代码实现三、结果展示四、参考链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、概述 1、算法概述 条件数法是目前应用最为广泛的一种病态诊断方法。一个方阵…...
[构建自己的 Vue 组件库] 小尾巴 UI 组件库
文章归档于:https://www.yuque.com/u27599042/row3c6 组件库地址 npm:https://www.npmjs.com/package/xwb-ui?activeTabreadme小尾巴 UI 组件库源码 gitee:https://gitee.com/tongchaowei/xwb-ui小尾巴 UI 组件库测试代码 gitee:…...
由于电脑出现msvcr110.dll提示错误的解决方法
最近,我在尝试运行一款新的软件时,突然遇到了一个错误提示,提示说缺少msvcr110.dll文件,导致软件无法启动。在使用电脑过程中,我们常常会遇到一些系统文件丢失的问题。其中,msvcr110.dll是Windows操作系统中…...
[LINUX使用] iptables tcpdump wireshark tshark
iptables: 收到来自 10.10.10.10 的数据后都丢弃 iptables -I INPUT -s 10.10.10.10 -j DROP 直接 reject 来自 10.10.10.* 网段的数据 iptables -I INPUT -s 10.10.10.0/24 -j REJECT tcpdump: dump eth0的数据到本地 tcpdump -i eth0 -w dump.pcap 只抓 目的地址是 10…...
显示器鼠标滚动时或者拖拽文字变为绿色
新电脑,新显示器,看文章时滚动鼠标滑轮,文字颜色就变为绿色。 拖住文本文档或者浏览器等有文字的窗口,文字也会变为绿色。 静止时一点儿问题没有。 以下视频展示滚动和拖拽的操作,视频看不出变色,只参考…...
高校网络安全体系建设及零信任安全架构应用的探索
网络安全是高校信息化建设的重中之重,它同时也随着高校信息化的快速发展而不断面临新的挑战。因此,要用发展的眼光去看待网络安全,体系化推进网络安全体系建设。山东师范大学校园信息化经过10多年的建设发展,在网络安全上探索出了…...
Android Studio设置
Android Studio设置 一、主题 1.下载插件并重启 Material Theme UI 2.下载插件ChroMATERIAL 3.设置主题File >> Settings >> Editor >> Colors Scheme >> Scheme >> ChroMATERIAL 4.设置logcat色值File → Settings → Editor → Colors Schem…...
【RabbitMQ】介绍及消息收发流程
介绍 RabbitMQ 是实现 AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。 RabbitMQ 主要是为了实现系统之间的双向解耦而实…...
如何预防最新的Mallox变种malloxx勒索病毒感染您的计算机?
导言: 在数字时代, .malloxx 勒索病毒的威胁一直悬在我们头上,如何应对这种威胁,以及在数据被勒索后如何恢复它们,都是备受关注的话题。本文91数据恢复将向您介绍 .malloxx 勒索病毒的独特工作方式,提供与众…...
软件测试中的43个功能测试点总结
功能测试就是对产品的各功能进行验证,根据功能测试用例,逐项测试,检查产品是否达到用户要求的功能。针对web系统的常用测试方法如下: 1、页面链接检查: 每一个链接是否都有对应的页面,并且页面之间切换正…...
Flutter 通过BottomSheetDialog实现抖音打开评论区,内容自动上推、缩放效果
一、先来看下实现的效果 实现上面的效果需要解决俩个问题 当列表进行向下滑动到顶部的时候,继续滑动可以让弹窗向下收起来弹出上下拖动的时候,视图内容跟着上下移动、缩放大小 二、实现弹窗上下滑动的时候,动态改变内容区的位置和大小 通过…...
Python读取TCP的4字节浮点数
Python4字节浮点数读取 背景读取4字节的浮点数总结 背景 用Python的tkinter开发人机界面。机器是MCU的无线服务器端。Python程序为Client,连接MCU TCP server。client发送21个字节帧。按modbusTCP发送。为提高通讯效率,server端在接到client发送来的8位…...
javaee springMVC的简单使用 jsp页面在webapp和web-inf目录下的区别
项目结构 依赖文件 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/…...
个人网站建设策划书/怎么做一个网页
以下内容均为网络上整理的资料 一.链接是什么? 我们在这里可以去引用csapp 的定义 : 链接(linking)是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(或被拷贝)到存储器并执行。 了解…...
微信h5制作网站开发/昆明装饰企业网络推广
https://blog.csdn.net/weixin_33912638/article/details/86048042 方法就是在工程属性里设置: 配置属性-〉常规-〉项目默认值-〉MFC的使用-〉在静态库中使用MFC,见下图 之后重新编译即可。...
做网站横幅的图片/搜索关键词排名提升
推荐一个deep learning绝佳的入门资料 * UFLDL(Unsupervised Feature Learning and Deep Learning)教程http://deeplearning.stanford.edu/wiki/index.php/UFLDL%E6%95%99%E7%A8%8B 故意把链接地址也写出来,方便看到来源,嘿嘿。 资料写得相当赞&#x…...
python做网站好不好/今日最新消息新闻报道
题目描述 难度 简单 给定两个字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。 示例 1: 输入: s1 "abc", s2 "bca" 输出: true 示例 2: 输入…...
简述设计web站点的一般步骤/鹤壁seo推广
[1].[代码] [Python]代码1.生成随机数02 import random #这个是注释,引入模块03 rnd random.randint(1,500)#生成1-500之间的随机数0405 2.读文件0607 f open("c:\\1.txt","r")08 lines f.readlines()#读取全部内容09 for line in lines10 p…...
图片网站如何做百度排名/seo教程排名第一
2021新的一年,开启新的征程,回顾2020,真是太“南”了。 从年初各大厂裁员,竟然成为一件理所应当的事情,到四月份 GitHub 上“996.ICU” 引起了大家的共鸣。即使我们兢兢业业“996”,但依旧难以抵御 35 岁时…...