第7章软件的质量与测试_第1页
第7章软件的质量与测试_第2页
第7章软件的质量与测试_第3页
第7章软件的质量与测试_第4页
第7章软件的质量与测试_第5页
已阅读5页,还剩203页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1第7章

软件的质量与测试

软件工程研究室SoftwareEngineering2

主要内容

7.1

软件的质量

7.2软件的测试

目的:测试是软件质量保证中至关重要的一个环节3

主要内容

7.1

软件的质量

7.1.1软件的质量观

7.1.2软件质量的特征

7.1.3软件质量因素

7.1.4软件质量要素之间的关系

7.1.5质量保证的几个问题47.1.1软件的质量观7.1软件的质量高质量客户:

在可接受的资金和资源成本下解决问题用户:

易学习;

使用效率高;

对工作有帮助开发:

易设计;

易维护;

易重用管理人员:

销售量大并使客户满意,同时开发和维护的费用少5

Juran

的质量观:

产品在使用时,能适合用户需要的目标程度。

ISO的质量观:

“一个产品或服务是否能够满足其指定的或蕴含的需求有关的性质与特征总和”.

7.1.1软件的质量观

7.1.2软件质量的特征(1)很难制定具体的、数量化的产品质量标准没有相应的国际标准、国家标准或行业标淮(2)大部分软件很难做到“零缺陷”对软件的测试不可能穷尽所有情况,有缺陷的软件仍然可以使用软件产品的不完善可通过维护和升级解决问题(3)软件的类型不同,软件质量的衡量标准的侧重点也不同。对实时系统,可靠、效率是衡量软件质量的首要要素对一些需要用户与软件本身进行大量交互的系统,对可用性(usability)就提出了较高的要求。

7.1.2软件质量的特征(6)如果软件只满足了己经定义的需求,而没有满足一些隐含的需求,软件质量也不能保证。(4)软件产品之间很难进行横向的质量对比(5)软件需求是度量软件质量的基础,满足了用户需求的软件质量,就是好的软件质量。即使软件在技术上很先进,界面很漂亮,功能也很多,但不是用户所需要的,仍不能算软件质量好。功能性(Functionality)可靠性(Reliability)可用性(Usability)效率(Efficiency)可维护性(Maintainability)可移植性(Portability)7.1.3软件质量因素

1)ISO质量特性国际标准(ISO/IEC9126)

1991年,ISO发布了ISO/IEC9126质量特性的国际标准,将质量特性降为6个,并定义了

21个子特性:

1)ISO质量特性国际标准(ISO/IEC9126)图7-1ISO软件质量模型

外部和内部质量适合性准确性互操作性保密安全性功能性可靠性易用性维护性可移植性效率成熟性容错性易恢复性易理解性易学性易操作性吸引性时间特性资源利用性易分析性易改变性稳定性易测试性适应性易安装性共存性易替换性102)McCall软件质量模型(1977):产品修改产品改型

图7-2McCall软件质量模型

外部质量属性(externalqualityattribute)易移植性易复用性互用性

易维护性灵活性易测试性产品操作易使用性正确性可靠性高效性完整性11每个要素包含系列衡量标准正确性易追溯性:从需求中找到实现能力完备性:实现了所有的功能一致性:一致的术语和技术高效性运行效率:使用最少的处理时间存储效率:使用最小的内存空间可靠性容错性:异常,仍能操作一致性准确性简洁性易使用性易操作培训易交流输入输出量和速度灵活性一致性模块性易扩展性自我描述性互用性模块性通讯共同性数据共同性13易测试性检视:测量、识别错误能力简洁性自我描述性模块性模块性易移植性软件独立性硬件独立性自我描述性14易复用性软件独立性通用性模块性硬件独立性自我描述性易维护性简明性:代码少简洁性:易理解模块性一致性自我描述性:有解释15总体效用易维护性现存效用易移植性易修改性易理解性易测试性效率人机界面可靠性易更改性

可认性

简明性结构性自我描述性易交流性易存取性设备效率可依靠性一致性完整性准确性自我包含性硬件独立性图7-3Boehm模型3)Boehm模型

(1978)16McCall和Boehm模型从用户出发的质量观.都是层次结构的模型.根据具体情况决定质量要素的相对重要性.

7.1.4软件质量要素之间的关系

质量由多种因素组成,但互不独立,也不一定同等重要,可能是冲突的.

在一定前提下来衡量质量,不能脱离代价来衡量产品的质量.17软件质量要素之间的关系正确性可靠性效率完整性易使用性易维护性易测试性灵活性易移植性易复用性互用性正确性可靠性效率完整性易使用性易维护性易测试性灵活性易移植性易复用性互用性直接相关反向相关无关图7-4Perry的质量要素之间关系18提高效率可能会使设计不宜理解,会降低系统的可维护性。实现高可靠性通常要求反复地进行错误检查并添加一些冗余计算。

提高效率可能要求删除这些检查和冗余。改善可用性可能需要添加额外的代码为用户提供反馈信息,这又可能降低整体效率。良好的工程实践,项目开始就应设定质量目标,目标的实现应让所有相关人员都满意。为了在市场竞争中取得成功,在不超过预算和满足其他质量目标要求的同时,使某个质量属性达到最优化(optimize)。19

内部质量属性:

代码注释量,影响可维护性,间接影响可靠性;

代码的复朵性,影响可维护性、可靠性。

说明:

注重短期需要而忽视决策的长期影响是人类的天性.这可能引发严重后果。

只考虑短期效果,可能忽视系统的可维护性,

