一、学习目的与要求
本章对单元测试进行了详细的介绍。通过本章的学习,应掌握单元测试的概念,了解单元测试的误区,掌握单元测试的策略、分析方法和用例设计方法。
二、考核知识点与考核目标
(一)单元测试的概念(次重点)
- 理解:单元测试的概念
- 定义: 是在软件开发过程中要进行的最低价级别的测试活动,或者说是针对软件设计的最小单位---程序模块,进行正确性检验的测试工作。
- 目的:发现每个程序模块内部可能存在的差错
- 步骤:静态检查和动态执行跟踪
- 目标:验证开发人员所编写的代码是否可以按照其所设想的方式执行并产生符合预期值的结果
- 与集成测试的区别
类别 | 单元测试 | 系统测试 |
---|---|---|
对象不同 | 详细设计 | 概要设计 |
方法不同 | 白盒测试 | 黑盒测试 |
内容不同 | 模块内程序逻辑、功能测试 | 验证各个接口、模块组合是否达到预期 |
目的相同 | 发现开发过程的错误 |
- 与系统测试的区别
类别 | 单元测试 | 系统测试 |
---|---|---|
对象不同 | 详细设计 | 需求规格说明书 |
层次不同 | 早期测试 | 后期测试 |
性质不同 | 错误容易定位,且可并行测试 | 难定位错误 |
角度不同 | 开发人员 | 用户 |
(二)单元测试环境(一般)
- 理解:单元测试环境
- 驱动模块:相当于被测模块的主程序。它接收测试数据,把这些数据传送给被测模块,最后输出实测结果。
- 桩模块:用以代替被测模块调用的子模块。桩模块可以做少量的数据操作,不需要把子模块所有功能都带进来,但不允许什么事情也不做。
(三)单元测试策略(重点)
- 理解:自顶向下策略
自顶向下的单元测试策略:
- 从顶层调用的单元做成桩模块;
- 对第二层测试,使用上面已测试的单元做驱动模块;
- 依次类推,直到全部单元测试结束。
- 优点:在集成测试之前为系统提供早期的集成途径,可以与详细设计和编码工作重叠进行。
- 缺点:被桩模块控制,测试过程会越来越复杂
- 理解:自底向上策略孤立测试
自底向上的单元测试策略:
- 先对模块调用的最底层模块进行测试,模拟调用该模块的模块为驱动模块;
- 其次,对上一层模块进行单元测试,用已经被测试过的模块做桩模块,依次类推,直到全部单元测试结束。
- 优点:不需要单独设计桩模块
- 缺点:过程会变复杂;周期会延长;维护成本会增加;顶层覆盖率难以保证;不能与编码,详设同时进行。
孤立测试的单元测试策略:
- 无需考虑每个模块与其他模块之间的关系,分别为每个模块单独设计桩模块和驱动模块,逐一完成所有单元模块的测试。
- 优点:简单,易操作,时间短,覆盖率高,可以并行。
- 缺点:成本高,需要设计多个桩模块和驱动模块。
(四)单元测试分析(次重点)
- 理解:单元测试分析
- 判断得到的结果是否正确
- 判断是否满足所有的边界条件
- 分析能否使用反向关联检查
- 分析能否使用其他手段来交叉检查一下结果
- 分析是否可以强制一些错误发生(工具: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) 是指模拟被测试的模块所调用的模块,而不是软件产品的组成的部分。