第五章单元测试
一、学习目的与要求
本章对单元测试进行了详细的介绍。通过本章的学习,应掌握单元测试的概念,了解单元测试的误区,掌握单元测试的策略、分析方法和用例设计方法。
二、考核知识点与考核目标
(一)单元测试的概念(次重点)
- 理解:单元测试的概念
- 定义: 是在软件开发过程中要进行的最低价级别的测试活动,或者说是针对软件设计的最小单位—程序模块,进行正确性检验的测试工作。
- 目的:发现每个程序模块内部可能存在的差错
- 步骤:静态检查和动态执行跟踪
- 目标:验证开发人员所编写的代码是否可以按照其所设想的方式执行并产生符合预期值的结果
- 与集成测试的区别
类别 | 单元测试 | 系统测试 |
---|---|---|
对象不同 | 详细设计 | 概要设计 |
方法不同 | 白盒测试 | 黑盒测试 |
内容不同 | 模块内程序逻辑、功能测试 | 验证各个接口、模块组合是否达到预期 |
目的相同 | 发现开发过程的错误 |
- 与系统测试的区别
类别 | 单元测试 | 系统测试 |
---|---|---|
对象不同 | 详细设计 | 需求规格说明书 |
层次不同 | 早期测试 | 后期测试 |
性质不同 | 错误容易定位,且可并行测试 | 难定位错误 |
角度不同 | 开发人员 | 用户 |
(二)单元测试环境(一般)
- 理解:单元测试环境
- 驱动模块:相当于被测模块的主程序。它接收测试数据,把这些数据传送给被测模块,最后输出实测结果。
- 桩模块:用以代替被测模块调用的子模块。桩模块可以做少量的数据操作,不需要把子模块所有功能都带进来,但不允许什么事情也不做。
(三)单元测试策略(重点)
- 理解:自顶向下策略
自顶向下的单元测试策略:
- 从顶层调用的单元做成桩模块;
- 对第二层测试,使用上面已测试的单元做驱动模块;
- 依次类推,直到全部单元测试结束。
- 优点:在集成测试之前为系统提供早期的集成途径,可以与详细设计和编码工作重叠进行。
- 缺点:被桩模块控制,测试过程会越来越复杂
- 理解:自底向上策略孤立测试
自底向上的单元测试策略:
- 先对模块调用的最底层模块进行测试,模拟调用该模块的模块为驱动模块;
- 其次,对上一层模块进行单元测试,用已经被测试过的模块做桩模块,依次类推,直到全部单元测试结束。
- 优点:不需要单独设计桩模块
- 缺点:过程会变复杂;周期会延长;维护成本会增加;顶层覆盖率难以保证;不能与编码,详设同时进行。
孤立测试的单元测试策略:
- 无需考虑每个模块与其他模块之间的关系,分别为每个模块单独设计桩模块和驱动模块,逐一完成所有单元模块的测试。
- 优点:简单,易操作,时间短,覆盖率高,可以并行。
- 缺点:成本高,需要设计多个桩模块和驱动模块。
(四)单元测试分析(次重点)
- 理解:单元测试分析
- 判断得到的结果是否正确
- 判断是否满足所有的边界条件
- 分析能否使用反向关联检查
- 分析能否使用其他手段来交叉检查一下结果
- 分析是否可以强制一些错误发生(工具:EasyMock)
- 分析模块接口
- 分析局部数据结构
- 分析独立路径
- 分析出错处理是否正确
(五)单元测试步骤(次重点)
- 理解:单元测试步骤
- 准备阶段
1)程序员培训
2)测试人员培训
3)准备环境
4)确认详设
5)编写测试用例- 编制阶段
1)程序单元编制,并调试检查
2)更正错误,修改源码和测试用例- 代码审查阶段
1)静态代码审查
2)检查算法逻辑
3)检查模块接口
4)检查输入参数
5)检查接口调用
6)出错处理
7)检查语句正确
8)检查规范
9)检查风格统一
10)检查特殊字符
11)检查是否可优化、算法效率是否最高
12)检查结构是否清晰
13)检查注释
14)检查文档- 单元测试阶段
1)设计测试用例
2)执行测试用例
3)提交执行结果- 评审、提交阶段
1)进行同级评审
2)给出评审结果
3)提交配置库
(六)单元测试用例设计(重点)
- 应用:单元测试用例设计
白盒测试覆盖要求
- 所有独立的执行路径必须覆盖一次
- 判定真假情况至少覆盖一次
- 循环的边界和运行界限内执行循环体
- 测试内部数据结构的有效性
黑盒测试覆盖要求
- 功能是否实现
- 性能是否满足要求
- 是否有可选的其他测试特性
测试用例关键元素
- 初始状态声明
- 被测单元的输入
- 实际测试代码
- 期望结果
三、习题
- 单元测试中用来模拟被测模块调用者的模块是()。A.父模块
B.子模块
C.驱动模块
D.桩模块 - 不属于单元测试内容的是()。
A. 模块接口测试
B. 局部数据结构测试
C. 路径测试
D. 用户界面测试 - 在进行单元测试时,常用的方法是______。
A. 采用白盒测试,辅之以黑盒测试
B. 采用黑盒测试,辅之以白盒测试
C. 只使用白盒测试
D. 只使用黑盒测试 - 单元测试有哪些步骤?各个步骤有哪些实施内容?
单元测试的步骤
- 通常单元测试在编码阶段进行。
- 在源程序代码编制完成,经过评审和验证,确认没有语法错误之后,就开始进行单元测试的测试用例设计。
- 利用设计文档,设计可以验证程序功能、找出程序错误的多个测试用例。
- 对于每一组输入,应有预期的正确结果。
- 模块并不是一个独立的程序,在考虑测试模块时,同时要考虑它和外界的联系,用一些辅助模块去模拟与被测模块相联系的其它模块。这些辅助模块分为两种:
a. 驱动模块:相当于被测模块的主程序。它接收测试数据,把这些数据传送给被测模块,最后输出实测结果。
b. 桩模块:用以代替被测模块调用的子模块。桩模块可以做少量的数据操作,不需要把子模块所有功能都带进来,但不允许什么事情也不做。- 被测模块、与它相关的驱动模块及桩模块共同构成了一个“测试环境”。
单元测试内容
- 模块接口测试:对通过被测模块的数据流进行测试。为此,对模块接口,包括参数表、调用子模块的参数、全程数据、文件输入/输出操作都必须检查。局部数据结构测试:设计测试用例检查数据类型说明、初始化、缺省值等方面的问题,还要查清全程数据对模块的影响。
- 路径测试:选择适当的测试用例,对模块中重要的执行路径进行测试。对基本执行路径和循环进行测试可以发现大量路径错误。
- 错误处理测试:检查模块的错误处理功能是否包含有错误或缺陷。例如,是否拒绝不合理的输入;出错的描述是否难以理解、是否对错误定位有误、是否出错原因报告有误、是否对错误条件的处理不正确;在对错误处理之前错误条件是否已经引起系统的干预等。
- 边界测试:要特别注意数据流、控制流中刚好等于、大于或小于确定的比较值时出错的可能性。对这些地方要仔细地选择测试用例,认真加以测试。
此外,如果对模块运行时间有要求的话,还要专门进行关键路径测试,以确定最坏情况下和平均意义下影响模块运行时间的因素。这类信息对进行性能评价是十分有用的。单元测试的优点:
- 它是一种验证行为。
程序中的每一项功能都是测试来验证它的正确性。它为以后的开发提供支援。就算是开发后期,我们也可以轻松的增加功能或更改程序结构,而不用担心这个过程中会破坏重要的东西。而且它为代码的重构提供了保障。这样,我们就可以更自由的对程序进行改进。- 它是一种设计行为。
编写单元测试将使我们从调用者观察、思考。特别是先写测试(test-first),迫使我们把程序设计成易于调用和可测试的,即迫使我们解除软件中的耦合。- 它是一种编写文档的行为。
单元测试是一种无价的文档,它是展示函数或类如何使用的最佳文档。这份文档是可编译、可运行的,并且它保持最新,永远与代码同步。- 它具有回归性。
自动化的单元测试避免了代码出现回归,编写完成之后,可以随时随地的快速运行测试。
- 简述单元测试的目的和意义。
目的:是暴漏出失败和错误。失败的可能性是可预期的,并且可以使用断言来进行检查。
而错误则是不可预期的问题意义:
- 提前发现问题并解决可以节约时间
- 是测试阶段的基础,为后期的集成测试和系统测试做好准备;
- 对单元独立测试,容易发现问题,减少成本。
- 单元测试策略主要有哪些?并试描述这些策略?
单元测试策略主要有三种方式:
- 自顶向下的单元测试策略:从顶层调用的单元做成桩模块;对第二层测试,使用上面已测试的单元做驱动模块;依次类推,直到全部单元测试结束。
- 自底向上的单元测试策略:先对模块调用的最底层模块进行测试,模拟调用该模块的模块为驱动模块;其次,对上一层模块进行单元测试,用已经被测试过的模块做桩模块,依次类推,直到全部单元测试结束。
- 孤立测试的单元测试策略:无需考虑每个模块与其他模块之间的关系,分别为每个模块单独设计桩模块和驱动模块,逐一完成所有单元模块的测试。
- 什么是驱动模块?什么是桩模块
单元本身无法构成一个切实可运行的程序系统,所以我们需要为单元测试来开发桩模块和驱动模块,从而完成我们的单元测试目的,这是桩模块和驱动模块的作用。
- 驱动模块是用来模拟被测试模块的上一级模块,相当于被测模块的主程序。它接收数据,将相关数据传送给被测模块,启用被测模块,并打印出相应的结果。
- 桩模块(Stub) 是指模拟被测试的模块所调用的模块,而不是软件产品的组成的部分。
- 单元测试是根据在详细设计阶段中产生的规格说明进行的。
- 在单元测试中, 桩模块用来代替被测模块的子模块。
- 单元测试中用来模拟被测模块调用者的模块是
A父模块
B子模块
C驱动模块
D桩模块 - 在软件底层进行的测试称为()
A系统测试
B集成测试
C单元测试
D功能测试 - 典型的软件测试过程模型是()
A. V模型、W模型、H模型、迭代模型
B. V模型、W模型、H模型、螺旋模型
C. X模型、W模型、H模型、V模型
D. X模型、W模型、H模型、增量模型 - 用户在真实的工作环境中使用软件,用于测试系统的用户友好性等。这种测试是()
A. 集成测试
B. 系统测试
C. Alpha测试
D. Beta测试 - 几乎没有产品计划、进度安排和正规的开发过程的软件开发模式是()
A大棒模式
B边写边改模式
C瀑布模式
D快速原型开发模式 - 软件测试不需要了解软件设计的()
A功能
B内部结构
C处理过程
D条件 - 实际的逻辑覆盖测试中,一般以( )为主设计测试用例。
A. 条件覆盖
B. 判定覆盖
C. 条件组合覆盖
D. 路径覆盖 - 以下不属于单元测试优点的一项是()
A它是一种验证行为
B它是一种设计行为
C它是一种编写文档的行为
D它是一种评估行为 - 为特定的目的而设计的一组测试输入、执行条件和预期的结果叫做测试用例
- 用于触发被测模块的软件模块叫做驱动模块_。
相关文章:

