430 likes | 687 Views
软件工程导论 之. 第 7 讲 软件测试. 毛新军 教授 xjmao@nudt.edu.cn 计算机科学与技术系 602 教研室 0731-(45)73649. 用工程化的方法来开发软件. 序言. 初步的软件系统存在错误,如何: 发现错误 ? 纠正错误? 软件测试是软件质量保证活动中关键步骤 对 SRS 、设计规格说明书以及编码的最后复审 其工作量往往占软件开发总工作量的 40% 以上 软件测试是确保软件质量的一种有效 ( 可操作 ) 手段 软件测试有其特殊性和规律 – 因为软件是逻辑产品. 本讲内容. 基本概念 软件测试技术 软件测试策略
E N D
软件工程导论 之 第7讲 软件测试 毛新军 教授 xjmao@nudt.edu.cn 计算机科学与技术系602教研室 0731-(45)73649 用工程化的方法来开发软件
软件测试 序言 • 初步的软件系统存在错误,如何: • 发现错误? • 纠正错误? • 软件测试是软件质量保证活动中关键步骤 • 对SRS、设计规格说明书以及编码的最后复审 • 其工作量往往占软件开发总工作量的40%以上 • 软件测试是确保软件质量的一种有效 (可操作)手段 • 软件测试有其特殊性和规律 –因为软件是逻辑产品
软件测试 本讲内容 • 基本概念 • 软件测试技术 • 软件测试策略 • 基于CASE的软件测试和排错
软件测试 软件测试的基本概念 • 软件错误 • 软件系统的功能和性能与预期的功能和性能不一致 • 软件测试是发现软件错误的过程
软件测试 软件测试的目标 • 目标 • 发现软件中的错误,提高软件质量 • 注意 软件测试中没有发现错误并不意味着软件就没有错误 => 测试不充分, 潜在错误不能发现
软件测试 软件测试的信息流程 • 软件测试思想 • 数据处理 设计测试用例 判断结果
软件测试 软件测试方法 • 二种测试方法 • 白盒测试 • 黑盒测试
软件测试 白盒测试 • 思想 • 已知程序内部工作流程,通过测试检验程序内部动作是否按规格说明书规定正常运作 • 依据 • 程序的内部逻辑结构,针对程序的逻辑路径设计测试用例 • 特点 • 必须了解程序的内部工作流程
思想 根据已知程序的功能和性能(而不是内部细节),通过测试检验每个功能和性能是否正常 依据 程序的功能和性能描述 特点 知道程序的功能和性能,不必了解程序的内部结构和处理细节 软件测试 黑盒测试
软件测试 软件测试步骤 • 软件开发 • 从高抽象层次向低层次抽象过渡 • 软件测试 • 从低层次抽象向高层次抽象过渡 • 软件测试的层次 • 单元测试:测试程序中每个模块是否有错误(白盒) • 集成测试:测试软件总体结构是否有错误(黑盒) • 确认测试:测试软件是否满足用户需求(黑盒)
软件测试 软件开发活动和软件测试活动间的关系 确认测试 需求分析 概要设计 集成测试 详细设计 单元测试 软件测试过程 编码 软件开发过程
软件测试 本讲内容 • 基本概念 • 软件测试技术 • 软件测试策略 • 基于CASE的软件测试和排错
软件测试 软件测试技术 • 白盒测试 • 白盒测试是根据程序的控制结构来设计测试用例
要设计多少测试用例? 覆盖准则 语句覆盖 分支覆盖 路径覆盖: 程序通道 基本路径覆盖 软件测试 白盒测试
软件测试 基本路径测试的思想 • 基本路径 • 至少引入一个新语句或者新判断的程序通道 • 思想 • 路径 ==> 基本路径 ==> 基本路径测试 • 前提 • 软件模块的逻辑结构(流程图) • 如何设计测试用例确保基本路径覆盖 • ==> 哪些基本路径 ==> 流图 ==> 流程图
软件测试 流程图和流图示意图
void Func(int nPosX, int nPosY) { while (nPosX > 0) { int nSum = nPosX + nPosY; if (nSum > 1) { nPosX--; nPosY--; } else { if (nSum < -1) nPosX -= 2; else nPosX -= 4; } } // end of while } 软件测试 步骤1:根据程序逻辑画出流程图
软件测试 步骤2:将流程图转换为流图(1/2) • 流图刻画了程序的控制结构但不涉及程序的过程性细节 • 节点(过程块,结合点,判定点) • 有向边 • 判定点不含复合条件,否则应按照下列方式增加判定点
软件测试 步骤2:将流程图转换为流图(2/2)
基本路径 流图Cyclomatic复杂度正好是基本路径的数目 V(G) = E – N + 2 V(G) = 11 - 9 + 2 = 4 软件测试 步骤3:确定基本路径的集合(1/2)
1 - 11 1 - 2, 3 - 6 - 7 - 9 - 10 - 1 - 11 1 - 2, 3 - 4, 5 - 10 - 1 - 11 1 - 2, 3 - 6 - 8 - 9 - 10 - 1 - 11 软件测试 步骤3:确定测试路径的集合(2/2)
软件测试 void Func(int nPosX, int nPosY) { while (nPosX > 0) { int nSum = nPosX + nPosY; if (nSum > 1) { nPosX--; nPosY--; } else { if (nSum < -1) nPosX -= 2; else nPosX -= 4; } } // end of while }
软件测试 步骤4:针对测试路径设计测试用例 • 1-11 • nPosX 取-1, nPosY取任意值 • 1 - 2, 3 - 4, 5 - 10 - 1 - 11 • nPosX 取1, nPosY取1 • 1- 2, 3 - 6 - 7 - 9 - 10 - 1 – 11 • nPosX 取1, nPosY取-1 • 1- 2, 3 - 6 - 8 - 9 - 10 - 1 - 11 • nPosX 取1, nPosY取-3
软件测试 void Func(int nPosX, int nPosY) { while (nPosX > 0) { int nSum = nPosX + nPosY; if (nSum > 1) { nPosX--; nPosY--; } else { if (nSum < -1) nPosX -= 2; else nPosX -= 4; } } // end of while }
软件测试 黑盒测试 • 黑盒测试技术 • 测试软件是否满足功能和性能要求,它不涉及模块的内部过程性细节 • 主要的黑盒测试技术 • 等价分类法 • 边界分类法
软件测试 等价分类法(1/2) • 思想 • 把程序的输入数据集合按输入条件划分为若干个等价类,每一个等价类对于输入条件而言为一组有效或者无效的输入,然后为每一个等价类设计一个测试用例 • 优点 • 减少测试次数,不丢失发现错误的机会
软件测试 等价分类法(2/2) • 输入条件为一范围 • 划分出三个等价类:(1) 有效等价类(在范围内),(2) 大于输入最大值,(3)小于输入最少值 • 输入条件为一值 • 划分为三个等价类: (1) 有效,(2) 大于,(3) 小于 • 输入条件为集合 • 划分二个等价类: (1) 有效(在集合内),(2) 无效(在集合外) • 输入条件为一个布尔量 • 划分二个等价类,(1) 有效(此布尔量),(2)无效(布尔量的非)
z = func(x, y): 当 0 < x < 1024 并且 y = 0, z = -1 否则,z = x * lg(y) 关于x的等价类: (0, 1024), (-#, 0], [1024, +#) 关于y的等价类: 0, (-#, 0), (0, +#) 测试用例: 9个 <1, 0>, <1, -2>, <1, 2>; <-1, 0>, <-1, -2>, <-1, 2>; <1024, 0>, <1024, -2>, <1024, 2> 软件测试 等价分类法例子
软件测试 边界值分析法 • 输入条件是一范围(a,b) • a,b以及紧挨a,b左右的值应作为测试用例 • 输入条件为一组数 • 选择这组数的最大者和最小者,次大和次小者作为测试用例 • 如果程序的内部数据结构是有界的 • 应设计测试用例使它能够检查该数据结构的边界
软件测试 本讲内容 • 基本概念 • 软件测试技术 • 软件测试策略 • 基于CASE的软件测试和排错
软件测试 单元测试 • 对软件的最小单元-模块进行测试.多采用白盒测试 (1) 模块接口测试 (2) 模块局部数据结构测试 (3) 模块独立执行路径测试 (4) 模块中各条错误处理通道测试 (5) 模块边界条件测试
软件测试 单元测试(续)
软件测试 集成测试 • 模块相互调用时引入接口问题 => 集成测试 • 集成测试方法 • (1) 自顶向下集成 从目标软件系统的主控模块开始,按照软件的控制层次结构,以深度优先或者广度优先的策略把各个模块集成在一起进行测试 • (2) 自底向上集成 从软件结构最底层模块开始自底向上进行组装和测试
软件测试 集成测试例子
软件测试 确认测试 • 任务 • 判断目标软件系统是否满足用户的功能和性能需求; • 文档资料是否完整、准确 • 依据和标准 • 软件需求规格说明书 • 确认测试的类型 • α测试 • β测试
软件测试 排错(1/2) • 测试是为了发现错误,当发现错误后就要将它改正,改正错误主要依靠排错技术 • 排错过程
软件测试 排错(2/2) • 排错方法 • 原始法 • 回溯法 • 排除法 • 基于归纳和演绎的方法:收集与出错有关的所有数据,假想一组出错的原因,用这组数据证明或者反驳之
软件测试 本讲内容 • 基本概念 • 软件测试技术 • 软件测试策略 • 基于CASE的软件测试和排错
软件测试 基于CASE的软件测试和排错 • 静态分析器 • 通过静态的扫描源程序,找出可能导致程序出错的异常情况 • 代码审查器 • 检查源程序代码是否满足最基本的代码标准 • 断言处理器 • 检查程序员关于程序行为的断言在程序执行过程中是否成立 • 测试数据产生器
软件测试 软件测试和软件调试 • 目的 • 发现错误;定位和纠正错误 • 独立性 • 可有独立的测试小组进行;必须由开发人员完成
软件测试 本讲小结 • 基本概念(软件测试的概念、目标, 方法和过程等) • 软件测试技术(白盒和黑盒软件测试方法) • 软件测试策略(步骤,方法等) • 基于CASE的软件测试和排错
软件测试 思考题 • 思考题 • 只要设计足够多的测试用例,软件测试是否完全可以发现软件中的所有错误?
软件测试 An Introduction to Software Engineering Q & A Practice, Practice, and Practice