忽视客户的长期需要,导致过高的后期成本。20

几个思考题:下面的问题与哪些质量属性有关.一段宇宙飞船程序,使宇宙飞船进入冥王星轨道.一个在购物中心运行的系统.使用该系统,购物者可以确定哪个商店出售他们需要的商品.

汽车自动变速器的控制程序.

打印票据的实用软件包.计算所得税的程序,公务员可以使用该程序检查纳税人的账目.

1)软件质量应贯穿软件开发的全过程软件质量管理该贯穿软件开发的全过程,而不仅仅是软件本身。

7.1.5质量保证的几个问题2)对开发文档的评审

需求规格说明书设计规格说明书代码文档测试报告用户手册

3)运用技术手段保证质量使用多种软件工具,保证软件质量。例如:

用RationalRose软件进行软件开发等。采用先进的系统分析方法和软件设计方法

4)以满足客户和用户需要为目标的质量保证(3)缺陷预防,控制对缺陷的修改

(1)采用快速原型法(2)充分设计之后再编码(4)充分进行软件的系统测试

(5)恰当掌握软件的放行标淮

237.2软件测试

软件测试

它既令人兴奋,也令人烦脑;既令人羡慕不己,也令人望而却步;要想在预算内按时交付高质量的软件,测试是必不可少的。

7.2.1软件测试概述

7.2.2程序错误分类

7.2.3软件测试的V模型

7.2.4软件测试的分类

7.2.5软件测试的方法

7.2.6软件测试的步骤

7.2.7软件的调试

7.2.1软件测试概述1)什么是软件测试(Test)

?2)为什么要测试(Test)

?3)软件测试的目的

4)软件测试的准则5)软件的可测试性

6)软件测试与软件开发阶段7.2.1软件测试概述1)什么是软件测试(Test)

测试是采用测试用例,检测出程序的错误、缺陷、故障、失效和事故等的一项软件活动。对程序的副本提供一组有代表性的输入数据,给定的环境下运行程序副本,并对程序的输出进行检查和分析。

错误(Error)称bug不正确结果的全部。由开发人员引起的,如输入错误、需求错误、设计错误等。

缺陷(Defect)错误的表现结果,会促成失败的发生。由不恰当或错误的技术、算法、遗漏了某些功能或设计内容所导致。故障(Fault)故障是指系统的规格说明与其行为之间的偏差,通常由一个或多个缺陷引起。通过对比程序的实际输出与预期输出来检测。失效(Failure)故障引起的结果。系统不可接受的行为。由于错误,导致系统的错误输出─失效。发生过失效的软件通常仍然是可用的。只有当软件频繁失效,或者公认已经“过时”了的时侯,软件才被废弃,意味着当前这一版本软件使用寿命的终结。事故(Incident)呈现给用户的严重错误的结果,造成一定的或严重的损失。“千年虫”1970年代,一位程序员在开发公司的工资管理系统时,迫于计算机存储空间的限制,将4位数日期缩减为2位数(197373),从而节省了可观的存储空间;然而,世界各地更换或升级2000年问题所花的费用超过数亿美元…2)为什么要测试(Test)

?“爱国者导弹”爱国者导弹vs

飞毛腿导弹有一枚爱国者导弹击毙28名美军士兵…原因:导弹的软件包含一个累加计时故障,系统时钟错误积累起来就可能拖延14个小时,造成跟踪系统失去准确度。“狮子王”1994年秋天,迪斯尼公司发行《LionKingAnimated》,虽然销售量巨大,却引来巨大的、意想不到的投诉…原因:

发布之前未能对该软件在各种不同类型的PC机上进行测试,导致在某些系统上无法运行。

如,对一个整数组排序,应该用整数比较函数

icmp调用qsort:

int

arr[N];

qsort(arr,N,sizeof(arr[0],icmp);无意中把字符串比较函数传进去:?int

arr[N];

?qsort(arr,N,sizeof(arr[0],scmp);

编译无法发现这类错误,程序运行时会垮台,

它访问非法的存储器地址,灾难就发生了。323)软件测试的目的

软件测试是对软件质量的度量,并代表了规约、设计和编码的最终评审。

为找出错误而运行程序或系统的过程。(Myers,1979)软件测试概述测试是证明错误的存在,而不是证明错误的不存在。

(Dijstra)确信程序做了它应该做的事。(Hetzel,1973)

确认程序正确地实现了所要求的功能。33

4)软件测试的准则#

需求确定后,制定测试计划,所有的测试应能

追溯到用户需求上。

软件测试概述#尽早地和不断地进行软件测试。

#

测试从小规模开始,逐渐扩到大规模。

#

独立测试组或SoftwareTestEngineer

#

测试中发现8o%错误,可能由程序的20%的组件造成的(Pareto原理)。

#

使用或开发测试工具。

345)软件的可测试性

程序被测试的难易程度软件测试概述一个特定测试集覆盖产品的充分程度

软件可测试性的度量特征:

a.可操作性b.可观察性c.可控制性

d可分解性e.简单性f.稳定性

g.可理解性

35

6)软件测试与软件开发阶段

软件测试并不等于程序测试,应贯穿于软件定义与开发的各个阶段。

需求阶段

用例情景测试原型走查模型走查需求评审制定测试计划设计阶段

模型走查原型走查设计评审

制定测试计划测试设计实现阶段代码走查接口分析文档评估

编写测试用例制定测试过程

单元测试实现阶段制定测试计划集成设计系统测试

α测试