第五章单元测试
一、学习目的与要求 本章对单元测试进行了详细的介绍。通过本章的学习,应掌握单元测试的概念,了解单元测试的误区,掌握单元测试的策略、分析方法和用例设计方法。 二、考核知识点与考核目标 (一)单元测试的概念&#…...

【JAVA基础】多线程与线程池
多线程与线程池 文章目录 多线程与线程池1. 相关概念1.1 线程调度1.2 守护线程 2. 生命周期3. 同步机制/同步锁3.1 synchronized3.2 lock3.3 synchronized 与 Lock 的对比 4. 死锁5. 线程通信5.1 线程间的通信5.2 等待唤醒机制5.3 举例5.4 调用 wait 和 notify 需注意的细节5.5…...

HCIA数据通信——交换机(Vlan间的通信与安全)
前言 之前的提到了交换机的概念和实验。不过交换机的一些功能还没有说完,我们的实验也仅仅是阻止相同地址段的IP地址互通,也没有用到子接口和路由器。显然,那样的配置过于简单。 端口安全 Port Security(端口安全)的功…...

Linux shell编程学习笔记16:bash中的关联数组
上一节我们探讨了普通的数组,即使用数字下标来索引数组中不同的元素的数组,也可以称之为索引数组。 相比纯粹的数字,字符串不仅能表明含义,也更便于记忆使用,于是就有了关联数组。 一、关联数组概述 bash 从4.0开始支…...

