第6章 软件测试.

Slides:



Advertisements
Similar presentations
3 的倍数的特征 的倍数有 : 。 5 的倍数有 : 。 既是 2 的倍数又是 5 的倍数有 : 。 12 , 18 , 20 , 48 , 60 , 72 , , 25 , 60 ,
Advertisements

练一练: 在数轴上画出表示下列各数的点, 并指出这些点相互间的关系: -6 , 6 , -3 , 3 , -1.5, 1.5.
LSF系统介绍 张焕杰 中国科学技术大学网络信息中心
第三章 数据类型和数据操作 对海量数据进行有效的处理、存储和管理 3.1 数据类型 数据源 数据量 数据结构
常用逻辑用语复习课 李娟.
第6章 传统软件测试策略.
基于解释性语言的手机跨平台架构 Sloan Yi. Qt MTK.
Oracle数据库 Oracle 子程序.
第三节 格林公式及其应用(2) 一、曲线积分与路径无关的定义 二、曲线积分与路径无关的条件 三、二元函数的全微分的求积 四、小结.
全国计算机等级考试 二级基础知识 第二章 程序设计基础.
在PHP和MYSQL中实现完美的中文显示
程序的形式验证 - 简介 中国科学院软件研究所 张文辉 1.
软 件 工 程.
LSF系统介绍 张焕杰 中国科学技术大学网络信息中心
第二讲 搭建Java Web开发环境 主讲人:孙娜
面向对象建模技术 软件工程系 林 琳.
学习前的准备工作 讲师:burning.
SOA – Experiment 3: Web Services Composition Challenge
走进编程 程序的顺序结构(二).
辅导课程六.
元素替换法 ——行列式按行(列)展开(推论)
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
数 控 技 术 华中科技大学机械科学与工程学院.
Windows网络操作系统管理 ——Windows Server 2008 R2.
第十章 IDL访问数据库 10.1 数据库与数据库访问 1、数据库 数据库中数据的组织由低到高分为四级:字段、记录、表、数据库四种。
S 数控机床故障诊断与维修.
课程设计.
第二章 Java语言基础.
单元测试工具XUnit 任课老师:黄武 下午2时20分 25.
CPU结构和功能.
中国科学技术大学计算机系 陈香兰(0551- ) Spring 2009
用event class 从input的root文件中,由DmpDataBuffer::ReadObject读取数据的问题
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
SOA – Experiment 2: Query Classification Web Service
C语言程序设计 主讲教师:陆幼利.
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
微机系统的组成.
VisComposer 2019/4/17.
WPT MRC. WPT MRC 由题目引出的几个问题 1.做MRC-WPT的多了,与其他文章的区别是什么? 2.Charging Control的手段是什么? 3.Power Reigon是什么东西?
实验七 安全FTP服务器实验 2019/4/28.
用计算器开方.
<编程达人入门课程> 本节内容 内存的使用 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群: ,
Lightweight Data-flow Analysis for Execution-driven Constraint Solving
Web安全基础教程
成绩是怎么算出来的? 16级第一学期半期考试成绩 班级 姓名 语文 数学 英语 政治 历史 地理 物理 化学 生物 总分 1 张三1 115
第4章 Excel电子表格制作软件 4.4 函数(一).
8 [学习目标] 了解管理信息系统的物理实施过程;掌握程序设计的任务和方法,能根据实际需要选择恰当的程序语言进行程序设计;掌握 MIS 的系统测试、切换、运行及维护等的方法与内涵;掌握项目管理与系统评价的方法与内涵。 [学习重点] 系统测试方法、系统切换方式.
iSIGHT 基本培训 使用 Excel的栅栏问题
§6.7 子空间的直和 一、直和的定义 二、直和的判定 三、多个子空间的直和.
3.16 枚举算法及其程序实现 ——数组的作用.
第4课时 绝对值.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
魏新宇 MATLAB/Simulink 与控制系统仿真 魏新宇
GIS基本功能 数据存储 与管理 数据采集 数据处理 与编辑 空间查询 空间查询 GIS能做什么? 与分析 叠加分析 缓冲区分析 网络分析
第二节 C语言的特点.
第六章 Excel的应用 五、EXCEL的数据库功能 1、Excel的数据库及其结构 2、Excel下的数据排序 (1)Excel的字段名行
滤波减速器的体积优化 仵凡 Advanced Design Group.
基于列存储的RDF数据管理 朱敏
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
第8章 创建与使用图块 将一个或多个单一的实体对象整合为一个对象,这个对象就是图块。图块中的各实体可以具有各自的图层、线性、颜色等特征。在应用时,图块作为一个独立的、完整的对象进行操作,可以根据需要按一定比例和角度将图块插入到需要的位置。 2019/6/30.
第四章 UNIX文件系统.
第十七讲 密码执行(1).
FVX1100介绍 法视特(上海)图像科技有限公司 施 俊.
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
RefWorks使用指南 归档、管理个人参考文献.
入侵检测技术 大连理工大学软件学院 毕玲.
实验六、COM类型病毒分析实验 实验开发教师: 刘乃琦 谌黔燕.
质量控制(QC)模式 BrookFIELD.
§2 自由代数 定义19.7:设X是集合,G是一个T-代数,为X到G的函数,若对每个T-代数A和X到A的函数,都存在唯一的G到A的同态映射,使得=,则称G(更严格的说是(G,))是生成集X上的自由T-代数。X中的元素称为生成元。 A变, 变 变, 也变 对给定的 和A,是唯一的.
Presentation transcript:

第6章 软件测试

