文章目录
- 1. 单元测试方法
- 2. 单元测试内容
- 3. 单元测试类型
- 4. 断言
- 5. 单元测试的作用
1. 单元测试方法
- 测试的四个阶段:单元测试→集成测试→系统测试→验收测试
- 什么是单元测试?
定义:单元测试是对软件基本组成单元进行的测试
时机:在代码完成后由开发人员完成,QA人员辅助(QA:质量保证)
对象:类、模块、组件、单元 - 单元测试的多个被测模块之间的单元测试可同时进行,以提高单元测试效率
- 单元测试一般由编程人员完成,有时也有测试人员,但编程人员起主要作用
- 单元测试的依据是软件的详细设计描述、源程序清单、编码标准等
- 单元测试的目的
(1)验证代码能否达到详细设计的预期要求
(2)发现代码中不符合编码规范的地方
(3)准确发现定位的错误,以便排除错误 - 单元测试优点:修复成本低;由于单元测试是在编码过程中进行的,有助于规范源代码,提高源代码质量
- 单元测试的步骤
① 计划单元测试
② 设计单元测试
③ 实现单元测试
④ 执行单元测试
⑤ 单元测试结果分析并提交测试报告 - 单元测试一般为编码步骤的附属部分,模块自己不能运行,要靠其它部分来调用和驱动,要为每个单元测试开发两个软件:驱动模块driver和桩模块stub
- 驱动模块driver:被测单元的上层模块。能够接收测试数据,调用被测单元,将数据传递给被测单元,最后打印测试执行结果。可将驱动模块理解为被测单元的主程序
- 桩模块stub:又称为存根模块,用来代替被测单元的子模块。桩模块的目的是模拟被测模块的接口。桩模块不需包括子模块的全部功能,但应做少量的数据操作,并打印接口处信息
- 测试过程中应尽量避免桩模块和驱动模块,尤其是桩模块,因为开发桩模块的工作量更大
- 采用自底向上的方式进行开发时,可避免开发桩模块。
若采用自底向上的方式进行开发,底层的单元先开发并先测试,可以避免开发桩模块,采用这种方法测试上层单元时,也是对下层单元的间接测试,但当下层单元被改动后,则需要执行回归测试判断其上层单元是否需要修改。
当不得不开发驱动模块及桩模块时,人们力求它们的简单以提高工作效率。但过于简单的驱动模块和桩模块会影响单元测试的有效性,因而,对被测单元的彻底测试有时会被推迟到集成测试阶段完成
- 如何构建单元测试环境
构造最小运行调度系统,即构造被测单元的驱动模块。
模拟被测单元的接口,即构造被被测单元调用的桩模块。
模拟生成测试数据及状态,为被测单元运行准备动态环境。
2. 单元测试内容
- 单元测试的对象是软件设计的最小单元——模块或函数,单元测试的依据是详细设计的描述
- 单元测试的内容
模块接口
局部数据结构测试
路径测试
错误处理测试
边界测试 - 模块接口测试
调用所测模块的输入参数与模块的形式参数在个数、属性、顺序上是否匹配;
所测模块调用子模块时,它输入个子模块的参数与子模块的形式参数在个数、属性、顺序上是否匹配;
是否修改了只做输入用的形式参数;
输出给标准函数的参数在个数、属性、顺序上是否匹配;
全局变量的定义在各模块中是否一致;
限制是否通过形式参数来传送。 - 局部数据结构测试
检查不正确或不一致的数据类型说明;
使用尚未赋值或尚未初始化的变量;
错误的初始值或错误的默认值;
变量名拼写错误或书写错误;
不一致的数据类型 - 路径测试
(1)常见的不正确的计算有:
运算的优先次序不正确或误解了运算的优先次序;
运算的方式错误(运算的对象彼此在类型上不相容);
算法错误;
初始化不正确;
运算精度不够;
表达式的符号表示不正确等。
(2)常见的比较和控制流错误有:
不同数据类型的比较;
不正确的逻辑运算符或优先次序;
因浮点运算精度问题而造成的两值比较不等;
关系表达式中不正确的变量和比较符;
“差1错”,即不正确地多循环或少循环一次;
错误的或不可能的循环终止条件;
当遇到发散的迭代时不能终止循环;
不适当地修改了循环变量等 - 错误处理测试(容错)
出错的描述难以理解;
出错的描述不足以对错误定位和确定出错的原因;
显示的错误与实际的错误不符;
对错误条件的处理不正确;
在对错误进行处理之前,错误条件已经引起系统的干预;
如果出错情况不予考虑,那么检查恢复正常后模块可否正常工作 - 边界测试
在n次循环的第0次、1次、n次是否有错误;
运算或判断中取最大最小值时是否有错误;
数据流、控制流中刚好等于、大于、小于确定的比较值时是否出现错误
3. 单元测试类型
- 单元测试类型
逻辑单元测试;
集成单元测试;
功能单元测试 - 在确定测试用例的同时,应给出期望结果
- 进行单元测试时,常用的方法是采用白盒测试,辅之以黑盒测试
- 根据测试对象的其内部结构的逻辑关系、测试的方法,按照由小到大、由单一到组合、又简单到复杂,单元测试可以逻辑单元测试、集成单元测试和功能单元测试
4. 断言
- 断言定义:简单的方法调用,判断一个语句、一个函数或对象的一个方法所产生的结果是
否符合你期望的那个结果(为真)。 - 断言应用时机:
(1)用错误处理代码来处理预期会发生的状况,用断言来处理绝不应该发生的状况。
(2)用断言来注解并验证前(置)条件和后(置)条件
(3)对于高健壮性的代码,应该先使用断言再处理错误 - 断言应用场景:
(1)在功能代码开发阶段,可以逐步添加断言测试是否获取自己想要的数据结果
(2)写单元测试时,可用到断言,主要目的:测试这个功能片段的代码能否返回预期的结果。
(3)自己提供接口供他人使用时,可先断言使用者传递过来的参数是否符合要求,如果不符合要求,将以AssertionError的方式告知使用者。 - assertion(断言)是软件开发中一种常用的调试方式,很多开发语言中都支持这种机制。
- assertion就是在程序中的一条语句,它对一个布尔表达式进行检查,必须保证这个表达式的值为true;如果为false,则说明程序已经处于不正确的状态,系统将给出警告或退出。
- assertion用于保证程序最基本、关键的正确性。
- assertion 通常在开发和测试时开启。为了提高性能,在软件发布后,assertion 通常是关闭的
- 断言的语法格式
assert( b_exp1 );或 assert( b_exp1 ): info; - 注意
若断言为假,将抛出AssertionError异常。
与if 判断不同,assert为假则报错
5. 单元测试的作用
- 单元测试的目的
验证代码能否达到详细设计的预期要求。
发现代码中不符合编码规范的地方。
准确定位发现的错误,以便排除错误 - 单元测试的作用
编写单元测试可以帮助开发人员书写高质量的代码。
编写单元测试可以使开发人员更有信心重构应用程序 ,去拥抱变化