浏览器是怎么执行JS的?——消息队列与事件循环
看完渡一的课后,感觉这块内容确实非常重要,写 JS 的连 JS 的执行原理都不知道可不行。 事件循环 在写 JS 的时候,你有没有想过 JS 是按照什么顺序执行的?浏览器是怎么执行 JS 代码的?为什么有时候代码没有按照我们认为…...

IMU预积分的过程详解
一、IMU和相机数据融合保证位姿的有效性: 当运动过快时,相机会出现运动模糊,或者两帧之间重叠区域太少以至于无法进行特征匹配,所以纯视觉SLAM对快速的运动很敏感。而有了IMU,即使在相机数据无效的那段时间内ÿ…...

TypeScript中的类型运算符
类型运算符 1. keyof运算符 1. 简介 是一个单目运算符,接受一个对象类型作为参数,返回该对象的所有键名组成的联合类型。 type MyObj {foo: number,bar: string, };type Keys keyof MyObj; // foo|bar这个例子keyof MyObj返回MyObj的所有键名组成的…...

【蓝桥杯选拔赛真题03】C++输出字母Y 青少年组蓝桥杯C++选拔赛真题 STEMA比赛真题解析
目录 C/C++输出字母Y 一、题目要求 1、编程实现 2、输入输出 二、算法分析...