软件测试的目的: 软件测试工作量: 软件投入生产运行之前,尽可能多的发现错误,及时纠正,避免软件提交运行后造成损失。 开发总量40% 适当的开发工具减少工作量

6.1 软件测试基础 软件测试:软件投入运行前对 进行的差错和纠错。 测试用例 只能证明程序有错误,不能证明程序的正确性 软件需求分析 软件设计规格说明 软件编码 进行的差错和纠错。 测试用例 只能证明程序有错误,不能证明程序的正确性

软件测试原则 各阶段都应该测试,包括前期 由与程序无关的程序员来测试 预设预期结果 测试用例=合法输入+非法输入 修改后进行回归测试 已发现错误不代表所有的错误 妥善保管测试计划、方案、用例、结果 对测试结果全面检查(warning与error) 按严格的计划执行,排除随意性

软件测试对象 相符吗? 用户要求 用户: 我要什么 运行结果 计算机: 程序运行得 到的结果 运行正确性 输入正确性 理解正确性 表达正确性 5 1 4 需求说明书 分析员: 我可以提供 什么 源程序 程序员: 我要让计算 机怎么作 3 2 理解正确性 设计正确性 表达正确性 理解正确性 编码正确性 设计说明书 设计员: 我要让软件 做什么

软件测试过程 1 2 3 测试 评价 调试 结果预测 4 构造可靠性模型 错误 修正文件 测试 结果 软件配置 (分析错误 原因和位置) 测试配置 正确 出错率分析 测试工具 结果预测 4 构造可靠性模型 (对测试结果的出错 率进行分析,建立 模型,指导软件的设 计与维护) 预测可靠性

软件测试方法 静态分析技术 动态测试技术 白盒法 黑盒法 不执行被测试软件 执行被测试软件 已知程序逻辑关系和数据结构 已知产品功能,但不考虑程序内部结构和处理过程

静态分析技术 不执行被测试程序 测试对象: 测试方式 需求分析说明书 软件设计说明书 源程序 结构检查:手工分析,虚拟执行程序 流图分析:程序流程图的代码结构

动态测试技术 执行被测试程序 测试方式 采用白盒法测试逻辑结果,采用黑盒法测试功能结果 选取测试值 预设预期结果 执行测试值 记录结果 对比测试结果和预期结果 采用白盒法测试逻辑结果,采用黑盒法测试功能结果

6.2 白盒测试技术 将被测试软件看作一个透明的盒子,测试人员非常了解内部的 利用内部结构设计测试用例 测试检查点: 逻辑结构 数据结构 结构测试 逻辑驱动测试 测试检查点: 所有执行路径 所有逻辑判定:true false 循环边界和运行界限内执行循环体 内部数据结构

A B 循环执行小于等于20次 C D F G E H I J 一个环代表一个语句块: BCDIB BCDFIB BHIB BCEIB BCEGIB 每次都执行IB,用穷举法,则需要执行520次,需要测试的次数太多。 精选少量测试数据

白盒测试的测试用例设计 入口 A>1 and B=0 A=2 or X>1 返回 X=X/A X=X+1 T F 1 s a b d 2 3 4 5 6 7 float A,B,X; … if (A>1&&B==0) X=X/A; if (A==2||X>1) X=X+1; c e

输入条件为假时如果程序有错误则测试不出来 入口 A>1 and B=0 A=2 or X>1 返回 X=X/A X=X+1 T F 1 s a b d 2 3 4 5 6 7 1.语句覆盖 1)用例设计 被测试程序中的每条语句至少执行一次 路径:sacbed 设计用例:A=2 B=0 X=2 2)测试效果 只测试到了为真的条件 输入条件为假时如果程序有错误则测试不出来

真、假分支至少各一次 即:每个结点都经过一次 覆盖不全,只覆盖了路径的一半 2.判定覆盖 1)用例设计 2)测试效果 入口 A>1 and B=0 A=2 or X>1 返回 X=X/A X=X+1 T F 1 s a b d 2 3 4 5 6 7 2.判定覆盖 1)用例设计 真、假分支至少各一次 即:每个结点都经过一次 2)测试效果 覆盖不全,只覆盖了路径的一半 路径 用例 sacbd a真b假 A=4,B=0,X=1(判定条件A>1 AND B=0为真,判定条件A=2 OR X>1为假) sabed a假b真 A=2,B=1,X=3(判定条件A>1 AND B=0为假,判定条件A=2 OR X>1为真)

每个判定的每个条件(表达式)的可能取值至少执行一次 入口 A>1 and B=0 A=2 or X>1 返回 X=X/A X=X+1 T F 1 s a b d 2 3 4 5 6 7 3.条件覆盖 1)用例设计 每个判定的每个条件(表达式)的可能取值至少执行一次 2)测试效果 覆盖不全,只覆盖了路径的一半 路径 用例 sacbed a真b真 A=2(A>1为真,A=2为真) B=0(B=0为真) X=3(X>1为真) sabd a假b假 A=0(A>1为假,A=2为假) B=1(B=0为假) X=0(X>1为假)

每个判断(表达式)的所有可能判断结果至少执行一次 入口 A>1 and B=0 A=2 or X>1 返回 X=X/A X=X+1 T F 1 s a b d 2 3 4 5 6 7 4.判定/条件覆盖 1)用例设计 每个条件的所有可能取值至少执行一次 每个判断(表达式)的所有可能判断结果至少执行一次 2)测试效果 覆盖不全 路径 用例 sacbed a真b真 A=2,B=0,X=4 (判定条件A>1 AND B=0为真,判定条件A=2 OR X>1为真) (A>1为真,A=2为真) (B=0为真) (X>1为真) sabd a假b假 A=1,B=1,X=1 (判定条件A>1 AND B=0为假,判定条件A=2 OR X>1为假) (A>1为假,A=2为假) (B=0为假) (X>1为假)