β测试验收测试回归测试,质量保证验收阶段表7-1软件测试与软件开发阶段367.2.2软件错误分类

Beizer

给出的软件错误:

抽样大小—6877000条语句(含注释)总错误数—16209个错每千条语句错误数—2.36个错需求错误,功能和性能错误程序结构错误,数据错误编码错误测试定义和执行错误软件集成错误37错误分类错误数百分比(%)需求错误13178.1需求不正确6494.0需求逻辑错1530.9需求不完备2241.4需求文档描述错130.1需求变更2781.7表7-2需求错误错误分类38错误分类错误数百分比(%)功能和性能错误262416.2功能和性能不正确4562.8性能不完整2311.4功能不完整1931.2适用范围错7784.8用户信息和诊断信息错8575.3异常处理错790.5其他功能错300.2表7-3功能和性能错误错误分类39错误分类错误数百分比(%)程序结构错误408225.2控制流和控制顺序错误、变量、分支、循环等问题207812.8处理器错200412.4表7-4程序结构错误错误分类40错误分类错误数百分比(%)数据错误363822.4数据类型定义,引用及结构错180511.1数据存取及处理错183111.3其他数据错(比较、计算、精度、零为除数)2表7-5数据错误错误分类41错误分类错误数百分比(%)编码与实现错误16019.9编码与程序输入错误3322.0违反编程标准或风格3182.0文档错9605.9其他实现错10.0表7-6编码与实现错误错误分类42错误分类错误数百分比(%)测试定义和执行错误4472.8测试设计错110.1测试执行错3552.2测试文档错110.1测试用例不充分640.4其他测试错误60.0其他错误

(定时和协调,性能,故障恢复,不付合标准)7634.7表7-7测试定义和执行错误错误分类43错误分类错误数百分比(%)软件集成错误14559.0内部接口错8595.3外部接口,时间吞吐量不匹配5183.2其他集成错780.5系统及软件结构错2821.7表7-8软件集成错误错误分类447.2.3软件测试的V模型模块规约系统结构与子系统规约用户需求分析规约确定系统设计详细设计模块实现规约用户需求用户要求用户接受测试系统测试系统集成子系统集成与测试模块测试模块代码测试后的模块测试后子系统集成的系统检验过的系统交付的系统图7-5软件测试的V模型457.2.4软件测试的分类

1)按实施步骤分:单元测试组装测试确认测试系统测试

3)按使用的测试方法分:静态测试:动态测试:白盒测试、黑盒测试

2)按软件组装策略分:

#增量测试自顶向下自底向上三明治

#非增量测试46软件测试的分类

功能测试

性能测试接口测试

强度测试

安全性测试

可靠性测试

恢复性测试

安装性测试

协调性测试

人机界面测试4)按项目测试条目分:477.2.5软件测试方法图7-8软件测试技术分类软件测试方法静态测试动态测试黑盒测试/功能测试白盒测试/结构测试48静态测试(代码会审/走查/办公桌)对需求模型、设计模型的静态检查检查:数据引用错(使用未赋值的变量)数据计算错(混合类型,零为除数)数据说明错(类型不符错)数据比较错(运算符、逻辑符不符)控制流错(循环初值、次数不对)接口错输入输出错文件错49

任何程序都可以看作是将输入定义域取值映射到输出值域的函数。将系统看成“黑盒”。也称黑盒测试1)功能测试(FunctionTesting)软件InputOutput图7-6黑盒测试目的:功能的正确性测试

证实每个实现了的功能是否符合需求规格说明书的要求。

黑盒测试要在软件的接口处进行.50是否有不正确或遗漏的功能?黑盒测试可以发现如下错误:在接口上,输入能否被正确地接受?能否输出正确的结果?是否有数据结构错误或外部信息(例如数据文件)访问错误?性能上是否能够满足要求?是否有初始化或终止性错误?51

功能测试的方法:

等价类分析边界值分析错误推测法因果图法

随机测试基于决策树的测试52(1)等价类(Equivalencepartitioning)

把输入的数据按有效的和无效的划分为若干个等价类。等价类,是指某个输入域的子集合。在该子集合中,各个输入数据对于揭露程序中的错误都是等效的。

有效等价类:

对于程序规格说明,是合理的,有意义的输入数据构成的集合。

无效等价类:

是指对于程序规格说明,是不合理的,无意义的输入数据构成的集合。53等价类划分的原则:

按区间划分按数值划分按数值集合划分按限制条件或规则划分

功能测试按区间划分例如:输入值是学生成绩,范围是0~1000100有效等价类1≤成绩≤100无效等价类2成绩>100无效等价类1成绩<054

测试用例

={测试数据十期望结果}

测试结果={测试用例十实际结果}

在确立了等价类之后,建立等价类表,列出所有划分出的等价类数据十期望结果。

确立测试用例功能测试等价类划分

………

………

……….

无效等价类

有效等价类

输入条件表7-9划分出的等价类不考虑程序的内部结构,只依据程序的规格说明来设计测试用例。55

输入条件

有效等价类

无效等价类标识符个数1个(1)多个(2)0个(3)

标识符字符数1—8个(4)

0个(5)>8个(6)>80个(7)标识符组成

字母(8)

数字(9)非字母数字字符(10)

保留字(11)第一个标识符

字母(12)

非字母(13)标识符使用先说明后使用(14)

未说明已使用(15)表7-10标识符的等价类划分例1为标识符划分等价类56测试用例:

