1、1/26/20231第2章:单元测试 主讲:林跃进1/26/202323.1单元测试概述n定义:单元测试又称程序模块测试,是检验程序的最小的单位测试。n单元测试的主要任务:n单元测试针对每个程序的模块,主要测试5个方面的问题:n模块接口、局部数据结构、边界条件、独立的路径、错误处理1/26/202333.1单元测试概述n模块接口模块接口n这是对模块接口进行的测试,检查进这是对模块接口进行的测试,检查进出程序单元的数据流是否正确。模块出程序单元的数据流是否正确。模块接口测试必须在任何其它测试之前进接口测试必须在任何其它测试之前进行。行。1/26/202343.1单元测试概述n模块接口测试至少需要
2、如下的测试项目:n(1)(1)调用所测模块时的输入参数与模块的形调用所测模块时的输入参数与模块的形式参数在个数、类型、顺序上是否一致;式参数在个数、类型、顺序上是否一致;n(2)(2)所测模块调用子模块时,它输入给子模所测模块调用子模块时,它输入给子模块的参数与子模块中的形式参数在个数、类块的参数与子模块中的形式参数在个数、类型、顺序上是否一致;型、顺序上是否一致;n(3)(3)是否会修改只是作为输入值的形式参数是否会修改只是作为输入值的形式参数n(4)(4)调用标准函数的参数在个数、类型、顺调用标准函数的参数在个数、类型、顺序上是否正确;序上是否正确;n(5)(5)全局变量的定义在各模块中是
3、否一致。全局变量的定义在各模块中是否一致。1/26/202353.1单元测试概述n局部数据结构n在模块工作过程中,必须测试模块内在模块工作过程中,必须测试模块内部的数据能否保持完整性,包括内部部的数据能否保持完整性,包括内部数据的内容、形式及相互关系不发生数据的内容、形式及相互关系不发生错误。错误。1/26/20236n对于局部数据结构,应该在单元测试中注意发现以下几类错误:n(1)(1)变量从来没有被使用,包括可变量从来没有被使用,包括可能别的地方使用了外部变量或函能别的地方使用了外部变量或函数。数。n(2)(2)变量没有初始化。变量没有初始化。n(3)(3)错误的类型转换。错误的类型转换。
4、n(4)(4)数组越界。数组越界。n(5)(5)变量或函数名称拼写错误,包变量或函数名称拼写错误,包括使用了外部变量或者函数。括使用了外部变量或者函数。1/26/202373.1单元测试概述n边界条件测试:n主要检查临界数据是否正确处理。n(1)普通合法数据是否正确处理;n(2)普通非法数据是否正确处理;n(3)边界内最接近边界的(合法/非法)数据是否正确处理。1/26/202383.1单元测试概述独立路径测试n在单元测试中,最主要的测试是在单元测试中,最主要的测试是针对路径的测试。测试用例必须针对路径的测试。测试用例必须能够发现由于计算错误、不正确能够发现由于计算错误、不正确的判定或不正常的
5、控制流而产生的判定或不正常的控制流而产生的错误。的错误。1/26/202393.1单元测试概述n常见的错误有:n死代码死代码n错误的计算优先级;错误的计算优先级;n精度错误,包括比较运算错误、赋值错精度错误,包括比较运算错误、赋值错误;误;n表达式的不正确符号,包括表达式的不正确符号,包括,=,=,=,!=,=,=,=,!=;n循环变量的使用错误,包括错误赋值。循环变量的使用错误,包括错误赋值。1/26/2023103.1单元测试概述n出错处理 n测试出错处理的重点是模块在工作中发生了错误,其中的出错处理设施是否有效。n检验程序中的出错处理可能面对的情况有:1/26/2023113.1单元测试
6、概述n(1)是否检查错误出现,包括资源使用前后、其它模块使用前后;n(2)出现错误是否进行处理,包括抛出错误、通知用户、进行记录。n(3)错误处理是否有效,包括在系统干预前处理、报告和记录的错误都应真实详细。1/26/2023123.2 单元测试的执行过程n单元测试的执行过程n单元测试常常是和代码编写工作同时进行的,在完成了程序编写、复查和语法正确性验证后,就应进行单元测试用例设计。n在单元测试时,如果模块不是独立的程序,需要设置一些辅助测试模块。辅助测试模块有两种:1/26/2023133.2 单元测试的执行过程n(1)驱动模块(Drive)用来模拟被测试模块的上一级模块,相当于被测模块的主
7、程序。它接收数据,将相关数据传送给被测模块,启动被测模块,并打印出相应的结果。n(2)桩模块(Stub)用来模拟被测模块工作过程中所调用的模块。它们一般只进行很少的数据处理。1/26/2023141.单元测试1/26/2023153.2 单元测试的执行过程n驱动模块和桩模块都是额外的开销,虽然在单元测试中必须编写,但并不需要作为最终的产品提供给用户。1/26/202316单元测试#include#include void iszero(int m)void iszero(int m)if(m!=0)if(m!=0)printf(“%d”,m);printf(“%d”,m);else print
8、f(“%d”,1);else printf(“%d”,1);void main(void)void main(void)int a5;int a5;int i=0;int i=0;printf(“printf(“输入输入5 5个整数个整数:n:n”);”);for(i=0;i=4;i+)for(i=0;i=4;i+)scanf(“%d”,&ai);scanf(“%d”,&ai);iszero(ai);iszero(ai);1/26/2023173.3 单元测试的执行过程n在代码编写完成后的单元测试工作主要分为两个步骤:人工静态检查(静态测试)和动态执行跟踪(动态测试)。1/26/2023183
9、.3 单元测试的执行过程n静态测试是指测试不运行的部分只是检查和审阅。n动态测试是指通常意义上的测试运行和使用软件。n单元测试的依据是详细设计和概要设计!1/26/2023193.3 单元测试的执行过程n静态测试n不运行程序,通过程序员本人或其它人员执行人工检查,主要检查:n代码风格和规则检查n程序设计和结构的检查n业务逻辑检查n同行评审:走读、小组评审、审查。(p.23)1/26/202320静态测试n(1)走读n一般检查代码,也可以是检查设计文档。n一般是项目内部的其它开发人员,不涉及公司高层或外部专家。1/26/202321静态测试n(2)小组评审n由一个正式的组织对产品进行评价。确认任
10、何与需求规格、设计规格或标准不一致的地方或者在检查后给出可替换的建议。n参与者主要是公司技术领导或权威公司及外部专家,主要适用于需求规格和概要设计的评审。1/26/202322静态测试n(3)审查n遵循严格的过程,人员经过培训,检查过程有标准,检查针对实际的产品或半成品,目的是发现存在的错误。n参加人员:公司内部设计、开发、测试、质量等部门中的工作性相关的员工组成。1/26/202323静态测试n详细设计静态测试(p.25)n代码静态测试(p.26)1/26/202324动态测试n动态测试n黑盒测试n白盒测试1/26/2023253.4 基于JUnit的单元测试n详细见实验指导书1/26/20
11、2326作业n1 1。简述单元测试的步骤。简述单元测试的步骤n2 2。什么是驱动模块和桩模块?为下面的函数构造一个。什么是驱动模块和桩模块?为下面的函数构造一个驱动模块,并至少设计驱动模块,并至少设计5 5条测试用例。条测试用例。n/*计算两个整数的除法运算计算两个整数的除法运算,将结果转换为单一精度输将结果转换为单一精度输出出*/nfloat divide(int a,int b)float divide(int a,int b)n float c;float c;n if(b=0)if(b=0)n printf(“printf(“除数不能为除数不能为0 0!”););n return 0;return 0;n c=(float)a/b;c=(float)a/b;n return c;return c;n