软件测试课件第4章单元测试

上传人:E**** 文档编号:91188657 上传时间:2019-06-26 格式:PPT 页数:31 大小:358KB
返回 下载 相关 举报
软件测试课件第4章单元测试_第1页
第1页 / 共31页
软件测试课件第4章单元测试_第2页
第2页 / 共31页
软件测试课件第4章单元测试_第3页
第3页 / 共31页
软件测试课件第4章单元测试_第4页
第4页 / 共31页
软件测试课件第4章单元测试_第5页
第5页 / 共31页
点击查看更多>>
资源描述

《软件测试课件第4章单元测试》由会员分享,可在线阅读,更多相关《软件测试课件第4章单元测试(31页珍藏版)》请在金锄头文库上搜索。

1、单元测试的定义; 单元测试同集成测试和系统测试的区别; 单元测试环境的组成; 单元测试的分析方法; 单元测试的用例设计方法; 单元测试的过程。,本章要点,第四章 单元测试,举例认识单元测试,假如写了一个加法函数: int add(int a,int b) return a-b; 问:他有什么功能,举个例子看看? 答:可实现两数相加,得到结果。 输入两个1,就会返回它们的和:2 问:真的吗?执行一下看 答:写个驱动执行一下(代码在下一页),哦,不对,返回了0,有错误。,单元测试代码,void test_add() int a=1; int b=1; int ret=add(a,b); ASSER

2、T(ret=2); int main() test_add(); ,结果:不是2,而是0,说明此函数存在错误。,定义:在软件开发过程中要进行的最低级别的测试活动 针对软件设计的最小单位程序模块,进行正确性 检验的测试工作。 目的:发现每个程序模块内部可能存在的差错。,人工静态检查,动态执行跟踪,4.1 单元测试概述,方式,4.1.1 单元测试的误区,1、单元测试是一种浪费时间的工作 2、单元测试只能证明代码做了什么 原因:无规格说明 3、我是个很棒的程序员, 我是不是可以不进行单元测试? 人非圣贤,孰能无过 4、集成测试能捕捉到所有的Bug 清洗豆浆机 5、单元测试的成本效率不高,单元测试(跳

3、过),集成测试,直接,程序,存在BUG,定位(难),3.25小时,6.25小时,11.5小时,单元测试,集成测试,系统测试,图4-1 测试成本效率对比,单元模块的可靠性,系统总体可靠性,90% 99% 99.9%,34.87% 90.44% 99.9%,若某系统由10个单元模块组成,那么每个单元的可靠性和系统总体可靠性的关系如下:,4.1.2单元测试与集成测试区别,角度,单元测试,集成测试,方法,时间,主要内容,白盒,早,程序(模块内),黑盒、白盒,晚,接口、组合,4.1.3单元测试与系统测试区别,角度,单元测试,系统测试,时间,人员,错误定位,早,开发者,易,晚,用户,难,4.2 单元测试环

4、境,建立原因:一个模块或一个方法与外界的联系是必然的。 辅助模块(用于模拟与所测模块相联系的其它模块)分为两种: 驱动模块(driver):相当于所测模块的主程序。 桩模块(stub):用于代替所测模块调用的子模块。 所测模块和与它相关的驱动模块及桩模块共同构成了一个“测试环境”。,输入数据,输出结果,图4-2 单元测试环境,调用,如:main()主函数,4.3 单元测试策略,功能测试,静态测试,白盒测试,状态转换测试,非功能测试,单元测试的 测试技术,单元测试的 测试策略,自顶向下的单元测试策略,自底向上的单元测试策略,孤立的单元测试策略,4.3.1自顶向下的单元测试策略,步骤: 1. 从最

5、顶层开始,把顶层调用的单元做成桩模块。 2. 对第二层测试,使用上面已测试的单元做驱动模块。 3. 依次类推,直到全部单元测试结束。 优点:可以提供早期的集成路径。 总结: 要做桩模块,成本要高于孤立的单元测试成本,因此从测试成本方面来考虑,并不是最佳的单元测试策略。,4.3.2自底向上的单元测试策略,步骤: 1、先对模块调用图上的最底层模块开始测试,模拟调用该模块的模块为驱动模块。 2、其次,对上一层模块进行单元测试,用已经被测试过的模块做桩模块。 3、依次类推,直到全部单元测试结束。 优点:不需要单独设计桩模块。 总结:相对其它测试策略而言,该测试策略比较合理,尤其是需要考虑 对象或复用时

6、。,4.3.3 孤立测试,步骤:分别为每个模块单独设计桩模块和驱动模块,逐一完成所有单元模块的测试。 优点:该方法简单、容易操作,因此所需测试时间短,能够达到高覆盖率。 缺点:不能为集成测试提供早期的集成途径。依赖结构设计信息,需要设计多个桩模块和驱动模块,增加了额外的测试成本。 总结:该方法是比较理想的单元测试方法。如辅助适当的集成测试策略,有利于缩短项目的开发时间。,4.3.4 综合测试,在单元测试中,为了有效地减少开发桩模块的工作量,可以考虑综合自底向上测试策略和孤立测试策略。,4.4单元测试分析(一),注:不能仅仅测试最理想的情况。(轮船引擎) 从如下几方面进行分析和测试: 1、判断得

7、到的结果是否正确? 如:加法函数功能 2、判断是否满足所有的边界条件? 1)输入一个格式错误的数据。 如:年月YYYY-MM 2)提供一个空值或者不完整的值。如:主键为空 3)与意料之中的值相差很远的值。 年龄:10000 4)要求唯一,可以输入两个或多个相同的数值来进行测试。,4.4单元测试分析(二),5) 如果要求按照一定的顺序来存储一些数据,那么可以输入一些顺序打乱的数据来做测试。 6)对于一些做了安全限制的部分,尽量通过各种途径尝试能否绕过安全限制的测试。 如:ATM取款未输入密码,能否显示余额和取款 7) 如果功能的启用有一定的顺序限制,就用和期望不一致的顺序来进行测试。,4.4单元