每个判断所有可能的条件取值组合至少执行一次 入口 A>1 and B=0 A=2 or X>1 返回 X=X/A X=X+1 T F 1 s a b d 2 3 4 5 6 7 5.条件组合覆盖 1)用例设计 每个判断所有可能的条件取值组合至少执行一次 2)测试效果 覆盖全面 条件组合 分支选择 1 A>1,B=0 a真 2 A>1,B<>0 a假 3 A<=1,B=0 4 A<=1,B<>0 5 A=2,X>1 b真 6 A=2,X<=1 7 A<>2,X>1 8 A<>2,X<=1 b假 分支选择 路径 用例 a真b真 sacbed A=2,B=0,X=4 a假b真 sabed A=2,B=1,X=1 A=1,B=0,X=2 a假b假 sabd A=1,B=1,X=1

7.边覆盖 8.路径覆盖 每个结点都经过一次 相当于语句覆盖 经过每个边各一次 通常与判定覆盖一致 经过每个环至少一次 p108 6.点覆盖 s 入口 A>1 and B=0 A=2 or X>1 返回 X=X/A X=X+1 T F 1 s a b d 2 3 4 5 6 7 a 6.点覆盖 每个结点都经过一次 相当于语句覆盖 7.边覆盖 经过每个边各一次 通常与判定覆盖一致 8.路径覆盖 经过每个环至少一次 p108 c b e d 路径 用例 sacbed a真b真 A=2,B=0,X=4 sabd a假b假 A=1,B=1,X=1 sacbd a真b假 A=3,B=0,X=1 sabed a假b真

6.3 黑盒测试技术 定义:在已知产品应该具有的功能的情况下,通过测试来检验是否每个功能都能正常使用的测试方法。 输出 输入

测试目标: 接口测试 功能的完善 正确的输入是否能够得到正确的输出 是否能保持外部信息的完整性

一、等价类划分 等价类划分 设计测试用例步骤 把程序的输入数据集合按输入条件(1)划分为若干等价类,每一个等价类相对于条件表示为一组有效或无效的输入(2) ,然后为每一等价类设计一个测试用例。 设计测试用例步骤 划分等价类 选取用例 不能用所有的输入数据来测试程序,只能从全部可供输入的数据中选择一个子集进行测试

划分等价类 输入域的子集合 每个子集合中的每个元素对于揭露程序中的错误都是等效的。 即: 例:if(x>4){……..} 划分两个等价类x>4的所有值和x<=4的所有值 在x>4的这个等价类中,5、6测试效果一样 即:

测试用例 一个错,全错 一个对,全对

等价类划分 有效等价类 无效等价类 任何一个系统都会接收到用户合法和非法的程序,测试时必须考虑到对有效数据和无效数据的测试。 对系统合理、有意义的输入数据 无效等价类 对系统不合理、无意义的输入数据 任何一个系统都会接收到用户合法和非法的程序,测试时必须考虑到对有效数据和无效数据的测试。

划分等价类原则 1.输入条件规定了取值范围或个数 确立一个有效等价类,两个无效等价类 例:人的年龄,通常在0~150之内 有效等价类:[0,150] 无效等价类:年龄<0 年龄>150

划分等价类原则 2.输入条件规定了输入值的集合 该值的集合作为有效等价类,其他值作为无效等价类 例:人的性别只能是男、女 有效等价类:男、女 无效等价类:其他任何输入值

划分等价类原则 3.输入条件是一个布尔量 一个有效一个无效等价类 等价类划分: 有效等价类:ture 或者 false 无效等价类:非布尔值

划分等价类原则 4.不同输入条件不同处理 输入值不同程序处理措施不同 例:对教授、副教授、讲师、助教的津贴计算,每种职称都有不同的处理方式 为每种措施设立一个有效等价类 针对这些输入设立一个无效等价类 例:对教授、副教授、讲师、助教的津贴计算,每种职称都有不同的处理方式 四个有效等价类:教授、副教授、讲师、助教 一个无效等价类:工程师

划分等价类原则 5.输入数据有必须遵循的规测 确立一个有效等价类——符合规则,多个无效等价类(各种错误的不符合规则的情况) 例:电话的输入 有效等价类,符合:国内区号-电话号码 无效等价类, 区号出错 电话号码出错

选取测试用例 步骤: 为每个等价类规定一个唯一的编号 设计测试用例 尽可能多的覆盖有效等价类 只覆盖一个无效等价类 x>4 && y<5 需要两个测试用例,分别测试x>4、y<5

示例:pascal语言中规定: 标识符是由字母开头,后面跟字母、数字的任意组合; 有效字符数为8个,超过8个也可以使用,但是最大字符数不超过80 标识符必须先声明 同一说明语句中,标识符至少必须有一个。 输入条件 有效等价类 无效等价类 说明语句中标识符个数 1个(1) 多个(2) 0个(3) 标识符字符数 1~8个(4) 0个(5) >8个(6) >80个(7) 标识符组成 字母(8) 数字(9) 非字母数字字符(10) 保留字(11) 第一个字符 字母(12) 非字母(13) 标识符使用 先说明后使用(14) 未说明已使用(15)