VARX,T1234567:REAL;(1),(2),(4),(8),(9),(12),(14)X=3.414;T1234567:=2.73VAR:REAL;(3)VARX,:REAL;(5)VART12345678:REAL;(6)VART123456789….:REAL>80(7)VART$:CHAR;(10)VARGOTO:INTEGER;(11)VAR2T:REAL;(13)VARPAR:REAL;(15)例2:日期检查档案管理系统,要求用户输入以年月表示的日期。假设日期限定在1990年1月--2049年12月,并规定日期由6位数字字符组成,前4位表示年,后2位表示月。[问题]用等价类划分法设计测试用例,来测试程序的“日期检查功能”。输入等价类有效等价类无效等价类日期的类型及长度(1)6位数字字符(2)有非数字字符(3)少于6位数字字符(4)多于6位数字字符年份范围(5)在1990-2049之间(6)小于1990(7)大于2049月份范围(8)在01~12之间(9)等于00(10)大于12划分等价类:表7-11日期的等价类划分例2:日期检查设计有效等价类的测试用例:测试用例编号测试用例内容覆盖的等价类U1200711(1)(5)(8)表7-12日期的有效等价类测试用例例2:日期检查设计无效等价类的测试用例:测试用例编号测试用例内容覆盖的等价类U107June(2)U220076(3)U32007011(4)U4198912(6)U5205401(7)U6200700(8)U7200713(10)表7-13日期的无效等价类测试用例61确定等价类的原则小结(1)如果输入条件规定了取值范围,或者值的个数,则可以确定一个有效等价类和两个无效等价类。(2)如果输入条件规定了输入值的集合,或者是规定了“必须如何”的条件,则可以确立一个有效等价类和一个无效等价类。(3)如果输入条件是一个布尔量,则可以确立一个有效等价类和一个无效等价类。(4)如果规定了输入数据必须遵守的规则,则可以确立一个有效等价类(遵守规则的数据)和若干无效等价类(从不同角度违反规则的数据)。62选择测试用例的原则:设计尽可能少的测试用例,覆盖所有的有效等价类。等价类划分针对每一个无效等价类,设计一个测试用例来覆盖它。(5)如果确知以划分的等价类中的各元素在程序中的处理方式不同,则应进一步划分成更小的等价类。63(2)边界值法(BoundaryValueAnalysis)

把测试值选在等价类的边界上。错误可能出现在输入变量的极值附近。功能测试bacd图7-7边界值测试法例如,测试

的一段程序。凭直觉等价区间应是(0,

1)和(1,

+∞)。可取x=0.5以及x=2.0进行等价测试,再取

x=0以及x=1进行边界值测试。

确定边界通常输入和输出等价类的边界,是重点测试的边界情况。选取正好等于、刚刚大于、刚刚小于边界的值作为测试数据,而不是选取等价类中的典型值或任意值作为测试数据。65边界值的选取

5个元素情况:

最小值,略高于最小值正常值略低于最大值,最大值

n个变量,有4n+1个测试用例abcd图7-8边界值测试法abcd在5个元素基础上增如:略高于最大值略低于最小值

常见的边界值通常情况下,软件测试所包含的边界检验有几种类型:数字、字符、位置、重量、大小、速度、方位、尺寸、空间等。相应地,以上类型的边界值应该在:最大/最小、首位/末位、上/下、最快/最慢、最高/最低、

最短/最长、空/满等情况下。对16-bit的整数而言,32767和-32768是边界屏幕上光标在最左上、最右下位置数组元素的第一个和最后一个报表的第一行和最后一行循环的第0次、第1次和倒数第2次、最后1次边界值分析的原则原则1:如果输入条件规定了值的范围,则应取刚达到这个范围的边界的值,以及刚刚超越这个范围边界的值作为测试输入数据。例如:如果程序的规格说明中规定“重量在10公斤至50公斤范围内的邮件,其邮费计算公式为……”。

作为测试用例,应取10、50、10.01、49.99、9.99及50.01等。原则2:如果输入条件规定了值的个数,则用最大个数、最小个数、比最小个数少1,比最大个数多1的数据作为测试数据。比如,一个输入文件应包括1-255个记录,则测试用例可取1和255,还应取0及256等。原则3:如果程序的规格说明给出的输入域或输出域是有序集合,则应选取集合的第一个元素和最后一个元素作为测试用例。原则4:将原则1和原则2应用于输出条件,即设计测试用例使输出值达到边界值及其左右的值。

例如,某程序的规格说明要求计算出“每月保险金扣除额为0至1165.25元”。其测试用例可取:0.00及1165.24、还可取:-0.01及1165.26等。再如,某程序要求每次”最少显示1条、最多显示4条查询结果”。其测试用例包括1和4,还应包括0和5等。[例1]NextDate()序号MonthDayYear期望输出121420002000-2-15221419961996-2-15321420022002-2-15422820002000-2-29522819961996-2-29622820022002-3-1722920002000-3-1822919961996-3-192292002无效的输入日期102302000无效的输入日期112301996无效的输入日期122302002无效的输入日期序号MonthDayYear期望输出1361420002000-6-151461419961996-6-151561420022002-6-151662920002000-6-301762919961996-6-301862920022002-6-301963020002000-7-12063019961996-7-12163020022002-7-1226312000无效的输入日期236311996无效的输入日期246312002无效的输入日期序号MonthDayYear期望输出2581420002000-8-152681419961996-8-152781420022002-8-152882920002000-8-302982919961996-8-303082920022002-8-303183020002000-8-313283019961996-8-313383020022002-8-313483120002000-9-13583119961996-9-13683120022002-9-1序号MonthDayYear期望输出37123120002001-1-138123119961997-1-139123120022003-1效的输入日期4113301996无效的输入日期4213312002无效的输入日期43302000无效的输入日期443321996无效的输入日期459140无效的输入日期46000无效的输入日期47-1142000无效的输入日期4811-12002无效的输入日期在NextDate()函数中:1≤month≤121≤day≤311912≤year≤2050[例1]NextDate()另一种更详尽的划分方法D1={1≤date<lastdayofthemonth}D2={lastdayofthemonth}D3={Dec.31}M1={30-daymonths}M2={31-daymonths}M3={Feb.}Y1={2000}Y2={leapyear}Y3={notleapyear}72