8、测试分析(三),3、分析能否使用反向关联检查? 如:检查插入功能是否正确,可以使用查询验证。 4、分析是否能使用其他手段来交叉检查一下结果? 一般而言,对某个值进行计算会有一种以上的算法,但我们会因考虑到运行效率或其他方面的原因而选择其中的一种。如:判断三角形全等。SSS、AAS、SAS 5、分析是否可以强制一些错误发生? 如:网络故障、内存不足、磁盘空间不足等。,4.4单元测试分析(四),6、分析模块接口 如:数据能正确流入、流出模块的前提下, 其他测试才有意义。 7、分析局部数据结构 8、分析独立路径 保证每条语句至少执行一次。 9、分析出错处理是否正确 预设各种出错处理通路。,4.5单元

9、测试用例设计,测试的完整性度量以白盒测试为主: 语句覆盖(100%) 判定覆盖(100%) 条件覆盖 判定-条件覆盖 路径覆盖(主要) 测试用例的4 个关键元素: 初始状态声明; 输入数据; 实际测试的代码; 期望输出结果。,4.5.1 测试用例设计步骤,步骤1:使被测单元运行;(尽量简单) 适合的技术有: 模块设计说明导出的测试 对等区间划分 步骤2:正面测试(Positive Testing) 适合的技术: 设计说明导出的测试 对等区间划分 状态转换测试 步骤3:负面测试(Negative Testing),错误猜测,边界值分析,内部边界值测试,状态转换测试,步骤4: 模块设计需求中其它测

10、试特性用例设计 如:性能、余量、安全等。 步骤5:覆盖率测试用例设计 分支测试 条件测试 数据定义使用测试 状态转换测试 步骤6:测试执行 步骤7:完善代码覆盖 适合的技术: 分支测试 条件测试 设计定义试验测试 状态转换测试,4.5.2面向对象应用程序的 单元测试用例设计,两种测试方式 1、 功能性测试 两个层次: 类的规格说明(概念和方法) 方法的规格说明(前置/后置条件) 2、 结构性测试 类作为一个单元来进行测试。 (1) 方法的单独测试: (2) 方法的综合测试:,黑盒测试,白盒测试,主要是对类和对象状态的测试! 继承和多态涉及少!,3、基于对象状态转移图的OO软件测试 结点:表示对

11、象的某个可能状态 有向边:“事件动作”,图4-3 对象-状态转换图,对象处于状态A 时,若接收到事件e 则执行相应的操作a且转移到状态B,1)状态的处理: 列出对象的逻辑状态,而非所有实际状态。 理论上,所有数据成员状态的笛卡尔积。 实际上,不可能全部列出,类似等价类划分。 如: public class Student string Sname; int Sage; int Avgrade; ,易知: a. 特殊值情况:name=NULL, Sage0, Avgrade0;,2)主要步骤: 依据设计文档,或者通过分析对象数据成员的取值情况空间,得到被测试类的状态转移图; 给被测试的类加入用于

12、设置和检查对象状态的新方法,导出对象的逻辑状态;如set()、get()等 对于状态转移图中的每个状态,确定该状态是哪些方法的合法起始状态,即在该状态时,对象允许执行哪些操作; 在每个状态,从类中方法的调用关系图最下层开始,逐一测试类中的方法; 测试每个方法时,根据对象当前状态确定出对方法的执行路径有特殊影响的参数值,将各种可能组合作为参数进行测试。,例:下面的程序代码是一个计算学生成绩的例子,包括方法:Student(), addCourse(int grade), deleteCourse(int courseNum), display()等。(P119-P120),public clas

13、s Student /Student类 int N=10; private String name; private int idNumber; private float average; private int aN; public Student(String name,int idNumber1) /构造方法 name=name; idNumber=idNumber1; Average=0; For(int i=0;iN;i+) ai=-1; ,/求平均分的方法 private float averageGrade() int i; int j=0; float sum=0; for(

14、i=0;i=0) sum+=ai; j+; float average1=sum/j; return average1; ,/添加新科目的成绩,并重求平均分 public boolean addCourse(int grade) int i; for(i=0;iN;i+) if(ai0) break; if (iN) ai=grade; average= averageGrade(); return ture; else return false; ,public boolean deleteCourse(int courseNum) /删除第courseNum门课 int i; if (co

15、urseNumN) return false; else for(i=0;iN;i+) if (i=courseNum-1) /可以删除,存在此门课的成绩 break; ai=-1; /以下是删除过程 average=averageGrade(); return true; ,public void display() System.out.println(name+“的平均成绩是”+average); ,Student,addCourse,deleteCourse,display,averageGrade,图4-4 Students的类调用图,方法内部测试:每一个(共5个) 方法间测试 类内部测试,如:Student,addCourse,display无穷多个,Student,display,等同方法内部测试,addCourse,deleteCourse,需与averageGrade集成,4.6单元测试过程,图4-5 单元测试工作过程,(1)准备阶段: 培训、环境、工具、测试用例等 (2)编制阶段: 编码、测试用例的修改等 (3)代码审查阶段: 各种语法检查和算法逻辑等 (4)单元测试阶段: 执行测试用例,并记录测试结果 (5)评审、提交阶段: 评审结论、提交相关文档,源程序文件 测试用例文件 单元测试报告 软件Bug清单,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号