测试用例 3 5 6 7 10 11 13 15 1、2、4、8、9、12、14 VAR:REAL; VAR X,:REAL; VAR T123456789:REAL; 7 VAR T1111……:REAL; T1111……多于80个字符 10 VAR T$:CHAR; 11 VAR CHAR:REAL; 13 VAR 5T:REAL; 15 VAR X:REAL; Y:=2; 1、2、4、8、9、12、14 VAR X, T1234567:REAL; BEGIN X:=3.1414;T1234567:=2.333;…… 输入条件 有效等价类 无效等价类 标识符个数 1个(1) 多个(2) 0个(3) 标识符字符数 1~8个(4) 0个(5) >8个(6) >80个(7) 标识符组成 字母(8) 数字(9) 非字母数字字符(10) 保留字(11) 第一个字符 字母(12) 非字母(13) 标识符使用 先说明后使用(14) 未说明已使用(15)

二、边界值分析 对等价类划分的一种补充 错误——常出现在输入输出范围的边界,而不是范围内部。 针对边界设置测试用例

选择测试用例原则 1如果输入/输出条件规定了值的范围 应取 输入例:0<=x<=5 刚达到该范围边界的值 刚刚超过该范围的值 输入例:0<=x<=5 应取x=0,x=5 刚达到边界 x=-1,x=6 刚超出边界 输出例:教师课时费应该是在完成一定工作量300课时后超工作量的所得,刚好完成300课时,课时费为0 300 299 301

2 如果输入/输出条件规定了值的个数 应取 输入例:pascal的有效标识符在1~8个之间 最大个数,最小个数 最大个数+1,最小个数-1 输入例:pascal的有效标识符在1~8个之间 应取1个,8个 0个,9个 输出例:某新闻发布系统首页显示的最新新闻不能超过10条 超过10条:11 不超过10条:9

3 如果输入输出是有序集合 应取 则选择序列的第一个和最后一个

4 如果输入输出是数据结构 应取 该数据结构边界上的值 例:数组student[100] 应取student[0]、student[99]

三、因果图 检查各种输入条件的组合 设计步骤 因果图p113 输入为因,输出为果 根据因果处理语义画出因果图 标出约束条件 因果图->判定表 设计测试用例 因果图p113

恒等;(b) 非;(c) 或;(d) 与;(e) 异约束; (f) 或约束;(g) 惟一约束;(h) 要求约束;(i) 强制约束 图7.5 因果图定义符号 恒等;(b) 非;(c) 或;(d) 与;(e) 异约束; (f) 或约束;(g) 惟一约束;(h) 要求约束;(i) 强制约束

原因 1.售货机有零钱找 2.投入10元纸币 3.投入5元纸币 4.按下芬达按钮 5.按下可乐按钮 例:有一个单价为5元钱的饮料自动售货机,说明:若投入5元钱或10元纸币,按下芬达或可乐,则送出相应饮料。若没有零钱,则显示“没有零钱”的红灯,这时饮料不送出而且将纸币退回;如果有零钱则找回零钱的同时送出饮料。(假设芬达、可乐5元一瓶) 1)分析说明,列出因果 结果 21.售货机没有零钱红灯亮 22.退还10元纸币 23.退还5元纸币 24.送出芬达 25.送出可乐

2)画出因果图 3)因果图转换成判定表 21 1 2 a ∧ 22 E c ∧ 3 11 23 b ∧ 13 e ∨ 12 14 ∨ d 4 售货机“没有零钱”红灯亮 售货机有零钱找 21 1 投入10元纸币 退还10元纸币 2 a ∧ 22 E c ∧ 退还5元纸币 3 11 23 投入5元纸币 b ∧ 13 该找回5元 找回了5元 e ∨ 12 按下芬达按钮 钱付清 14 ∨ d 按下按钮 4 f ∧ E 24 送出芬达 5 按下可乐按钮 g ∧ 送出可乐 25 3)因果图转换成判定表

人们也可以靠经验和直觉推测程序中可能存在的各种错误,从而有针对性地编写检查这些错误的例子。这就是错误推测法。 错误推测法的基本想法是:列举出程序中所有可能有的错误和容易发生错误的特殊情况,根据它们选择测试用例。

软件测试策略 任何情况下均采用边界值分析方法 必要时用等价类补充 必要时用错误推测法补充 如果有输入条件组合,采用因果分析法 按程序逻辑检查已设计方法 根据对程序可靠性的要求采用不同的逻辑覆盖标准

测试过程的四个步骤 单元 测试 单元 测试 集成 测试 确认 测试 系统 测试 单元 测试 系统其他元素 被测模块 设计信息 软件需求 已集成的软件 已确认的软件 可交付的软件 已经过测试的模块 单元 测试 被测模块

组装测试把已测试过的模块组装起来,主要对与设计相关的软件体系结构的构造进行测试。 确认测试则是要检查已实现的软件是否满足了需求规格说明中确定了的各种需求,以及软件配置是否完全、正确。 系统测试把已经经过确认的软件纳入实际运行环境中,与其它系统成份组合在一起进行测试。

单元测试 (Unit Testing) 单元测试又称模块测试,是针对软件设计的最小单位 ─ 程序模块,进行正确性检验的测试工作。其目的在于发现各模块内部可能存在的各种差错。 单元测试需要从程序的内部结构出发设计测试用例。多个模块可以平行地独立进行单元测试。

1. 单元测试的内容 在单元测试时,测试者需要依据详细设计说明书和源程序清单,了解该模块的I/O条件和模块的逻辑结构,主要采用白盒测试的测试用例,辅之以黑盒测试的测试用例,使之对任何合理的输入和不合理的输入,都能鉴别和响应。