检查条件所导致的分支是否正确;

检查循环实际执行的次数是否正确;

检查不存在或空的输入;

检查单个输入项;

检查一个正好填满了的数组等等。

观点:大部分错误都出现在边界上例2测试代码的边界情况73

模拟fgets(从文件中获取字符串函数),读入一些字符,直到迂到一个换行或缓冲区满了。

inti;

chars[MAX];

for(i=0;(s[i]=getchar())!=‘\n’&&i<MAX-1;++i)

s[--i]=‘\0’;

第1个边界测试:

读入一个空行,一开始就是个换行符.结果如何?74循环在第1次重复时就结束了,这时i=0最后一行代码i值减小到-1,并把一个空字节写入s[-1]在数组开始之前,通过边界测试发现错误重写循环,用字符填充数组的方法:for(i=0;i<MAX-1;i++)if((s[i]=getchar())==‘\n’)break;

s[i]=‘\0’;

75

重复前面边界测试,对只有一个换行字符的行,程序能正确处理。i=0,第1个输入字符跳出循环,而‘\0’被存入s[0]中。对一个或两个字符之后是换行符的输入做类似检查,在接近边界处循环也能工作。

76

第2个边界测试:

输入中有一个很长的行或其中无换行符,

保证i总是小于MAX-1的检测,能处理这个问题。

若输入为空,对getchar的第1次调用就返回EOF,必须增加新条件:

inti;chars[MAX]for(i=0;i<MAX-1;i++)if((s[i]=getchar())==‘\n’||s[i]==EOF)break;

s[i]=‘\0’;

77第3个边界测试:

检查输入即数组接近满了,正好满了,超过的情况。

若换行符正好在这个时候出现,若在‘\n’出现前缓冲区己满,程序做些什么?

78基本思想:列举出程序中所有可能有的错误和容易发生错误的特殊情况,根据它们选择测试用例。利用经验确定程序中容易出错的地方。(3)错误推测法功能测试例对排序程序进行测试

边界值法

#输入表为空

#输入表中仅有一个数据

#输入表为满表错误猜测法

#输入表已排好序

#输入表的排序与要求的顺序相反

#输入表中的所有数据全部相同79(4)因果图(Cause-EffectGraphing)

借助图形来设计测试用例的一种方法.功能测试因果图方法最终生成的就是判定表。用于被测程序具有多种输入条件,而输出又依赖于输入条件的各种组合情况.80因果图中的基本符号Ci表示原因,Ei表示结果。各结点表示状态,“0”---状态不出现,

“1”---状态出现.CiEi恒等CiEi非C1EiC2或C1EiC2与图7-9因果图基本符号81表示约束条件的因果图符号EabE(互斥、排他)IabI(包含、或)cOabO(唯一)aRbR(要求)MabM(屏蔽)图7-10表示约束条件的因果图符号82例利用因果图设计测试用例饮料自动售货机软件测试用例。

售1杯饮料单价5角.若投入5角钱或1元钱的硬币,按下橙汁或啤酒的按钮,则饮料流出.若有零钱找,则显示零钱找完的红灯灭,并在送出饮料的同时退还5角硬币。若售货机没有零钱找,则显示一个零钱找完的红灯亮,这时若投入1元钱硬币并按下按钮,则不仅不送出饮料而且退出1元钱;83自动售货机软件测试用例

中间状态11.投入1元硬币且按下饮料按钮12.按下橙汁或啤酒按钮13.应当找5角钱且售货机有零钱找14.钱已付清原因

结果1.售货机有零钱找21.售货机零钱找完红灯亮2.投入1元硬币22.退还1元硬币3.投入5角硬币23.退还5角硬币4.按下橙汁按钮24.送出橙汁饮料5.按下啤酒按钮25.送出啤酒饮料84按下橙汁按钮12345售货机有零钱找投入1元硬币投入5角硬币按下啤酒按钮2122232425售货机零钱找完红灯亮退还1元硬币找回5角硬币送出橙汁饮料送出啤酒饮料E11131412E该找5角可找5角按下按钮钱已付清图7-11自动售货机的因果图85

因果图方法生成测试用例的步骤:a.找出软件规格说明中的原因(输入条件或输入条件的等价类),及由原因引起的结果(即输出条件动作).b.分析软件规格说明描述中的语义,找出原因与结果之间,原因与原因之间对应的是什么关系?根据这些关系画出因果图.86因果图方法生成测试用例的步骤:c.由于语法或环境限制,有些原因与原因之间,

原因与结果之间的组合情况不可能出现。为表明这些特殊情况,在因果图上用一些记号标明约束或限制条件.d.把因果图转换成判定表.e.

把判定表的每一列拿出来作为依据,设计测试用例.自动售货机转换成判定表:表7-14自动售货机判定表88(5)综合策略的测试方法Myers提出了使用各种测试方法的综合策略:

