版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章软件的质量与测试
软件工程研究室SoftwareEngineering1
主要内容
软件的质量
软件的测试目的:测试是软件质量保证中至关重要的一个环节28.1软件的质量
8.1.1软件的质量观Juran
的质量观:
产品在使用时,能适合用户需要的目标程度。ISO的质量观:“一个产品或服务是否能够满足其指定的或蕴含的需求有关的性质与特征总和”.
3
产品质量的特性质量由多种因素组成,但互不独立,
可能是冲突的,也不一定同等重要;
在一定前提下来衡量质量,不能脱离代价来衡量产品的质量.4
8.1.2软件质量因素
McCall软件质量模型(1977):
产品修改产品操作产品改型易使用性高效性正确性可靠性完整性易维护性灵活性易测试性易移植性易复用性互用性
图8-1McCall
软件质量模型5每个要素包含系列衡量标准正确性易追溯性一致性完备性从需求中找到实现能力实现了所有的功能一致的术语和技术高效性运行效率存储效率使用最少的处理时间使用最小的内存空间6易使用性输入、输出量输入、输出速度易交流培训易操作可靠性简洁性准确性一致性容错性:异常,仍能操作7易维护性一致性模块性简洁性:易理解简明性:代码少自我描述性:有解释灵活性易扩展性模块性一致性自我描述性8易测试性简洁性模块性检视:测量、识别错误能力自我描述性易移植性硬件独立性软件独立性自我描述性模块性9易复用性硬件独立性模块性通用性软件独立性自我描述性互用性数据共同性通讯共同性模块性10Boehm模型
(1978)在该模型中,软件质量的全体称为总体效用分为现存效用、易维护性指不涉及软件的修改质量因素11总体效用易维护性现存效用易修改性易理解性易测试性效率人机界面可靠性易移植性易更改性
可认性
简明性结构性自我描述性易交流性易存取性设备效率可依靠性一致性完整性准确性自我包含性硬件独立性图8-2Boehm模型12McCall和Boehm模型从用户出发的质量观为基础提出的.模型都是层次结构模型.使用模型时需根据具体情况决定质量要素的相对重要性.13软件质量要素之间的关系正确性可靠性效率完整性易使用性易维护性易测试性灵活性易移植性易复用性互用性正确性可靠性效率完整性易使用性易维护性易测试性灵活性易移植性易复用性互用性直接相关反向相关无关图8-3Perry的质量要素之间关系148.2软件测试
软件测试它既令人兴奋,也令人烦脑;既令人羡慕不己,也令人望而却步;要想在预算内按时交付高质量的软件,测试是必不可少的。158.2软件测试
软件测试概述
程序错误分类
软件测试的V模型
软件测试的方法
软件的调试
168.2.1软件测试概述
(1)什么是软件测试?
和测试接近的词:
过失
(Mistake):人为产生的不正确结果.
故障
(Fault):过失发展结果,可能导致失效.
失效
(Failure):故障引起的结果.
错误
(Error)、过错(Mistake)称bug
不正确结果的全部.
缺陷(Defect):错误的表现结果.
事故
(Incident):失效时可能呈现给用户.
测试(Test):
测试要处理错误、缺陷、失效和事故.
测试是采用测试用例执行的软件活动.
17(2)软件测试的目的
软件测试是对软件质量的度量,并代表了规约、设计和编码的最终评审.
为找出错误而运行程序或系统的过程.(Myers,1979).
测试是证明错误的存在,而不是证明错误的不存在(Dijstra)
确信程序做了它应该做的事(Hetzel,1973).
确认程序正确地实现了所要求的功能.
软件测试概述18(3)软件测试的准则#尽早地和不断地进行软件测试.#
所有的测试应能追溯到用户需求#
测试用例:由输入数据和与之对应的预期输出结果组成;包括合理的输入和不合理的输入条件.#
测试从小规模开始,逐渐扩到大规模,#
穷举测试不可能.#
测试人员,WhoPerformstheTest?#
独立测试组或SoftwareTestEngineer#
使用或开发测试工具.#
需求确定后,制定测试计划,并执行测试计划.#
测试中发现8o%错误,可能由程序的20%的组件造成的(Pareto原理)
软件测试概述19(4)软件的可测试性
程序被测试的难易程度一个特定测试集覆盖产品的充分程度软件可测试性的度量特征:
a.可操作性b.可观察性c.可控制性
d可分解性e.简单性f.稳定性
g.可理解性
软件测试概述20(5)软件测试的对象
软件测试并不等于程序测试,应贯穿于软件定义与开发的各个阶段。
测试包括:
需求规格说明概要设计规格说明详细设计规格说明源程序21软件测试对象之间关系软件需求用户:要什么需求说明书分析员:可以提供什么设计说明书设计员:让软件怎么做源程序程序员:让计算机做什么运行结果计算机:程序运行得到的结果理解正确性表达正确性理解正确性设计正确性表达正确性理解正确性编码正确性输入正确性运行正确性相符吗?图8-4软件测试对象之间关系228.2.2软件错误分类
Beizer
给出的软件错误:
抽样大小—6877000条语句(含注释)总错误数—16209个错每千条语句错误数—2.36个错23错误分类错误数百分比(%)需求错误13178.1需求不正确6494.0需求逻辑错1530.9需求不完备2241.4需求文档描述错130.1需求变更2781.7表8-1需求错误错误分类24错误分类错误数百分比(%)功能和性能错误262416.2功能和性能不正确4562.8性能不完整2311.4功能不完整1931.2适用范围错7784.8用户信息和诊断信息错8575.3异常处理错790.5其他功能错300.2表8-2功能和性能错误错误分类25错误分类错误数百分比(%)程序结构错误408225.2控制流和控制顺序错误、变量、分支、循环等问题207812.8处理器错200412.4表8-3程序结构错误错误分类26错误分类错误数百分比(%)数据错误363822.4数据类型定义,引用及结构错180511.1数据存取及处理错183111.3其他数据错(比较、计算、精度、零为除数)2表8-4数据错误错误分类27错误分类错误数百分比(%)编码与实现错误16019.9编码与程序输入错误3322.0违反编程标准或风格3182.0文档错9605.9其他实现错10.0表8-5编码与实现错误错误分类28错误分类错误数百分比(%)软件集成错误14559.0内部接口错8595.3外部接口,时间吞吐量不匹配5183.2其他集成错780.5系统及软件结构错2821.7表8-6软件集成错误错误分类29错误分类错误数百分比(%)测试定义和执行错误4472.8测试设计错110.1测试执行错3552.2测试文档错110.1测试用例不充分640.4其他测试错误60.0其他错误
(定时和协调,性能,故障恢复,不付合标准)7634.7表8-7测试定义和执行错误错误分类308.2.3软件测试的V模型模块规约系统结构与子系统规约用户需求分析规约确定系统设计详细设计模块实现规约用户需求用户要求用户接受测试系统测试系统集成子系统集成与测试模块测试模块代码测试后的模块测试后子系统集成的系统检验过的系统交付的系统图8-5软件测试的V模型318.2.4软件测试的分类
(1)
按实施步骤分:(2)
按测试对象分:单元测试--软件单元测试组装测试--软件部件测试确认测试--软件配置项测试系统测试--系统测试(3)
按使用的测试技术分:静态测试:动态测试:白盒测试、黑盒测试32软件测试的分类
(4)按软件组装策略分:
(5)按测试的完整性分:
--增量测试--完全性和连续性测试
自顶向下
--图路径测试
自底向上
--程序路径测试
三明治
--穷举测试
--非增量测试33软件测试的分类
(6)按项目测试条目分:
--
功能测试--恢复性测试
--性能测试--敏感性测试
--接口测试--安装性测试
--强度测试--协调性测试
--安全性测试--人机界面测试
--可靠性测试
348.2.5软件测试技术软件测试技术静态测试动态测试黑盒测试白盒测试功能测试结构测试图8-6软件测试技术分类35静态测试(代码会审/走查/办公桌)
数据引用错(使用未赋值的变量)
数据说明错(类型不符错)
数据计算错(混合类型,零为除数)
数据比较错(运算符、逻辑符不符)
控制流错(循环初值、次数不对)
接口错输入输出错文件错检查:36表8-8黑盒测试与白盒测试
黑盒(功能)测试白盒(结构)测试只利用规格说明标识测试用例只利用程序源代码标识测试用例如果程序实现了未描述的行为,功能测试无法意识到。如果已描述的行为未能实现,结构性测试无法意识到冗余度大,可能会有漏洞具有覆盖率指标动态测试37
任何程序都可以看作是将输入定义域取值映射到输出值域的函数。将系统看成“黑盒”。也称黑盒测试软件InputOutput1)
功能测试(FunctionTesting)图8-7黑盒测试38
证实每个实现了的功能是否符合需求规格说明书的要求。
黑盒测试要在软件的接口处进行.目的:39黑盒测试可以发现如下错误:
是否有不正确或遗漏的功能?在接口上,输入能否被正确地接受?能否输出正确的结果?是否有数据结构错误或外部信息
(例如数据文件)访问错误?性能上是否能够满足要求?是否有初始化或终止性错误?40功能测试的方法:
等价类分析边界值分析错误推测法因果图法随机测试基于决策树的测试41(1)等价类(Equivalencepartitioning)
把输入的数据按有效的和无效的划分为若干个等价类.
不考虑程序的内部结构,只依据程序的规格说明来设计测试用例.
42
等价类概念等价类:
等价类是指某个输入域的子集合。在该子集合中,各个输入数据对于揭露程序中的错误都是等效的.
有效等价类:对于程序规格说明,是合理的,有意义的输入数据构成的集合。
无效等价类:是指对于程序规格说明,是不合理的,无意义的输入数据构成的集合.功能测试43等价类划分的原则:
按区间划分
按数值划分按数值集合划分
按限制条件或规则划分
功能测试44测试用例={测试数据十期望结果}
测试结果={测试数据十期望结果十实际结果}
在确立了等价类之后,建立等价类表,列出所有划分出的等价类数据十期望结果确立测试用例功能测试等价类划分
………
……………….无效等价类有效等价类输入条件表8-9划分出的等价类45
输入条件有效等价类无效等价类标识符个数
1个(1)多个(2)
0个(3)标识符字符数
1—8个(4)0个,>8个,>80个
(5)
(6)(7)标识符组成
字母(8)
数字(9)
非字母数字字符(10)
保留字(11)第一个标识符字母(12)非字母(13)标识符使用先说明后使用
(14)
未说明已使用(15)表8-10标识符的等价类划分例1为标识符划分等价类46测试用例:
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(7)>80VART$:CHAR;(10)VARGOTO:INTEGER;(11)VAR2T:REAL;(13)VARPAR:REAL;(15)47
三角形问题的等价类测试用例
对于三角形问题,可能由四种输出:
三角形
不等边三角形等腰三角形等边三角形根据四种输出标识输出(值域)等价类。例248表8-11三角形问题的等价类测试用例测试用例ABC预期输出WN1555等边三角形WN2223等腰三角形WN3345不等边三角形WN4412不构成三角形49表8-12三角形问题的等价类测试用例b取值不在所允许的范围内abc取值不在所允许的范围内测试用例abc预期输出SR1a取值不在所允许的范围内5c取值不在所允许的范围内ab取值不在所允许的范围内
bc取值不在所允许的范围内ac取值不在所允许的范围内
SR2SR3SR4SR5SR6SR75-15-1-15-1-1-1-1-155555-1-1-1-1-150
NextDate函数等价类测试
NextDate是一个三个变量函数:月、日、年这些变量的有效区间:M1={月份:1月份12}D1={日期:1日期31}Y1={年:1812年2012}例351NextDate函数等价类测试
无效等价类M1={月份:月份<1}M1={月份:月份>12}D1={日期:日期<1}D1={日期:日期>31}Y1={年:年<1812}Y1={年:年>2012}52表8-13NextDate函数等价类测试表用例ID月份日期年预期输出SR1-1151912月份,日期不在有效值域SR26-11912日期不在有效值域1...31中SR36151811年,日期不在有效值域中SR4-1-11912月份,日期不在有效值域中SR56-11811年,日期不在有效值域中SR6-1151811年,月份,日期不在有效值域SR7-1-11811年,月份,日期不在有效值域53确定等价类的原则小结(1)
如果输入条件规定了取值范围,或者值的个数,则可以确定一个有效等价类和两个无效等价类;如果输入条件规定了输入值的集合,或者是规定了“必须如何”的条件,则可以确立一个有效等价类和一个无效等价类;如果输入条件是一个布尔量,则可以确立一个有效等价类和一个无效等价类;54确定等价类的原则小结(2)
如果规定了输入数据必须遵守的规则,则可以确立一个有效等价类(即遵守规则的数据)和若干无效等价类(从不同角度违反规则的数据);如果确知以划分的等价类中的各元素在程序中的处理方式不同,则应进一步划分成更小的等价类
55选择测试用例的原则:
设计尽可能少的测试用例,覆盖所有的有效等价类.
针对每一个无效等价类,设计一个测试用例来覆盖它.等价类划分56(2)边界值法(BoundaryValueAnalysis)
把测试值选在等价类的边界上.
abcd错误可能出现在输入变量的极值附近。功能测试图8-8边界值测试法57边界值测试abcd5个元素情况:
最小值略高于最小值正常值略低于最大值最大值
n个变量,有4n+1个测试用例
图8-9边界值测试法58边界值健壮性测试
对例外情况的测试abcd在5个元素基础上增如:略高于最大值略低于最小值图8-10边界值测试法59例三角形问题
输入:三角形的三条边a、b、c三个整数输出:由这三条边确定的三角形类型:等边三角形、等腰三角形、不等边三角形或非三角形.整数a、b、c必须满足以下条件:
c1:1a200;c2:1b200c3:1c200;c4:a<
b+cc5:b<
a+c
;
c6:c<
a+b60
如果输入值没有满足上述条件中的一个,则程序应该输出故障信息如果a、b、c满足c1、c2、c3则给出以下四种相互排斥输出中的一个:如果三边相等,则程序输出是等边三角形;如果恰好由两边相等,则程序输出是等腰三角形;如果没有两边相等,则程序输出不等边三角形;如果c4、c5、c6有一个条件不满足,则程序的输出是非三角形;
61三角形程序的具体实现(1)Programtriangle‘StructuredprogrammingversionofsimplerspecificationDima,b,cAsIntegerDimIsATriangleAsBoolean‘Step1:GetInputOutput(“Enter3integerwhicharesideofatriangle”)Input(a,b,c)Output(“SideAis“,a)Output(“SideBis“,b)Output(“SideCis“,c)62‘Step2:IsAtriangleIf(a<b+c)AND(b<a+c)AND(c<a+b) ThenIsATriangle=TRUEElseIsATriangle=FALESEndIf63‘Step3:DetermineTriangleTypeIfIsATriangle
ThenIf(a=b)AND(b=c) ThenOutput(“Equilateral”) ElseIf(ab)AND(bc) ThenOutput(“Scalene”) ElseOutput(“Isosceles”)
EndIf
EndIf Elseoutput(“NotaTriangle”)EndIfEndtriangle64三角形程序的具体实现(2)Programtriangle2‘StructuredprogrammingversionofimprovedspecificationDima,b,cAsIntegerDimIsATriangleAsBoolean‘Step1:GetInputDoOutput(“Enter3integerwhicharesideofatriangle”)Input(a,b,c)c1=(1<=a)AND(a<=200)c2=(1<=b)AND(b<=200)c3=(1<=c)AND(c<=200)65IfNOT(c1) ThenOutput(“Valueofaisnotintherangeofpermittedvalues”)EndIfIfNOT(c2) ThenOutput(“Valueofbisnotintherangeofpermittedvalues”)EndIfIfNOT(c3) ThenOutput(“Valueofcisnotintherangeofpermittedvalues”)EndIfUntilc1ANDc2ANDc3Output(“SideAis“,a)Output(“SideBis“,b)Output(“SideCis“,c)66‘Step2:IsAtriangleIf(a<b+c)AND(b<a+c)AND(c<a+b) ThenIsATriangle=TRUEElseIsATriangle=FALESEndIf67‘Step3:DetermineTriangleTypeIfIsATriangle
ThenIf(a=b)AND(b=c) ThenOutput(“Equilateral”) ElseIf(ab)AND(bc) ThenOutput(“Scalene”) ElseOutput(“Isosceles”)
EndIf
EndIf Elseoutput(“NotaTriangle”)EndIfEndtriangle268基本思想:
列举出程序中所有可能有的错误和容易发生错误的特殊情况,根据它们选择测试用例.
利用经验确定程序中容易出错的地方。(3)错误推测法功能测试69例对排序程序进行测试
边界值法
-输入表为空
-输入表中仅有一个数据
-输入表为满表
错误猜测法
-输入表已排好序
-输入表的排序与要求的顺序相反
-输入表中的所有数据全部相同70(4)因果图(Cause-EffectGraphing)
借助图形来设计测试用例的一种方法.
用于被测程序具有多种输入条件,而输出又依赖于输入条件的各种组合情况.
因果图方法最终生成的就是判定表。功能测试71因果图中的基本符号Ci表示原因,Ei表示结果。各结点表示状态,“0”---状态不出现,“1”---状态出现.CiEi恒等CiEi非C1EiC2或C1EiC2与图8-12因果图基本符号72表示约束条件的因果图符号EabE(互斥、排他)IabI(包含、或)cOabO(唯一)RabR(要求)MabM(屏蔽)图8-13表示约束条件的因果图符号73例
利用因果图设计测试用例饮料自动售货机软件测试用例。售1杯饮料单价5角.若投入5角钱或1元钱的硬币,按下橙汁或啤酒的按钮,则饮料流出.若售货机没有零钱找,则显示一个零钱找完的红灯亮,这时若投入1元钱硬币并按下按钮,则不仅不送出饮料而且退出1元钱;若有零钱找,则显示零钱找完的红灯灭,并在送出饮料的同时退还5角硬币。74自动售货机软件测试用例原因结果1.售货机有零钱找21.售货机零钱找完红灯亮2.投入1元硬币22.退还1元硬币3.投入5角硬币23.退还5角硬币4.按下橙汁按钮24.送出橙汁饮料5.按下啤酒按钮25.送出啤酒饮料75自动售货机软件测试用例
中间状态11.投入1元硬币且按下饮料按钮12.按下橙汁或啤酒按钮13.应当找5角钱且售货机有零钱找14.钱已付清76按下橙汁按钮12345售货机有零钱找投入1元硬币投入5角硬币按下啤酒按钮2122232425售货机零钱找完红灯亮退还1元硬币找回5角硬币送出橙汁饮料送出啤酒饮料E11131412E该找5角可找5角按下按钮钱已付清图8-14自动售货机的因果图77
因果图方法生成测试用例的步骤:
找出软件规格说明中的原因(输入条件或输入条件的等价类),及由原因引起的结果(即输出条件动作).b.分析软件规格说明描述中的语义,找出原因与结果之间,原因与原因之间对应的是什么关系?根据这些关系画,出因果图.
78因果图方法生成测试用例的步骤:c.由于语法或环境限制,有些原因与原因之间,原因与结果之间的组合情况不可能出现。为表明这些特殊情况,在因果图上用一些记号标明约束或限制条件.d.把因果图转换成判定表.e.把判定表的每一列拿出来作为依据,设计测试用例.79(5)综合策略的测试方法Myers提出了使用各种测试方法的综合策略:-任何情况下都必须使用边界值分析方法。必要时用等价类划分法补充一些测试用例.
用错误推测法再追加一些测试用例.
如果程序的功能说明中含有输入条件的组合情况,则一开始就可选用因果图法.
测试用例的逻辑覆盖程度要达到要求的覆盖标准.
80(6)穷举测试
是不可能的
对于黑盒测试来讲,最简单程序,设A、B、C都是整形变量,在字长为32位的计算机上运行,则输入数据的可能性有232x232=264种,如果这个程序执行一次需1ms,则所有的组合完全测试一次将需要5亿年。ProgramABCc81功能性测试
方法优点:与软件如何实现无关,如果实现发生变化,测试用例仍然有用;测试用例开发可以与程序的实现并行进行.
方法缺点:测试用例之间可能存在严重的冗余;存在测试的不彻底性.822)结构测试(白盒测试)
测试软件产品的内部操作,是否符合设计规格要求.
主要对程序模块进行如下的检查:
对模块的每一个独立的执行路径至少测试一次.
对所有的逻辑判定的每一个分支,
(真与假)都至少测试一次.
在循环的边界和运行界限内执行循环体.
测试内部数据结构的有效性.83结构测试方法语句覆盖判定/分支覆盖条件覆盖条件组合覆盖逻辑覆盖:基本路径测试条件测试数据流测试循环测试控制结构测试:84
(1)语句覆盖
每一可执行语句至少执行一次.
Procedureexample(a,b:real;VarX:real)
beginif(a>1)and(b=0)thenS1elses2end例逻辑覆盖85(a>1)∧(b=0)S1FTStartS2End图8-15程序流程图语句覆盖是最弱的覆盖。86
(2)判定覆盖
被测程序中每一个分支至少被执行一次.
(3)
条件覆盖被测程序判定语句中的每一个条件均按“真”、“假”两种取值,至少被执行一次.(4)条件组合覆盖判定和条件组合(对于每一个判定,要求所有可能的条件取值的组合都必须取到).
87
覆盖种类
满足条件
测试数据
期望结果
判定覆盖
A>1,B=0A>1,B≠0或
A≤1,B=0或
A≤1,B≠0
A=2,B=0A=2,B=1或
A=1,B=0或
A=1,B=1执行S1
执行S2
条件覆盖
A>1或B=0或
A≤1或B≠0
A=2,B=0A=1,B=1执行S2条件组合覆盖
A>1,B=0A>1,B≠0A≤1,B=0A≤1,B≠0
A=2,B=0A=2,B=1A=1,B=0A=1,B=1
执行S1
执行S2
执行S2
执行S288例流程图L1(ace)L2(abd)
L3(abe)L4(acd)Start(a>1)∧(b=0)
X=X/aFTabc(a=2)∨(X>1)
X=X+1FTdeEnd选择L1设计测试用例[a,b,X]:{[2,0,4],[2,0,3〕}图8-16程序流程图89
判定覆盖
如果选择路径L1和L2(或L3和L4)可实现判定覆盖,测试用例为:
[a,b,X]:{[2,0,4],[2,0,3]}覆盖L1
[a,b,X]:{[1,1,1],[1,1,1]}覆盖L2[a,b,X]:{[2,1,1],[2,1,2]}覆盖L3[a,b,X]:{[3,0,3],[3,1,1]}覆盖L490条件覆盖表8-14条件覆盖表91表8-15条件组合覆盖92
(5)路径覆盖测试
(TomMcCabe提出)
设计足够的测试用例,覆盖程序中所有可能的路径.表8-16路径覆盖控制结构的测试93
程序图符号顺序语句If语句While语句Until语句case语句路径测试图8-17程序图符号94
流程图与流图对应1368754291011图8-18流程图与程序图12,34567109811节点边边R1R2R3R4区域路径测试95
程序对应的程序(流)图Procedure:sort1:dowhilerecordsremainReadrecord2:ifrecordfield1=03:thenprocessrecord;Storeinbuffer;Incrementcounter;4:Elseifrecordfield2=05:Thenresetcounter;6:Elseprocessrecord;Storeinfield7a:endif
endif7b:enddo8:end123467b7a58R1R2R3R4路径测试图8-19程序与程序图96AND、NAND、OR、NOR
. . .IfaORbThenprocedurexElseprocedurey
EndIfabxyx
逻辑组合条件情况路径测试图8-20逻辑组合条件流图97
逻辑组合条件情况
. . .IfaANDbThenprocedurexElseprocedureyEndIf路径测试图8-21逻辑组合条件流图aybyx98流图中的独立路径包括:1。1—112。1—2—3—4—5—10—1—113。1—2—3—6—7—9—10—1—114。1—2—3—6—8—9—10—1—11而:
1—2—3—4—5—10—1—2—3—6—8—9—10—1—11就不是独立路径。1234567109811R1R2R3R4
程序的环路复杂性
独立路径:没有处理过的语句或条件的一组路径。
图8-22复杂环路流图99
根据图求出环路复杂性
环路复杂性V(G)=判断节点
+1
或
V(G)=基本路径的个数基本路径并不是唯一的,对于给定的流图,可以得到不同的基本路径.路径测试100例1求平均值本程序要求计算不超过100个数字的平均值;同时计算总和与有效数字个数。minimum<Input.valid<maxinum输入为有效数字;否则为无效数字.如果输入为-999,则表示输入停止。路径测试101procedureaverageTYPEvalue[i:100]ISSCALARARRAYTYPEaverage,total.input,total.valid,minimum,maxinum,sumISSCALARTYPEiISIntegeri=1;total.input=total.valid=0;sum=0;DOWHILEvalue[i]<>-999ANDtotal.input<100 incrementtotal.inputby1; IFvalue[i]>=minimumANDvalue[i]<=maxium THENincrementtotal.validby1; sum=sum+value[i] ELSEskip ENDIF incrementiby1;ENDDO123987654102IFtotal.valid>0 THENaverage=sum/total.valid; ELSEaverage=-999ENDIFENDaverag出控制流图13121110987654321V(G)=6个区域V(G)=5个判断节点+1=6V(G)=17条边-13个结点
+2=6图8-23求平均值流图104根据环路复杂性导出基本路径Path1:1--2--10--11--13path2:1--2--10--12--13path3:1--2--3--10--11--13path4:1--2--3--4--5--8--9--2……path5:1--2--3--4--5--6--8--9--2……path6:1--2--3--4--5--6--7--8--9--2……105准备测试用例Path1:输入数据:value[k]=有效数据,限于k<ivalue[i]=-999,当2<=i<=100.输出结果:n个值的正确的平均值,正确的总计数;Path2:输入数据:value[1]=-999预期结果:平均值=-999,总计数取初值。106准备测试用例Path3:试图处理101个或更多的值,而前100个应当是有效的值。预期输出:n个值的正确的平均值,正确的总计数;Path4:输入数据:value[i]=有效输入,且i<100value[k]<最小值,当k<=i时.预期输出:n个值的正确的平均值,正确的总计数;107准备测试用例Path5:输入数据:value[i]=有效输入,且i<100value[k]<最小值,当k<=i时.预期输出:n个值的正确的平均值,正确的总计数;Path6:输入数据:value[i]=有效输入,且i<100预期输出:n个值的正确的平均值,正确的总计数;108开始读入成绩表,读入numnum<>0印出“未找到”查找结束在上半部分?找到所查学号?读入下一numfirst,last,middle赋初值打印分数重算middle调整first调整last结束内FTTFTFTF(a)流程图
外12345678910acbdefghlnmq(b)程序图例2成绩查询图8-24成绩查询流程图与程序图109simpleloopnestedloops(6)循环体测试循环体类型零次循环一次循环二次循环m次循环m-1,m+1
次循环从内层循环开始测试,所有其他循环设为最小值内层循环使用简单循环测试方法,
外层循环迭代参数取最小值.
为越界值或非法值增加测试由内向外对每一个循环测试,外层循环取最小值.110图8-25循环体类型concatenatedloopsUnstructured
loops改造结构若两个循环完全独立用简单循环测试方法否则,用嵌套循环测试方法
111(7)数据流测试
数据的定义与引用关系的测试数据间交互作用的测试结构性数据和动态数据测试过程间的数据流112路径测试步骤小结
使用路径测试技术设计测试用例的步骤如下:
根据过程设计结果画出相应的流图
计算流图的环形复杂度
确定现行独立路径的基本集合
设计可强制执行基本集合中每条路径的测试用例113选择任何一种测试方法意味着
选择一种风险!
穷举是最安全、最全面的方法,但是不可能。任何一种方法的选择,都将面临着不完全、不安全。为此,不得不选择一种或多种方法。114
单元测试集成测试确认测试系统测试8.2.6软件测试步骤115软件测试的分类
在不同的测试步骤中采用不同的测试技术单元测试黑盒测试、白盒测试、静态测试集成测试黑盒测试、白盒测试、静态测试、增量测试确认测试黑盒测试、静态测试系统测试黑盒测试、表8-17测试步骤与测试技术结合116软件测试的分类
测试步骤和测试类别:集成测试接口测试确认测试功能测试、性能测试、人机界面测试系统测试可靠性测试、强度测试…………表8-18测试步骤和测试类别结合117(1)单元测试单元测试单元测试单元测试单元测试单元测试错误或缺陷跟踪测试步骤118
单元测试的内容及环境接口局部数据结构边界条件独立的路径、循环路径错误处理驱动模块被测模块桩模块桩驱动器驱动器驱动器驱动器驱动器测试用例桩模块图8-27单元测试的内容及环境119驱动模块:为被测模块提供数据驱动程序A驱动程序B驱动程序C驱动程序D调用从属模块从表或外部文件中传送参数显示参数兼有驱动程序B、C的功能表示传送的参数信息120桩模块:只做少量的数据操作模块A显示跟踪信息模块A显示传递信息模块A从一个表或外部文件返回一个值模块A进行一项表查询根据输入参数返回输出参数121
单元测试方法
检查代码代码审查数学方法完全测试语句测试路径测试122(2)集成测试
a)集成测试考虑的问题:模块接口的数据是否会丢失组合后的子功能,能否达到预期要求的父功能模块的功能是否会相互产生不利的影响全局数据结构是否有问题模块的误差累积是否会放大单个模块的错误是否会导致数据库错误测试步骤123
b)集成测试的集成方式
FEDCBABADCEFECd1FFd2Bd3d4d5Ds5s4s3A一次成功的可能性不大;很难定位发现的错误;查错和改错的工作量大;无法确定接口的模块错误.
一次性集成方式:E图8-28一次性集成124
增殖式集成方式
自顶向下集成--深度优先:A、B、E、C、D、F
—广度优先:A、B、C、D、E、F集成方式As1s2s3s3s3Bs2AEs2BAs3CBAES5EDCBAFEDCBAs4加入D图8-29加入B加入E加入C测试A采用回归测试加入F自顶向下集成125
增殖式集成方式
-自底向上集成
-混合增殖式测试
(三明治测试,SandwichTesting)
自底向上-自顶向下结合测试.回归测试
调用图(有向图)的集成成对节点集成、相邻节点集成
基于路径的集成集成方式126
c)接口测试
接口类型:
参数接口、共享内存接口、程序接口、消息传递接口
测试内容:
参数类型、顺序等,
调用方式、共享数据,
强度.
127
d)集成测试文档大纲I.测试范围
1.对模块n的测试描述II.测试计划
2.
额外软件的描述
A.测试阶段和结构
3.
期望的结果
B.组装进度
C.
测试环境
C.额外的软件
1.
特殊的工具和技术
D.环境和资源
2.额外的软件描述III.测试过程n
D.
测试用例数据
A.组装顺序
E.
建立n所期望的结果
1.
目的IV.实际的测试结果
2.要测试模块V.参考文献
B.对结构中模块单元的测试VI.
附录128(3)确认测试
验证软件的有效性(功能、性能等)测试步骤选择测试人员有效测试用例实际运行测试软件计划用户文档开发文档源程序文档支持环境有效性测试专家鉴定会管理机构裁决软件配置审查软件配置测试报告交用户运行维护图8-30确认测试过程129确认测试
-有效性测试(功能测试)用黑盒测试方法,验证被测软件是否满足需求规格说明中列出的需求.
测试其它软件需求,如可移植性、兼容性、出错自动恢复等.
软件配置复查保证软件配置的所有成分齐全,质量符合要求,具有维护阶段必需的细节.130确认测试
-验收测试
验收测试是以用户为主的测试。使用用户界面输入测试数据,并分析测试的输出结果.一般使用实际数据进行测试。
α测试由一个用户在开发环境下进行的测试.
评价软件产品的功能、可使用性、可靠性、性能和支持,尤其注重产品的界面和特色
β测试多个用户在一个或多个用户的实际使用环境下进行的测试。开发者通常不在测试现场.
衡量产品功能、可使用性、可靠性、性能。着重于产品的支持性,包括文档、客户培训和支持产品生产能力等.
131(4)系统测试
测试的种类:
设计评审代码审查功能测试结构测试回归测试可靠性测试性能测试恢复测试强度测试配置测试安全测试启动/停止可使用性可支撑性互联测试兼容性容量测试安装测试文档测试测试步骤1328.2.7软件的调试
(1)调试的目的确定程序中可疑错误的确切性质和位置;
对程序(设计,编码)进行修改,排除错误.(2)调试的方法
以分析为主,强调思考强行排错回溯法排错归纳法排错演绎法排错133图8-31归纳、演绎纠错法开始收集错误症状提出假想错误归纳症状找到真实错误测试纠错证明假想错误结束YYNN(a)归纳纠错法开始罗列可能的病因有余下病因?排除矛盾的病因确定真实病因测试纠错能证实病因有能无不能(b)演绎纠错法结束134(3)确定错误的性质和位置的原则:用头脑去分析思考与错误征兆有关的信息.避开死胡同.把调试工具当做辅助手段来使用.避免用试探法,最多只能把它当做最后手段.(4)修改错误的原则:在出现错误的地方,很可能还有别的错误.修正一个错误的同时,有可能会引入新的错误.修改错误的过程将迫使人们暂时回到程序设计阶段.修改源代码程序,不要改变目标代码.
软件的调试135
(5)改错的辅助手段
设置显示输出,打印语句写记录文件使用工具:CodeAnalysisToolsTestExecutionToolsTestCaseGenerators136(6)排错实践经验
好线索,简单错误经验1:寻找熟悉的模式如出现超范围的存储器访问;
出现特别大的整数;特大特小的整数浮点数;
忘记对全局变量的初始化等等.
经验2:检查最近的改动经验3:不要两次犯同样的错误经验4:现在排除,而不是以后经验5:取得堆栈轨迹137
失败位置的源程序行号,堆栈追踪中屡次出现的部分都是最有用的排错信息;
不应出现的参数值如空指针,应是很小的整数值现在却特别大,应是正值现是负值,字符串里的非字母字符等等.
如对一个整数组排序,应该用整数比较函数
icmp调用qsort:
int
arr[N];
qsort(arr,N,sizeof(arr[0],icmp);无意中把字符串比较函数传进去:?int
arr[N];
?qsort(arr,N,sizeof(arr[0],scmp);138
编译无法发现这类错误,灾难就发生了.程序运行时会垮台,它访问非法的存储器地址。运行排错系统产生的堆栈追踪是:0strcmp(0x1a2,0x1c2)[“strcmp.s”:311scmp(p1=0x10001048,p2=0x1000105c)[“badqs.c”;13]2sst(0x10001048,0x10001074,0x400b20,0x4)[“qsort.c”:147]3qsort(0x10001048,0x1c2,0x4,0x400b20)[“qsort.c”:63]4main()[“badqs.c”:45]5–istart()[“crtltinit.s”:13]
程序死在strcmp里,送给strcmp的两个指针都特别小,
这是出毛病的的一个明确标志.堆栈追踪给出每个函数调用的源程序行号,在测试程序badqs.c里的第13行是;returnstrcmp(v1,v2);
失败的调用,矛头直指错误.
139无线索,难办的错误经验6:把错误弄成可重现的.经验7:分而治之
导致程序失败的输入弄得更小一点,或用二分检索的方式丢掉一半输入,检查输出.经验8:研究错误的计数特性如拼写错误,字符丢失.经验9:显示输出,使搜索局部化
显示更多信息,验证你对程序的理解.经验10:写自检测代码140经验11:写记录文件
记录垮台前发生的情况.
保证做了I/O缓冲区刷新,使最后的记录也能出现在记录文件里.
像printf一类的输出函数通常对输出采用缓冲方式,提高打印效率。在程序非正常终止时,位于缓冲里的输出信息可能就被丢掉了.
在C语言里调用一次函数fflush,就能保证把缓冲区里的数据写出去.C++和Java语言对输出流也有与fflush类似的函数.
标准库函数setbuf和setvbuf用于做缓冲控制,
调用setbuf(fp,NULL)将关闭对于流fp的缓冲.141
标准错误流(stder.cerr和System.err)的默认方式一般都不是缓冲的.经验11:画一个图
图形帮助理解数据结构特别有效.
最后的手段经验12:以步进方式遍历程序
概念性的错误却很简单,如运算符优先级,
用错了运算符,程序缩写形式与实际结构不符,作用域错误,局部变量与全局变量同名,全局变量侵犯了一个局部作用域,编辑之后遗留下某些东西,
草率的输入,参数次序错又恰出现在类型无法发现的地方,你不知全局变量或共享变量被修改.142
算法或数据结构里存在致命缺陷.
如用一组链接表操作函数来建立新元素,将它们链接在表的前面或后面,等等.
也写一个测试程序,如:
?While(scanf(“%s%d”,name,&alue)!=EOF){?P=newitem(name,alue);?list1=addfront(list1,p);?List2=addend(list2,p);?}?For(p=list1;p!=NULL;p=p->next)?printf(“%s%d,p->name,p->value);143在第1个循环里,结点p被同时放进两个表里,打印时,指针己被觉得乱七八槽了.
这种情况下,排错比较困难.错误出现在测试代码里.
注意,了解整个程序的结构,顺着程序的实际工作流程,而不是头脑里设想的流程.144经验13:偶然也会遇到这种情况
问题确实出现在编译系统,或者库,或者操作系统,计算机硬件,环境里刚刚换过的什么东西.
如,很久前一个程序运行在一个双处理器上.程序中表达式1/2的计算结果有时为0.5,有时为0.7432.
其原因是一个处理器的浮点单元有毛病.
又如:电路板松了,当机器发热时,电路板从插槽翘出,使更多的数据位与底板断开,导致浮点计算低位出错.145经验14:不可重现的错误
根据信息本身,找出非确定性行为
有的错误不是算法本身的问题,而是有些代码以某种方式使用了什么信息,这些信息在每一次程序运行时又可能是不同的.
出现某个随机值--检查所有变量是否都正确地进行了初始化.增加排错代码之后错误的行为改变了,甚至消失
--可能是一个存储分配错.排错代码加入后,
改变了存储安排,也可能改变了存储的行为.
如输出函数,从printf到对话窗口,在工作过程中都要分配存储,可能把水搅混.146
一个程序对某人能工作,而对另一个人则不行
--是某些东西依赖于外部环境(程序需要读的文件、环境变量、命令的查找路径、各种默认的东西和启动文件等)经验15:其他人的程序错误147小结带着一种好心情,排错也是件愉快的事情,就像是解一个迷题.排错也是一种艺术,要去实践它.
书写良好的代码一开始包含的错误就比较少,剩下的错误也比较容易查清楚.
看到了一个程序,应考虑出错的可能线索:
错误从何来?熟不熟…
若无法发现好的线索,思考,缩小错误范围,分而治之。借助其他力量,排错工具。了解自己,易犯什么错误。148
(6)什么时候停止测试
判断系统故障数上升?还是下降?
故障注入(FaultSeeding)
用于估计一个程序中故障数量的技术基本方法:一人向程序中注入故障,
另一个人查找故障.
设:S为种植的故障数
有:S/s=N/ns为测试中找到的种植的故障数
N=S*n/sN为程序中总的故障数
设:S=100,
n为测试找到非种植故障数
s=50,n=20
缺点:种植的故障类型难以确定.
则:N=40个故障
149
改进的方法:
设两个小组测同一个程序
x:Grop1发现的故障数
y:Grop2发现的故障数
q:共同发现的故障数q≤x,q≤yn:程序总故障数组1发现了组2发现的y个故障中的q个故障组1测试效率E1=x/n,E1=x/n=q/y
组2测试效率E2=y/n,E2=y/n=q/x
所以,n=q/(E1*E2)
设:x=25,y=30,q=15
则:n=50(程序中约有50个故障)150
1.测试代码的边界情况
检查条件所导致的分支是否正确;
检查循环实际执行的次数是否正确;
检查不存在或空的输入;
检查单个输入项;
检查一个正好填满了的数组;等等.
观点:大部分错误都出现在边界上测试实例编程过程中测试151
测试代码的边界情况
模拟fgets,读入一些字符,直到迂到一个换行或缓冲区满了.
inti;
chars[MAX];
for(i=0;(s[i]=getchar())!=‘\n’&&i<MAX-1;++i)
;
s[--i]=‘\0’;第1个边界测试:
读入一个空行,一开始就是个换行符.结果如何?152循环在第1次重复时就结束了,这时i=0最后一行代码i值减小到-1,并把一个空字节写入s[-1]在数组开始之前,通过边界测试发现错误重写循环,用字符填充数组的方法:for(i=0;i<MAX-1;i++)if((s[i]=getchar())==‘\n’)break;
s[i]=‘\0’;
153重复前面边界测试,对只有一个换行字符的行,程序能正确处理.i=0,第1个输入字符跳出循环,而‘\0’
被存入s[0]中
对一个或两个字符之后是换行符的输入做类似检查,在接
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 文化经纪人创新方法考核试卷含答案
- 黑龙江省齐齐哈尔市龙江县多校联考2025-2026学年七年级上学期10月月考数学试卷(含解析)
- 舞蹈教育模拟试题和标准答案
- 2月阶段测试题及答案出炉
- 2026年春招:字节跳动面试题及答案
- 陕西农业练习题及答案分享
- SQL常见面试试题及答案解析
- 编创展示《跳起我们的日喀则》教学设计-2026-2027学年新苏少版(简谱)小学音乐四年级上册
- 试卷试题大盘点及答案揭秘
- 电气入门必做试题与答案分享
- AQ 3026-2026《化工企业设备检修作业安全规范》解读课件
- 泥瓦工简单施工方案(3篇)
- 门诊部医疗安全工作制度
- JJF 1221-2025 汽车排气污染物检测用底盘测功机校准规范
- 学习通《能源中国(上海电力大学)》2024章节测试答案
- 围手术期应激反应的调控机制
- 碳汇知识教学课件
- 塔式起重机定期维护保养记录表模板
- 产品国际市场准入考试题及答案
- 临汾市社区工作者招聘笔试真题2024
- 2025年高考地理答题技巧与模板模板05 人口和城市(答题模板)(含答案或解析)
评论
0/150
提交评论