在单元测试的开始,应对通过被测模块的数据流进行测试。测试项目包括: (1) 模块接口测试 在单元测试的开始,应对通过被测模块的数据流进行测试。测试项目包括: 调用本模块的输入参数是否正确; 本模块调用子模块时输入给子模块的参数是否正确; 全局量的定义在各模块中是否一致;

在做内外存交换时要考虑: 文件属性是否正确; OPEN与CLOSE语句是否正确; 缓冲区容量与记录长度是否匹配; 在进行读写操作之前是否打开了文件; 在结束文件处理时是否关闭了文件; 正文书写/输入错误, I/O错误是否检查并做了处理。

不正确或不一致的数据类型说明 使用尚未赋值或尚未初始化的变量 错误的初始值或错误的缺省值 变量名拼写错或书写错 不一致的数据类型 (2) 局部数据结构测试 不正确或不一致的数据类型说明 使用尚未赋值或尚未初始化的变量 错误的初始值或错误的缺省值 变量名拼写错或书写错 不一致的数据类型 全局数据对模块的影响

选择适当的测试用例,对模块中重要的执行路径进行测试。 应当设计测试用例查找由于错误的计算、不正确的比较或不正常的控制流而导致的错误。 (3) 路径测试 选择适当的测试用例,对模块中重要的执行路径进行测试。 应当设计测试用例查找由于错误的计算、不正确的比较或不正常的控制流而导致的错误。 对基本执行路径和循环进行测试可以发现大量的路径错误。

在对错误进行处理之前,错误条件是否已经引起系统的干预等 (4) 错误处理测试 出错的描述是否难以理解 出错的描述是否能够对错误定位 显示的错误与实际的错误是否相符 对错误条件的处理正确与否 在对错误进行处理之前,错误条件是否已经引起系统的干预等

注意数据流、控制流中刚好等于、大于或小于确定的比较值时出错的可能性。对这些地方要仔细地选择测试用例,认真加以测试。 (5) 边界测试 注意数据流、控制流中刚好等于、大于或小于确定的比较值时出错的可能性。对这些地方要仔细地选择测试用例,认真加以测试。 如果对模块运行时间有要求的话,还要专门进行关键路径测试,以确定最坏情况下和平均意义下影响模块运行时间的因素。

模块并不是一个独立的程序,在考虑测试模块时,同时要考虑它和外界的联系,用一些辅助模块去模拟与被测模块相联系的其它模块。 2. 单元测试的步骤 模块并不是一个独立的程序,在考虑测试模块时,同时要考虑它和外界的联系,用一些辅助模块去模拟与被测模块相联系的其它模块。 驱动模块 (driver) 桩模块 (stub) ── 存根模块

驱动模块 (driver) ── 相当于所测模块的主程序。它接收测试数据,把这些数据传送给所测模块,最后再输出实测结果。 桩模块 (stub) ── 存根模块。用以代替所测模块调用的子模块。

单元测试的测试环境

组装测试(Integrated Testing) 组装测试 (集成测试、联合测试) 通常,在单元测试的基础上,需要将所有模块按照设计要求组装成为系统。这时需要考虑的问题是: 在把各个模块连接起来的时侯,穿越模块接口的数据是否会丢失; 一个模块的功能是否会对另一个模块的功能产生不利的影响;

在单元测试的同时可进行组装测试, 发现并排除在模块连接中可能出现 的问题,最终构成要求的软件系统。 各个子功能组合起来,能否达到预期要求的父功能; 全局数据结构是否有问题; 单个模块的误差累积起来,是否会放大,从而达到不能接受的程度。 在单元测试的同时可进行组装测试, 发现并排除在模块连接中可能出现 的问题,最终构成要求的软件系统。

子系统的组装测试特别称为部件测试,它所做的工作是要找出组装后的子系统与系统需求规格说明之间的不一致。 通常,把模块组装成为系统的方式有两种 一次性组装方式 增殖式组装方式

它是一种非增殖式组装方式。也叫做整体拼装。 1. 一次性组装方式 (big bang) 它是一种非增殖式组装方式。也叫做整体拼装。 使用这种方式,首先对每个模块分别进行模块测试,然后再把所有模块组装在一起进行测试,最终得到要求的软件系统。

首先对一个个模块进行模块测试,然后将这些模块逐步组装成较大的系统 2. 增殖式组装方式 这种组装方式又称渐增式组装 首先对一个个模块进行模块测试,然后将这些模块逐步组装成较大的系统 在组装的过程中边连接边测试,以发现连接过程中产生的问题 通过增殖逐步组装成为要求的软件系统。

这种组装方式将模块按系统程序结构,沿控制层次自顶向下进行组装。 自顶向下的增殖方式在测试过程中较早地验证了主要的控制和判断点。 (1) 自顶向下的增殖方式 这种组装方式将模块按系统程序结构,沿控制层次自顶向下进行组装。 自顶向下的增殖方式在测试过程中较早地验证了主要的控制和判断点。 选用按深度方向组装的方式,可以首先实现和验证一个完整的软件功能。

这种组装的方式是从程序模块结构的最底层的模块开始组装和测试。 (2) 自底向上的增殖方式 这种组装的方式是从程序模块结构的最底层的模块开始组装和测试。 因为模块是自底向上进行组装,对于一个给定层次的模块,它的子模块(包括子模块的所有下属模块)已经组装并测试完成,所以不再需要桩模块。在模块的测试过程中需要从子模块得到的信息可以直接运行子模块得到。