任何情况下都必须使用边界值分析方法。必要时用等价类划分法补充一些测试用例.

用错误推测法再追加一些测试用例.

如果程序的功能说明中含有输入条件的组合情况,则一开始就可选用因果图法.

测试用例的逻辑覆盖程度要达到要求的覆盖标准.

89(6)穷举测试

对于黑盒测试来讲,最简单程序,设A、B、C都是整形变量,在字长为32位的计算机上运行,则输入数据的可能性有232x232=264种,如果这个程序执行一次需1ms,一年工作365×24小时,则所有的组合完全测试一次将需要5亿年。是不可能的ProgramABCc因此,测试人员只能在大量可能的数据中,选取其中一部分作为测试用例。90

检查软件在异常条件下的行为。容错性好的软件能确保系统不发生无法意料的事故。

(7)非功能测试--容错性测试比较温柔的容错性测试通常构造一些不合理的输入来引诱软件出错,例如:

(1)输入错误的数据类型。

(2)输入定义域之外的数值。粗暴一些的容错性测试俗称“大猩猩”测试,可使出任何招术。91

性能与效率测试:测试软件的运行速度和对资源的利用率。有时关心测试的“绝对值”,如数据输送速率是每秒多少比特。有时关心测试的“相对值”,如某个软件比另一个软件快多少倍。(7)非功能测试--性能与效率测试

在获取测试的“绝对值”时,要充分考虑并记录运行环境对测试的影响.例如计算机主频,总线结构和外部设备都可能影响软件的运行速度;若与多个计算机共享资源,软件运行可能慢得像蜗牛爬行。92

在获取测试的“相对值”时,要确保被测试的几个软件运行于完全一致的环境中。硬件环境的一致性比较容易做到(用同一台计算机即可)。软件环境的因素较多:操作系统,程序设计语言,编译系统等,对软件的性能都会产生较大的影响。如果是比较几个算法的性能,就要求编程语言和编译器也完全一致。93

性能与效率测试中很重要的一项是

极限测试

因为很多软件系统会在极限测试中崩溃。例如,连续不停地向服务器发请求,测试服务器是否会陷入死锁状态不能自拔;给程序输入特别大的数据,看看它是否吃得消。

94

易用性测试没有一个量化的指标,主观性较强。[Cusumano

1995]一般认为,如果用户不翻阅手册就能使用软件,那么表明这个软件具有较好的易用性。(7)非功能测试--易用性测试95

文档测试主要检查文档的正确性、完备性和可理解性。

文档测试软件=程序十文档十数据

正确性是指不要把软件的功能和操作写错,也不允许文档内容前后矛盾。

完备性是指文档不可以“虎头蛇尾”,更不许漏掉关键内容。文档中很多内容对开发者可能是“显然”的,但对用户不见得都是“显然”的。

文档不可以写成散文、诗歌或者侦探等小说,要让用户看得懂,能理解。96小结

功能测试的方法:

等价类分析边界值分析错误推测法因果图法97

功能性测试方法优点:与软件如何实现无关,如果实现发生变化,测试用例仍然有用;测试用例开发可以与程序的实现并行进行.缺点:测试用例之间可能存在严重的冗余;存在测试的不彻底性.小结功能测试只能观察软件的外部表现,满足用户的功能需求。小结即使软件的输入输出都是正确的,却并不能说明软件就是正确的。因为程序有可能用错误的运算方式得出正确的结果,例如“负负得正,错错得对”,只有白盒测试才能发现真正的原因。白盒测试能发现程序里的隐患,象内存泄漏、误差累计问题。在这方面,黑盒测试存在严重的不足。2)结构测试(白盒测试)

白盒测试白盒测试又称覆盖测试。测试软件产品的内部逻辑结构,是否符合设计规格要求。白盒测试考虑测试用例对程序内部逻辑的覆盖程度:最彻底的白盒法是覆盖程序中的每一条路径,但是由于程序中一般含有循环,所以路径的数目极大,要执行每一条路径是不可能的,只能希望覆盖的程度尽可能高些。对一个具有多重选择和循环嵌套的程序,不同的路径数目可能是天文数字。例:某个小程序的流程图,包括了一个执行20次的循环。包含的不同执行路径数达520条,对每一条路径进行测试需要1毫秒,假定一年工作365×24小时,要把所有路径测试完,需3170年。图7-12执行20次循环程序的流程图逻辑覆盖:语句覆盖判定覆盖(分支覆盖)条件覆盖判定/条件覆盖条件组合覆盖控制结构覆盖:基本路径测试循环测试条件测试数据流测试为了衡量测试的覆盖程度,下面给出了从低到高的覆盖方法:102对模块的每一个独立的执行路径至少测试一次。

对所有的逻辑判定的每一个分支,(真与假)都至少测试一次。