redis搭建集群-多实例快速搭建
1.基础的redis.conf的配置 # Redis configuration file example. # # Note that in order to read the configuration file, Redis must be # started with the file path as first argument: # # ./redis-server /path/to/redis.conf# Note on units: when memory size is ne…...

为什么进行压力测试? 有哪些方法?
在信息技术飞速发展的今天,软件系统的性能已经成为了用户满意度的决定性因素之一。而要确保一个系统在实际使用中能够稳定可靠地运行,压力测试就显得尤为关键。本文将深入探讨什么是压力测试,为什么它是如此重要,以及一些常见的压…...

Java开发者必备:支付宝沙箱环境支付远程调试指南
🔥博客主页: 小羊失眠啦. 🔖系列专栏: C语言、Linux、Cpolar ❤️感谢大家点赞👍收藏⭐评论✍️ 文章目录 前言1. 下载当面付demo2. 修改配置文件3. 打包成web服务4. 局域网测试5. 内网穿透6. 测试公网访问7. 配置二级…...

基于STM32温湿度传感器采集报警系统设计
**单片机设计介绍,1648【毕设课设】基于STM32温湿度传感器采集报警系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序程序 六、 文章目录 一 概要 这次的设计主要是通过读取DHT11和HCSR04的数值,(Proteus的传感器…...

檢測項目簡體字
某些項目可能要求代碼中不允許使用簡體字 安裝stcheck檢查 yarn add stcheck --dev在項目根目錄創建 st.config.json 文件 {"patterns": ["./**/*.(ts|js|tsx|jsx|vue|html)","!**/node_modules/**","!.git/**"],"gitignore&q…...

适用于嵌入式arm的ffmpeg编解码
在嵌入式arm应用开发中,经常会遇到需要处理视频的情况,这时候就需要强大的开源工具ffmpeg出马了。 这里可以下载到各个版本的ffmpeg。 ffmpeg各版本https://www.videohelp.com/software/ffmpeg/old-versions 现在ffmpeg更新较频繁,如…...

nlp与知识图谱代码解读_词嵌入
目录 词嵌入简单原理代码案例解读专业原理介绍场景 词嵌入 简单原理 可以使用一些比喻和生活中的例子: 老师: 你们还记得玩乐高积木的时候,每个积木块代表了一个特定的事物或形状吗?现在,想象一下,每个词…...

HarmonyOS 音频通话开发指导
常用的音频通话模式包括 VOIP 通话和蜂窝通话。 ● VOIP 通话:VOIP(Voice over Internet Protocol)通话是指基于互联网协议(IP)进行通讯的一种语音通话技术。VOIP 通话会将通话信息打包成数据包,通过网络进…...

LeetCode讲解篇之面试题 01.08. 零矩阵
文章目录 题目描述题解思路题解代码 题目描述 题解思路 遍历矩阵,若当前元素为零,则将该行和该列的第一个元素置零 遍历第一行,若当前元素为零,则将当前列置零 遍历第一列,若当前元素为零,则将当前行置零 …...

安装python虚拟环境
什么是虚拟环境: 虚拟环境的意义,就如同 虚拟机 一样,它可以实现不同环境中Python依赖包相互独立,互不干扰。 环境准备 安装python (到官网下载Download Python配置环境变量,cmd进入命令行输入 python…...

【App 抓包提示网络异常怎么破?】
背景 当你测试App的时候,想要通过Fiddler/Charles等工具抓包看下https请求的数据情况,发现大部分的App都提示网络异常/无数据等等信息。以“贝壳找房”为例: 455 x 705 Fiddler中看到的请求是这样的: 619 x 215 你可能开始找证书的问题:是不是Fiddler/Charles的证书没有…...

【开发篇】一、处理函数:定时器与定时服务
文章目录 1、基本处理函数2、定时器和定时服务3、KeyedProcessFunction下演示定时器4、process重获取当前watermark 前面API篇完结,对数据的转换、聚合、窗口等,都是基于DataStream的,称DataStreamAPI,如图: 在Flink…...

重入漏洞EtherStore
重入漏洞 // SPDX-License-Identifier: MIT pragma solidity ^0.8.13;contract EtherStore {mapping(address > uint) public balances;function deposit() public payable {balances[msg.sender] msg.value;}function withdraw() public {uint bal balances[msg.sender]…...

账号运营的底层逻辑---获客思维
什么是运营? 运营是做什么的? 什么是内容运营? 什么是活动运营? 一篇带你搞清楚所有的底层逻辑!...

Pinia中如何实现数据持久化操作
使用vue3中的pinia,我们可以在多个页面间共享数据,但是一旦我们关闭或刷新页面,这些数据就会丢失,因此,我们需要有一种数据持久化的解决方案。在记录vue3 使用vue3中的pinia,我们可以在多个页面间共享数据&…...

【owt-server】RTC视频接收调用流程学习笔记1: Call::CreateVideoReceiveStream 前后
WebRTC源码分析——Call模块 大神提到,call模块是在worker线程创建的。主要创建接收、发送流Call模块是WebRTC会话中不可缺少的一个模块,一个Call对象可以包含多个发送/接收流,且这些流对应同一个远端端点,并共享码率估计。 call中通过webrtc::VideoReceiveStream::Config …...

淘宝商品链接获取淘宝商品评论数据(用 Python实现淘宝商品评论信息抓取)
在网页抓取方面,可以使用 Python、Java 等编程语言编写程序,通过模拟 HTTP 请求,获取淘宝多网站上的商品详情页面评论内容。在数据提取方面,可以使用正则表达式、XPath 等方式从 HTML 代码中提取出有用的信息。值得注意的是&#…...

十九、类型信息(1)
本章概要 为什么需要 RTTI RTTI(RunTime Type Information,运行时类型信息)能够在程序运行时发现和使用类型信息 RTTI 把我们从只能在编译期进行面向类型操作的禁锢中解脱了出来,并且让我们可以使用某些非常强大的程序。对 RTTI …...

十八、字符串(3)
本章概要 正则表达式 基础创建正则表达式量词CharSequencePattern 和 Matcherfinde()组(Groups)start() 和 end()Pattern 标记split()替换操作reset()正则表达式与 Java I/0 正则表达式 很久之前,_正则表达式_就已经整合到标准 Unix 工具…...

基于SSM的酒店预约及管理系统设计与实现
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…...

MIxformerV2的onnx和tensorrt加速
MIxformerV2的onnx和tensorrt加速 注意事项 地址:github地址 注意事项 转换成onnx模型之前,最好现简化算法的源代码,使其结构干净。因为在进行onnx转换后,可能在进行onnx→trt时算子不匹配,这时就需要去查看模型的源…...

Kotlin 中let 、run 、with、apply、also的用法与区别
实例代码 User(val userName:String,val age:Int){fun printName(){println(userName)}fun getUserName():String{return userName}} let 函数 let 函数常用来与对象的空判断一起用,起到作用于的限定效果。let 函数最后一行返回值。(比如实例需要let函…...