自顶向下增殖的方式和自底向上增殖的方式各有优缺点。 一般来讲,一种方式的优点是另一种方式的缺点。

衍变的自顶向下的增殖测试 首先对输入/输出模块和引入新算法模块进行测试; 再自底向上组装成为功能相当完整且相对独立的子系统; (3) 混合增殖式测试 衍变的自顶向下的增殖测试 首先对输入/输出模块和引入新算法模块进行测试; 再自底向上组装成为功能相当完整且相对独立的子系统; 然后由主模块开始自顶向下进行增殖测试。

自底向上自顶向下的增殖测试 回归测试 首先对含读操作的子系统自底向上直至根结点模块进行组装和测试; 然后对含写操作的子系统做自顶向下的组装与测试。 回归测试 这种方式采取自顶向下的方式测试被修改的模块及其子模块; 然后将这一部分视为子系统,再自底向上测试。

确认测试(Validation Testing) 确认测试又称有效性测试。任务是验证软件的功能和性能及其它特性是否与用户的要求一致。 对软件的功能和性能要求在软件需求规格说明书中已经明确规定。它包含的信息就是软件确认测试的基础。

有效性测试是在模拟的环境 (可能就是开发的环境) 下,运用黑盒测试的方法,验证被测软件是否满足需求规格说明书列出的需求。 1. 进行有效性测试(黑盒测试) 有效性测试是在模拟的环境 (可能就是开发的环境) 下,运用黑盒测试的方法,验证被测软件是否满足需求规格说明书列出的需求。 首先制定测试计划,规定要做测试的种类。还需要制定一组测试步骤,描述具体的测试用例。

通过实施预定的测试计划和测试步骤,确定 软件的特性是否与需求相符; 所有的文档都是正确且便于使用; 同时,对其它软件需求,例如可移植性、兼容性、出错自动恢复、可维护性等,也都要进行测试

在全部软件测试的测试用例运行完后,所有的测试结果可以分为两类: 测试结果与预期的结果相符。这说明软件的这部分功能或性能特征与需求规格说明书相符合,从而这部分程序被接受。 测试结果与预期的结果不符。这说明软件的这部分功能或性能特征与需求规格说明不一致,因此要为它提交一份问题报告。

软件配置的所有成分都齐全; 各方面的质量都符合要求; 具有维护阶段所必需的细节; 而且已经编排好分类的目录。 软件配置复查的目的是保证 2. 软件配置复查 软件配置复查的目的是保证 软件配置的所有成分都齐全; 各方面的质量都符合要求; 具有维护阶段所必需的细节; 而且已经编排好分类的目录。 应当严格遵守用户手册和操作手册中规定的使用步骤,以便检查这些文档资料的完整性和正确性。

在软件交付使用之后,用户将如何实际使用程序,对于开发者来说是无法预测的。 3.α测试和β测试 在软件交付使用之后,用户将如何实际使用程序,对于开发者来说是无法预测的。 α测试是由一个用户在开发环境下进行的测试,也可以是公司内部的用户在模拟实际操作环境下进行的测试。

α测试的目的是评价软件产品的FLURPS(即功能、局域化、可使用性、可靠性、性能和支持)。尤其注重产品的界面和特色。 α测试可以从软件产品编码结束之时开始,或在模块(子系统)测试完成之后开始,也可以在确认测试过程中产品达到一定的稳定和可靠程度之后再开始。

β测试是由软件的多个用户在实际使用环境下进行的测试。这些用户返回有关错误信息给开发者。 测试时,开发者通常不在测试现场。因而,β测试是在开发者无法控制的环境下进行的软件现场应用。 在β测试中,由用户记下遇到的所有问题,包括真实的以及主观认定的,定期向开发者报告。

β测试主要衡量产品的FLURPS。着重于产品的支持性,包括文档、客户培训和支持产品生产能力。 只有当α测试达到一定的可靠程度时,才能开始β测试。它处在整个测试的最后阶段。同时,产品的所有手册文本也应该在此阶段完全定稿。

4.验收测试(Acceptance Testing) 在通过了系统的有效性测试及软件配置审查之后,就应开始系统的验收测试。 验收测试是以用户为主的测试。软件开发人员和QA(质量保证)人员也应参加。 由用户参加设计测试用例,使用生产中的实际数据进行测试。

在测试过程中,除了考虑软件的功能和性能外,还应对软件的可移植性、兼容性、可维护性、错误的恢复功能等进行确认。 确认测试应交付的文档有: 确认测试分析报告 最终的用户手册和操作手册 项目开发总结报告。

系统测试(System Testing) 系统测试,是将通过确认测试的软件,作为整个基于计算机系统的一个元素,与计算机硬件、外设、某些支持软件、数据和人员等其它系统元素结合在一起,在实际运行环境下,对计算机系统进行一系列的组装测试和确认测试。 系统测试的目的在于通过与系统的需求定义作比较, 发现软件与系统的定义不符合或与之矛盾的地方。

测试种类 软件测试是由一系列不同的测试组成。主要目的是对以计算机为基础的系统进行充分的测试。 功能测试 功能测试是在规定的一段时间内运行软件系统的所有功能,以验证这个软件系统有无严重错误。

可靠性测试 如果系统需求说明书中有对可靠性的要求,则需进行可靠性测试。 ① 平均失效间隔时间 MTBF (Mean Time Between Failures) 是否超过规定时限? ② 因故障而停机的时间 MTTR (Mean Time To Repairs) 在一年中应不超过多少时间。