在循环的边界和运行界限内执行循环体。这些方法主要对程序模块进行如下的检查:测试内部数据结构的有效性。(1)语句覆盖(StatementCoverage)被测程序中的每条语句至少应该执行一次语句覆盖是最弱的测试标准。例1:floatexample(floatA,B,X){if(A>1&&B==0)X=X/A;if(A==2||X>1)X=X+1;}测试用例:图7-13例1程序流程图A>1&&B=0aA=2‖X>1X=X+1bdceX=X/AYYNNA=2,B=0,X=3语句覆盖的缺点语句覆盖是最弱逻辑覆盖如果第一个条件语句中的“&&”错误的写成“||”,上面的测试用例无法发现这个错误;如果第三个条件语句中x>1误写成x>0,这个测试用例也不能暴露它;沿着路径abd执行时,x的值应该保持不变,如果这一方面有错误,上述测试数据也不能发现它。语句覆盖的例2voidDoWork(intx,inty,intz){

intk=0,j=0;if((x>3)&&(z<10)){k=x*y-1;//语句块1j=sqrt(k);}if((x==4)||(y>5)){j=x*y+10;//语句块2}j=j%3;//语句块3}测试用例:x=4,y=5,z=5图7-13例2程序流程图(2)判定(分支)覆盖执行足够的测试用例,使得程序中的每一个分支至少都通过一次。测试用例:A=3,B=0,X=1(沿路径acd执行)

A=2,B=1,X=3(沿路径abe执行)图7-13例1程序流程图A>1&&B=0aA=2‖X>1X=X+1bdceX=X/AYYNN判定(分支)覆盖测试用例:但是,两个测试用例虽然能够满足条件覆盖的要求,但是也不能对判断条件进行检查。如把条件y>5错误的写成y<5,上面的测试用例同样满足了分支覆盖。x=4,y=5,z=5x=2,y=5,z=5图7-13例2程序流程图(3)条件覆盖一个判定中往往包含了若干个条件;例如:判定(A>1)AND(B=0)包含了两个条件:A>1以及B=0“条件覆盖”,执行足够的测试用例,使得判定中的每个条件获得各种可能的结果。条件覆盖

例中

的程序有四个条件:

A>1、B=0、A=2、X>1

图7-13例1程序流程图A>1&&B=0aA=2‖X>1X=X+1bdceX=X/AYYNN

在a点的条件有:

A>1、A≤1、B=0、B≠0

在b点条件有:A=2、A≠2、X>1、X≤1 现在只需设计以下两个测试用例就可满足这一标准:A=2,B=0,X=4

(沿路径ace执行);A=1,B=1,X=1

(沿路径abd执行)。

条件覆盖对例中的所有条件取值加以标记。对于第一个判断:条件x>3取真值为T1,取假值为-T1条件z<10取真值为T2,取假值为-T2图7-13例2程序流程图对于第二个判断:条件x=4取真值为T3,取假值为-T3条件y>5取真值为T4,取假值为-T4条件覆盖表7-15条件覆盖测试用例1

测试用例

通过路径

条件取值

覆盖分支x=4、y=6、z=5abdT1、T2、T3、T4

bdx=2、y=5、z=5ace-T1、T2、-T3、-T4cex=4、y=5、z=15acdT1、-T2、T3、-T4cd上面的测试用例不但覆盖了所有分支的真假两个分支,而且覆盖了判断中的所有条件的可能值。

条件覆盖“条件覆盖”通常比“分支覆盖”强,因为它使一个判定中的每一个条件都取到了两个不同的结果,而分支覆盖则不保证这一点。“条件覆盖”并不包含“分支覆盖”,如对语句“if(A&&B)S;”设计测试用例使其满足条件覆盖,即“使A为真并使B为假”、“使A为假且B为真”,但是它们都未能使语句S得以执行。

如设计了下面的测试用例,则虽然满足了条件覆盖,但只覆盖了第一个条件的取假分支和第二个条件的取真分支,不满足分支覆盖的要求。测试用例

通过路径

条件取值覆盖分支x=2、y=6、z=5acd-T1、T2、-T3、T4cdx=4、y=5、z=15acdT1、-T2、T3、-T4cd表7-15条件覆盖测试用例2图7-13例2程序流程图(4)分支/条件覆盖分支/条件覆盖是:执行足够的测试用例,使得分支中每个条件取到各种可能的值,并使每个分支取到各种可能的结果。对前面的两个例子: ①A=2,B=0,X=4(沿ace路)

②A=1,B=1,X=1(沿abd路径)

是满足这一标准的。图7-13例1程序流程图A>1&&B=0aA=2‖X>1X=X+1bdceX=X/AYYNN分支/条件覆盖

对该例,根据定义只需设计以下两个测试用例便可以覆盖8个条件值以及4个判断分支。

测试用例通过路径条件取值覆盖分支x=4、y=6、z=5abdT1、T2、T3、T4bdx=2、y=5、z=11ace-T1、-T2、-T3、-T4ce表7-15分支/条件覆盖测试用例图7-13例2程序流程图分支/条件覆盖分支/条件覆盖从表面来看,它测试了所有条件的取值,但是实际上某些条件掩盖了另一些条件。如:

对于条件表达式(x>3)&&(z<10)来说,必须两个条件都满足才能确定表达式为真。如果(x>3)为假,则一般的编译器不再判断是否z<10了。

对于表达式(x==4)||(y>5)来说,若x==4测试结果为真,就认为表达式的结果为真,这时不再检查(y>5)条件了。因此,采用分支/条件覆盖,逻辑表达式中的错误不一定能够查出来了。(5)条件组合覆盖针对上述问题,提出“条件组合覆盖”方法。含义:执行足够的例子,使得每个判定中条件的各种可能组合都至少出现一次。显然,满足“条件组合覆盖”的测试用例是一定满足“分支覆盖”、“条件覆盖”和“分支/条件覆盖”的。条件组合覆盖A>1,B=0

A≤1,B=0 A=2,X>1 A≠2,X>1图7-13例1程序流程图A>1&&B=0aA=2‖X>1X=X+1bdceX=X/AYYNN

后四种情况是第二个if语句的条件组合,而X的值在该语句之前是要经过计算的,所以还必须根据程序的逻辑推算出在程序的入口点X的输入值应是什么。

A>1,B≠0A≤1,B≠0 A=2,X≤1A≠2,X≤1

该图可出现下面8种条件组合:

下面设计的四个例子可以使上述8种条件组合至少出现一次:

①A=2,B=0,X=4,ace

使、两种情况出现;图7-13例1程序流程图A>1&&B=0aA=2‖X>1X=X+1bdceX=X/AYYNN1条件组合覆盖5263748

②A=2,B=1,X=1,abe

使、两种情况出现;④A=1,B=1,X=1,abd

使、两种情况出现。③A=1,B=0,X=2,abe

使、两种情况出现;条件组合覆盖上面四个例子虽然满足条件组合覆盖,但并不能覆盖程序中的每一条路径,例如路径

acd就没有执行,因此,条件组合覆盖标准仍然是不彻底。图7-14例1程序流程图A>1&&B=0aA=2‖X>1X=X+1bdceX=X/AYYNN

1、x>3,z<10记做T1T2,第一个判断的取真分支2、x>3,z>=10记做T1-T2,第一个判断的取假分支3、x<=3,z<10记做-T1T2,第一个判断的取假分支4、x<=3,z>=10记做-T1-T2,第一个判断的取假分支5、x=4,y>5记做T3T4,第二个判断的取真分支6、x=4,y<=5记做T3-T4,第二个判断的取真分支7、x!=4,y>5记做-T3T4,第二个判断的取真分支8、x!=4,y<=5记做-T3-T4,第二个判断的取假分支现对例中各个判断取条件组合:图7-13例2程序流程图条件组合覆盖根据定义取4个测试用例,就可以覆盖上面8种条件取值的组合。测试用例如下表:测试用例通过路径条件取值覆盖组合号x=4、y=6、z=5abdT1、T2、T3、T41和5x=4、y=5、z=15acdT1、-T2、T3、-T42和6x=2、y=6、z=5acd-T1、T2、-T3、T43和7x=2、y=5、z=15ace-T1、-T2、-T3、-T44和8上面的测试用例覆盖了所有条件的可能取值的组合,覆盖了所有判断的可取分支,但是却丢失了一条路径abe。表7-16条件组合覆盖测试用例发现错误的能力弱强语句覆盖每条语句至少执行一次判定覆盖每一判定的每个分支至少执行一次条件覆盖每一判定中的每个条件,分别按“真”、“假”至少各执行一次判定/条件覆盖同时满足判定覆盖和条件覆盖的要求条件组合覆盖求出判定中所有条件的各种可能组合值,每一可能的条件组合至少执行一次表7-17五种覆盖标准的对比1五种覆盖标准的对比覆盖标准程序结构举例测试用例应满足的条件语句覆盖AB=T判定覆盖AB=TAB=F表7-17五种覆盖标准的对比2覆盖标准程序结构举例测试用例应满足的条件条件覆盖A=T,A=FB=T,B=F判定/条件覆盖AB=T,AB=FA=T,A=FB=T,B=F条件组合覆盖A=TB=TA=TB=FA=FB=TA=FB=F表7-17五种覆盖标准的对比3路径测试:设计足够多的测试用例,覆盖被测试对象中的所有可能路径。下面的测试用例则可对程序进行全部的路径覆盖。测试用例通过路径A=2、B=0、X=3aceA=1、B=0、X=1abdA=2、B=1、X=1abeA=3、B=0、X=1acd

图7-13例1程序流程图A>1&&B=0aA=2‖X>1X=X+1bdceX=X/AYYNN表7-18路径测试1(6)路径测试路径测试下面的测试用例,则可对该图进行全部的路径覆盖。测试用例通过路径覆盖条件x=4、y=6、z=5abdT1、T2、T3、T4x=4、y=5、z=15acdT1、-T2、T3、-T4x=2、y=5、z=15ace-T1、-T2、-T3、T4x=5、y=5、z=5abeT1、T2、-T3、-T4表7-18路径测试2图7-13例2程序流程图

基本路径测试:将程序流程图转换为程序图,确定基本可执行路径集合,计算环形复杂度V(G),确定独立路径(一条独立路径是指,和其他的独立路径相比,至少引入一个新处理语句或一个新判断的程序通路)。V(G)值正好等于该程序的独立路径的条数。导出测试用例:根据复杂度和程序结构设计用例数据输入和预期结果。测试用例,确保基本路径集中的每一条独立路径的执行。

程序图(流图)的符号顺序结构if结构case结构while结构until结构图中的每一个圆称为流图的结点,代表一条或多条语句。流图中的箭头称为边或连接,代表控制流。图7-14程序图符号程序流程图流图程序流程图流图图7-15程序流程图和程序图对应关系流图如果判断中的条件表达式是由一个或多个逻辑运算符(OR,AND,NAND,NOR)连接的复合条件表达式,则需要改为一系列只有单条件的嵌套的判断。例如:

1,2ifaorb3x4else5y对应的程序图为:图7-16有逻辑运算符程序图

91762,38910114,5

76

231

8

41110区域:由边和节点封闭起来的。计算区域:不要忘记区域外的部分。待测试程序用流图表示的待测试程序

5

节点边区域图7-17程序流程图和程序图独立路径独立路径:至少沿一条新的边移动的路径路径1:1-11路径2:1-2-3-4-5-10-1-11路径3:1-2-3-6-8-9-10-1-11路径4:1-2-3-6-7-9-10-1-111

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论