强度测试 强度测试是要检查在系统运行环境不正常乃至发生故障的情况下,系统可以运行到何种程度的测试。 强度测试的一个变种就是敏感性测试。在程序有效数据界限内一个小范围内的一组数据可能引起极端的或不平稳的错误处理出现,或者导致极度的性能下降的情况发生。此测试用以发现可能引起这种不稳定性或不正常处理的某些数据组合。

性能测试 性能测试是要检查系统是否满足在需求说明书中规定的性能。特别是对于实时系统或嵌入式系统。 性能测试常常需要与强度测试结合起来进行,并常常要求同时进行硬件和软件检测。 通常,对软件性能的检测表现在以下几个方面:响应时间、吞吐量、辅助存储区,例如缓冲区,工作区的大小等、处理精度,等等。

恢复测试是要证实在克服硬件故障(包括掉电、硬件或网络出错等)后,系统能否正常地继续进行工作,并不对系统造成任何损害。 为此,可采用各种人工干预的手段,模拟硬件故障,故意造成软件出错。并由此检查: 错误探测功能──系统能否发现硬件失效与故障;

能否切换或启动备用的硬件; 在故障发生时能否保护正在运行的作业和系统状态; 在系统恢复后能否从最后记录下来的无错误状态开始继续执行作业,等等。 掉电测试:其目的是测试软件系统在发生电源中断时能否保护当时的状态且不毁坏数据,然后在电源恢复时从保留的断点处重新进行操作。

这类测试的目的是验证在机器启动及关机阶段,软件系统正确处理的能力。 启动/停止测试 这类测试的目的是验证在机器启动及关机阶段,软件系统正确处理的能力。 这类测试包括 反复启动软件系统 (例如,操作系统自举、网络的启动、应用程序的调用等) 在尽可能多的情况下关机。

这类测试是要检查计算机系统内各个设备或各种资源之间的相互联结和功能分配中的错误。 配置测试 这类测试是要检查计算机系统内各个设备或各种资源之间的相互联结和功能分配中的错误。 它主要包括以下几种: 配置命令测试:验证全部配置命令的可操作性(有效性);特别对最大配置和最小配置要进行测试。软件配置和硬件配置都要测试。

循环配置测试:证明对每个设备物理与逻辑的,逻辑与功能的每次循环置换配置都能正常工作。 修复测试:检查每种配置状态及哪个设备是坏的。并用自动的或手工的方式进行配置状态间的转换。

安全性测试是要检验在系统中已经存在的系统安全性、保密性措施是否发挥作用,有无漏洞。 力图破坏系统的保护机构以进入系统的主要方法有以下几种: 正面攻击或从侧面、背面攻击系统中易受损坏的那些部分; 以系统输入为突破口,利用输入的容错性进行正面攻击;

申请和占用过多的资源压垮系统,以破坏安全措施,从而进入系统; 故意使系统出错,利用系统恢复的过程,窃取用户口令及其它有用的信息; 通过浏览残留在计算机各种资源中的垃圾(无用信息),以获取如口令,安全码,译码关键字等信息; 浏览全局数据,期望从中找到进入系统的关键字; 浏览那些逻辑上不存在,但物理上还存在的各种记录和资料等。

可使用性测试 可使用性测试主要从使用的合理性和方便性等角度对软件系统进行检查,发现人为因素或使用上的问题。 要保证在足够详细的程度下,用户界面便于使用;对输入量可容错、响应时间和响应方式合理可行、输出信息有意义、正确并前后一致;出错信息能够引导用户去解决问题;软件文档全面、正规、确切。

这类测试是要验证系统的支持策略对于公司与用户方面是否切实可行。 它所采用的方法是 可支持性测试 这类测试是要验证系统的支持策略对于公司与用户方面是否切实可行。 它所采用的方法是 试运行支持过程(如对有错部分打补丁的过程,热线界面等); 对其结果进行质量分析; 评审诊断工具; 维护过程、内部维护文档; 修复一个错误所需平均最少时间。

安装测试的目的不是找软件错误,而是找安装错误。 在安装软件系统时,会有多种选择。 要分配和装入文件与程序库 布置适用的硬件配置 进行程序的联结。 而安装测试就是要找出在这些安装过程中出现的错误。

安装测试是在系统安装之后进行测试。它要检验: 用户选择的一套任选方案是否相容; 系统的每一部分是否都齐全; 所有文件是否都已产生并确有所需要的内容; 硬件的配置是否合理,等等。

过程测试 在一些大型的系统中,部分工作由软件自动完成,其它工作则需由各种人员,包括操作员,数据库管理员,终端用户等,按一定规程同计算机配合,靠人工来完成。 指定由人工完成的过程也需经过仔细的检查,这就是所谓的过程测试。

互连测试是要验证两个或多个不同的系统之间的互连性。 兼容性测试 这类测试主要想验证软件产品在不同版本之间的兼容性。有两类基本的兼容性测试: 向下兼容 交错兼容

容量测试是要检验系统的能力最高能达到什么程度。例如, 对于编译程序,让它处理特别长的源程序; 对于操作系统,让它的作业队列“满员”; 对于信息检索系统,让它使用频率达到最大。 在使系统的全部资源达到“满负荷”的情形下,测试系统的承受能力。

文档测试 这种测试是检查用户文档(如用户手册)的清晰性和精确性。 用户文档中所使用的例子必须在测试中一一试过,确保叙述正确无误。

调试(Debug) 软件调试是在进行了成功的测试之后才开始的工作。它与软件测试不同,调试的任务是进一步诊断和改正程序中潜在的错误。 调试活动由两部分组成: 确定程序中可疑错误的确切性质和位置。 对程序(设计,编码)进行修改,排除这个错误。

调试工作是一个具有很强技巧性的工作。 软件运行失效或出现问题,往往只是潜在错误的外部表现,而外部表现与内在原因之间常常没有明显的联系。如果要找出真正的原因,排除潜在的错误,不是一件易事。 可以说,调试是通过现象,找出原因的一个思维分析的过程。

调试的步骤 (1) 从错误的外部表现形式入手,确定程序中出错位置; (2) 研究有关部分的程序,找出错误的内在原因; (3) 修改设计和代码,以排除这个错误; (4) 重复进行暴露了这个错误的原始测试或某些有关测试。

从技术角度来看,查找错误的难度在于: 现象与原因所处的位置可能相距甚远。 当其它错误得到纠正时,这一错误所表现出的现象可能会暂时消失,但并未实际排除。 现象实际上是由一些非错误原因(例如,舍入不精确)引起的。

现象可能是由于一些不容易发现的人为错误引起的。 错误是由于时序问题引起的,与处理过程无关。 现象是由于难于精确再现的输入状态(例如,实时应用中输入顺序不确定)引起。 现象可能是周期出现的。在软、硬件结合的嵌入式系统中常常遇到。

调试的关键在于推断程序内部的错误位置及原因。可以采用以下方法: 强行排错 几种主要的调试方法 调试的关键在于推断程序内部的错误位置及原因。可以采用以下方法: 强行排错 这种调试方法目前使用较多,效率较低。它不需要过多的思考,比较省脑筋。例如: 通过内存全部打印来调试,在这大量的数据中寻找出错的位置。

在程序特定部位设置打印语句,把打印语句插在出错的源程序的各个关键变量改变部位、重要分支部位、子程序调用部位,跟踪程序的执行,监视重要变量的变化。 自动调试工具。利用某些程序语言的调试功能或专门的交互式调试工具,分析程序的动态过程,而不必修改程序。

应用以上任一种方法之前,都应当对错误的征兆进行全面彻底的分析,得出对出错位置及错误性质的推测,再使用一种适当的调试方法来检验推测的正确性。 回溯法调试 这是在小程序中常用的一种有效的调试方法。 一旦发现了错误,人们先分析错误征兆,确定最先发现“症状”的位置。

然后,人工沿程序的控制流程,向回追踪源程序代码,直到找到错误根源或确定错误产生的范围。 例如,程序中发现错误处是某个打印语句。通过输出值可推断程序在这一点上变量的值。再从这一点出发,回溯程序的执行过程,反复考虑:“如果程序在这一点上的状态(变量的值)是这样,那么程序在上一点的状态一定是这样...”, 直到找到错误的位置。

归纳法是一种从特殊推断一般的系统化思考方法。归纳法调试的基本思想是:从一些线索(错误征兆)着手,通过分析它们之间的关系来找出错误。 收集有关的数据 列出所有已知的测试用例和程序执行结果。看哪些输入数据的运行结果是正确的,哪些输入数据的运行结果有错误。

组织数据 由于归纳法是从特殊到一般的推断 过程,所以需要组织整理数据,以 发现规律。 常以3W1H形式组织可用的数据: “What” 列出一般现象; “Where”说明发现现象的地点; “When” 列出现象发生时所有已知情况; “How” 说明现象的范围和量级;

“Yes”描述出现错误的3W1H; “No”作为比较,描述了没有错误的3W1H。通过分析找出矛盾来。 提出假设 分析线索之间的关系,利用在线索结构中观察到的矛盾现象,设计一个或多个关于出错原因的假设。如果一个假设也提不出来,归纳过程就需要收集更多的数据。此时,应当再设计与执行一些测试用例,以获得更多的数据。

证明假设 把假设与原始线索或数据进行比较,若它能完全解释一切现象,则假设得到证明;否则,就认为假设不合理,或不完全,或是存在多个错误,以致只能消除部分错误。

演绎法调试 演绎法是一种从一般原理或前提出发,经过排除和精化的过程来推导出结论的思考方法。演绎法排错是测试人员首先根据已有的测试用例,设想及枚举出所有可能出错的原因做为假设;然后再用原始测试数据或新的测试,从中逐个排除不可能正确的假设;最后,再用测试数据验证余下的假设确是出错的原因。

列举所有可能出错原因的假设 把所有可能的错误原因列成表。通过它们,可以组织、分析现有数据。 利用已有的测试数据,排除不正确的假设 仔细分析已有的数据,寻找矛盾,力求排除前一步列出所有原因。如果所有原因都被排除了,则需要补充一些数据(测试用例),以建立新的假设。

改进余下的假设 利用已知的线索,进一步改进余下的假设,使之更具体化,以便可以精确地确定出错位置。 证明余下的假设

在调试方面,许多原则本质上是心理学方面的问题。调试由两部分组成,调试原则也分成两组。 确定错误的性质和位置的原则 用头脑去分析思考与错误征兆有关的信息。 避开死胡同。

修改错误的原则 只把调试工具当做辅助手段来使用。利用调试工具,可以帮助思考,但不能代替思考。 避免用试探法,最多只能把它当做最后手段。 在出现错误的地方,很可能还有别的错误。

修改错误的过程将迫使人们暂时回到程序设计阶段。 修改源代码程序,不要改变目标代码。 修改错误的一个常见失误是只修改了这个错误的征兆或这个错误的表现,而没有修改错误的本身。 当心修正一个错误的同时有可能会引入新的错误。 修改错误的过程将迫使人们暂时回到程序设计阶段。 修改源代码程序,不要改变目标代码。