【文档说明】第七讲软件测试课件.ppt,共(99)页,458.298 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-45237.html
以下为本文档部分文字说明:
第七讲软件测试软件测试是在软件投入运行前,对软件需求分析,设计规格说明和编码的最终复审,是软件质量保证的关键步骤。定义:软件测试是为了发现错误而执行程序的过程。或者说软件测试是根据软件开发各阶段的规格说明和程序的内部结构而精心
设计一批测试用例,并利用这些测试用例去运行程序,以发现程序错误的过程。软件测试的定义••软件测试的基础•软件测试的目的•软件测试的原则•测试与软件开发各阶段的关系软件测试的目的•基于不同的立场,存在着两种完全不
同的测试目的。•从用户的角度出发,普遍希望通过软件测试暴露软件中隐藏的错误和缺陷,以考虑是否可接受该产品。•从软件开发者的角度出发,则希望测试成为表明软件产品中不存在错误的过程,验证该软件已正确地实现了用户的要求,确立人们对软
件质量的信心。Myers软件测试目的(1)测试是程序的执行过程,目的在于发现错误;(2)一个好的测试用例在于能发现至今未发现的错误;(3)一个成功的测试是发现了至今未发现的错误的测试。•换言之,测试的目的是–系统地找出软件中潜在的各种错误和缺陷。–能够证明软件的功能和性能与需求说明相符合
。–测试不能表明软件中不存在错误,它只能说明软件中存在错误。软件测试的原则1.应当把“尽早地和不断地进行软件测试”作为软件开发者的座右铭。2.测试用例应由测试输入数据和对应的预期输出结果这两部分组成。3.程序员应避免检查自己的程序。4.在
设计测试用例时,应当包括合理的输入条件和不合理的输入条件。5.充分注意测试中的群集现象。经验表明,测试后程序中残存的错误数目与该程序中已发现的错误数目成正比。6.严格执行测试计划,排除测试的随意性。7.应当对每一个测试结果做全面检查。8.妥善保存测试计划,测
试用例,出错统计和最终分析报告,为维护提供方便。测试与软件开发各阶段的关系•软件开发过程是一个自顶向下,逐步细化的过程•软件计划阶段定义软件作用域•软件需求分析建立软件信息域、功能和性能需求、约束等•软件设计把设计用某种程序设计语言转换成程序代码
•测试过程是依相反顺序安排的自底向上,逐步集成的过程。软件测试用例设计•两种常用的测试方法–黑盒测试–白盒测试黑盒测试•这种方法是把测试对象看做一个黑盒子,测试人员完全不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书,检查程序的功能是否符合它的功
能说明。•黑盒测试又叫做功能测试或数据驱动测试。•黑盒测试方法是在程序接口上进行测试,主要是为了发现以下错误:–是否有不正确或遗漏了的功能?–在接口上,输入能否正确地接受?能否输出正确的结果?–是否有数据结构错误或外部
信息(例如数据文件)访问错误?–性能上是否能够满足要求?–是否有初始化或终止性错误?•用黑盒测试发现程序中的错误,必须在所有可能的输入条件和输出条件中确定测试数据,来检查程序是否都能产生正确的输出。•但这是不可能的。•假设一个程序P有输入量X和Y及输出量Z。在字长为32位的计算机上运行。
若X、Y取整数,按黑盒方法进行穷举测试:•可能采用的测试数据组:232×232=264•如果测试一组数据需要1毫秒,一年工作365×24小时,完成所有测试需5亿年。白盒测试•此方法把测试对象看做一个透明的盒子,它允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有
逻辑路径进行测试。•通过在不同点检查程序的状态,确定实际的状态是否与预期的状态一致。因此白盒测试又称为结构测试或逻辑驱动测试。•软件人员使用白盒测试方法,主要想对程序模块进行如下的检查:–对程序模块的所有独立
的执行路径至少测试一次;–对所有的逻辑判定,取“真”与取“假”的两种情况都至少测试一次;–在循环的边界和运行界限内执行循环体;–测试内部数据结构的有效性等。•••对一个具有多重选择和循环嵌套的程序,不同的路径数目可能是天文数字。给出一个小程序的流程图,
它包括了一个执行20次的循环。•包含的不同执行路径数达520条,对每一条路径进行测试需要1毫秒,假定一年工作365×24小时,要想把所有路径测试完,需3170年。逻辑覆盖–语句覆盖–判定覆盖–条件覆盖–判定-条件覆盖–条件组合覆盖–路径覆盖。
逻辑覆盖是以程序内部的逻辑结构为基础的设计测试用例的技术。它属白盒测试。白盒测试的测试用例设计举例:所有路径为:L1(a->c->e),L2(a->b->d),L3(a->b->e),L4(a->c->d)••L1(ace)ABAXA1021and
andorABAABXA102101andandorandandABABXA20101andorandand••L2(abd)=ABAX1021andandor
ABAX1021orandand=AAXBAX121021andandorandandAXBAX11021andorandand••L3(abc)ABAX1021and
andorABAX1021orandorA1andX1orB0andA2orB0andX1AXBABX110201andorandorand
••L4(acd)ABAXA1021andandorABAXA1021andandand依据以上推导出来的结果就可以设计满足要求的测试用例。••语句覆盖•语句覆盖就是设计若干
个测试用例,运行被测程序,使得每一可执行语句至少执行一次。•在图例中,正好所有的可执行语句都在路径L1上,所以选择路径L1设计测试用例,就可以覆盖所有的可执行语句。•测试用例的设计格式如下【输入的(A,B,X),输出的(A,B,X)】•为图例设计满足语句覆盖的测试用例是:【(2,0,4),(2,
0,3)】覆盖ace【L1】ABABXA20101andorandand判定覆盖•判定覆盖就是设计若干个测试用例,运行被测程序,使得程序中每个判断的取真分支和取假分支至少经历一次。•判定覆盖又称为分支覆盖。•对于图例,如果选择路径L1和L
2,就可得满足要求的测试用例:•【(2,0,4),(2,0,3)】覆盖ace【L1】【(1,1,1),(1,1,1)】覆盖abd【L2】AXBAX11021andorandand
ABABXA20101andorandand•如果选择路径L3和L4,还可得另一组可用的测试用例:【(2,1,1),(2,1,2)】覆盖abe【L3】【(3,0,3),(3,1,1)】覆盖acd【L4】AXBABX
110201andorandorandABAXA1021andandand条件覆盖•条件覆盖就是设计若干个测试用例,运行被测程序,使得程序中每个判断的每个条件的可能取值至少执行一次。•在图例中,
我们事先可对所有条件的取值加以标记。例如,•对于第一个判断:–条件A>1取真为,取假为条件B=0取真为,取假为T1T1T2T2•对于第二个判断:–条件A=2取真为,取假为条件X>1取真为,取假为测试用例覆盖分支条件取值【(2,0,4)
,(2,0,3)】L1(c,e)【(1,0,1),(1,0,1)】L2(b,d)【(2,1,1),(2,1,2)】L3(b,e)或T3T3T4T4TTTT1234TTTT1234TTTT1234测试用例覆盖分支条件取值【(1,0,3),(1,0,4)】L3(b,e)【(2
,1,1),(2,1,2)】L3(b,e)判定-条件覆盖•判定-条件覆盖就是设计足够的测试用例,使得判断中每个条件的所有可能取值至少执行一次,同时每个判断中的每个条件的可能取值至少执行一次。TTTT1234TTTT1234测试用例覆盖分支
条件取值【(2,0,4),(2,0,3)】L1(c,e)【(1,1,1),(1,1,1)】L2(b,d)TTTT1234TTTT1234ABABXA20101andorandandAXBAX11021a
ndorandand由多个基本判断组成的流程图••条件组合覆盖•条件组合覆盖就是设计足够的测试用例,运行被测程序,使得每个判断的所有可能的条件取值组合至少执行一次。记①A>1,B=0作②A>1,B≠0作③A≯1,B=0作④A≯
1,B≠0作TT12TT12TT12TT12⑤A=2,X>1作⑥A=2,X≯1作⑦A≠2,X>1作⑧A≠2,X≯1作测试用例覆盖条件覆盖组合【(2,0,4),(2,0,3)】(L1)①,⑤【(2,1,1),(2,1,2)】(L3)②,⑥【(1,0,3),(1,0,4)】(L3)③,⑦【(1,1
,1),(1,1,1)】(L2)④,⑧TT34TT34TT34TT34TTTT1234TTTT1234TTTT1234TTTT1234路径覆盖•路径测试就是设计足够的测试用例,覆盖程序中所有可能的路径。测试
用例通过路径覆盖条件【(2,0,4),(2,0,3)】ace(L1)【(1,1,1),(1,1,1)】abd(L2)【(1,1,2),(1,1,3)】abe(L3)【(3,0,3),(3,0,1)】acd(L4)TTTT
1234TTTT1234TTTT1234TTTT3412黑盒测试的测试用例设计–等价类划分–边界值分析–错误推测法–因果图等价类划分•等价类划分是一种典型的黑盒测试方法,使用这一方法时,完全不考虑程序的内部结构,只依据程序的规格说明来设计测试用例。•等价类划分方法把所有可能的输入数据,即程
序的输入域划分成若干部分,然后从每一部分中选取少数有代表性的数据做为测试用例。•使用这一方法设计测试用例要经历划分等价类(列出等价类表)和选取测试用例两步。•划分等价类等价类是指某个输入域的子集合。在该子集合中,各个输入数据对于揭露程序中的错误都是等效的。测试某等价类的代表值就等价于对这一类
其它值的测试。•等价类的划分有两种不同的情况:①有效等价类:是指对于程序的规格说明来说,是合理的,有意义的输入数据构成的集合。②无效等价类:是指对于程序的规格说明来说,是不合理的,无意义的输入数据构成的集合。•在设计测试用例
时,要同时考虑有效等价类和无效等价类的设计。•划分等价类的原则。(1)如果输入条件规定了取值范围,或值的个数,则可以确立一个有效等价类和两个无效等价类。•例如,在程序的规格说明中,对输入条件有一句话:“……项数可以从1到999……”则有效等价类是
“1≤项数≤999”两个无效等价类是“项数<1”或“项数>999”。在数轴上表示成:(2)如果输入条件规定了输入值的集合,或者是规定了“必须如何”的条件,这时可确立一个有效等价类和一个无效等价类。•例如,在Pasca
l语言中对变量标识符规定为“以字母打头的……串”。那么所有以字母打头的构成有效等价类,而不在此集合内(不以字母打头)的归于无效等价类。(3)如果输入条件是一个布尔量,则可以确定一个有效等价类和一个无效等价类。(4)如
果规定了输入数据的一组值,而且程序要对每个输入值分别进行处理。这时可为每一个输入值确立一个有效等价类,此外针对这组值确立一个无效等价类,它是所有不允许的输入值的集合。•例如,在教师上岗方案中规定对教授
、副教授、讲师和助教分别计算分数,做相应的处理。因此可以确定4个有效等价类为教授、副教授、讲师和助教,一个无效等价类,它是所有不符合以上身分的人员的输入值的集合。(5)如果规定了输入数据必须遵守的规则,则可以确立一个有效等价类(符合规则)和若干个无效等价类(从不同角度违反规则)。•例如,Pasc
al语言规定“一个语句必须以分号‘;’结束”。这时,可以确定一个有效等价类“以‘;’结束”,若干个无效等价类“以‘:’结束”、“以‘,’结束”、“以‘’结束”、“以LF结束”等。•确立测试用例在确立了等价类之后,建立等价类表,列出所有划分出
的等价类。•再从划分出的等价类中按以下原则选择测试用例:(1)为每一个等价类规定一个唯一编号;(2)设计一个新的测试用例,使其尽可能多地覆盖尚未被覆盖的有效等价类,重复这一步,直到所有的有效等价类都被覆盖为止;(3)设计一个新的测试用例,使其
仅覆盖一个尚未被覆盖的无效等价类,重复这一步,直到所有的无效等价类都被覆盖为止。•用等价类划分法设计测试用例的实例在某一PASCAL语言版本中规定:“标识符是由字母开头,后跟字母或数字的任意组合构成。有效字符数为8个,最大字符数为80个。”并且规定:“标识符必须先说
明,再使用。”“在同一说明语句中,标识符至少必须有一个。”用等价类划分的方法,建立输入等价类表:•下面选取了9个测试用例,它们覆盖了所有的等价类。①VARx,T1234567:REAL;BEGINx:=3.414;T123
4567:=2.732;...…(1),(2),(4),(8),(9),(12),(14)②VAR:REAL;(3)③VARx,:REAL;(5)④VART12345678:REAL;(6)⑤VART12345......:REAL;(7)多于80个字符
⑥VART$:CHAR;(10)⑦VARGOTO:INTEGER;(11)⑧VAR2T:REAL;(13)⑨VARPAR:REAL;(15)BEGIN......PAP:=SIN(3.14*0.8)/6;边界值分析
•边界值分析也是一种黑盒测试方法,是对等价类划分方法的补充。•人们从长期的测试工作经验得知,大量的错误是发生在输入或输出范围的边界上,而不是在输入范围的内部。因此针对各种边界情况设计测试用例,可以查出更多的错误。
•比如,在做三角形计算时,要输入三角形的三个边长:A、B和C。我们应注意到这三个数值应当满足A>0、B>0、C>0、A+B>C、A+C>B、B+C>A,才能构成三角形。但如果把六个不等式中的任何一个大于号“>”错写成大于等于号“≥”,那就不能构成三角形。问题恰出现在容易被疏忽的边界附近。•
这里所说的边界是指,相当于输入等价类和输出等价类而言,稍高于其边界值及稍低于其边界值的一些特定情况。•使用边界值分析方法设计测试用例,首先应确定边界情况。应当选取正好等于,刚刚大于,或刚刚小于边界的值做为测试数据,而不是选取等价类中的典型值或任意值做为测试数据。错误推测
法•人们也可以靠经验和直觉推测程序中可能存在的各种错误,从而有针对性地编写检查这些错误的例子。这就是错误推测法。•错误推测法的基本想法是:列举出程序中所有可能有的错误和容易发生错误的特殊情况,根据它们选择测试用例。因果图•因果图的适用范围如果在测试时必须考虑输入条件的各种组合
,可使用一种适合于描述对于多种条件的组合,相应产生多个动作的形式来设计测试用例,这就需要利用因果图。因果图方法最终生成的就是判定表。它适合于检查程序输入条件的各种组合情况。•用因果图生成测试用例的基本步骤(1)分析软件规格说明描述中,哪些是原因(即输入条件或输入条件的等价类
),哪些是结果(即输出条件),并给每个原因和结果赋予一个标识符。(2)分析软件规格说明描述中的语义,找出原因与结果之间,原因与原因之间对应的是什么关系?根据这些关系,画出因果图。(3)由于语法或环境限制,有些原因与原因之间,原因与结果之间的组合情况不可能出现。为表明这
些特殊情况,在因果图上用一些记号标明约束或限制条件。(4)把因果图转换成判定表。(5)把判定表的每一列拿出来作为依据,设计测试用例。•在因果图中出现的基本符号通常在因果图中用Ci表示原因,用Ei表示结果,各结点表示状态,可取值“0”或“1”。“0
”表示某状态不出现,“1”表示某状态出现。•主要的原因和结果之间的关系有:•表示约束条件的符号为了表示原因与原因之间,结果与结果之间可能存在的约束条件,在因果图中可以附加一些表示约束条件的符号。•例如,有一个处理单价为5角钱的饮料的自动售货机软件测
试用例的设计。其规格说明如下:若投入5角钱或1元钱的硬币,押下〖橙汁〗或〖啤酒〗的按钮,则相应的饮料就送出来。若售货机没有零钱找,则一个显示〖零钱找完〗的红灯亮,这时在投入1元硬币并押下按钮后,饮料不送出来而且1元硬币也退出来;若有
零钱找,则显示〖零钱找完〗的红灯灭,在送出饮料的同时退还5角硬币。”(1)分析这一段说明,列出原因和结果原因:1.售货机有零钱找2.投入1元硬币3.投入5角硬币4.押下橙汁按钮5.押下啤酒按钮建立中间结点,表示处理中间状态11.投入1元硬币且押下饮料按钮12.押下〖橙汁〗或〖啤酒〗的
按钮13.应当找5角零钱并且售货机有零钱找14.钱已付清结果:21.售货机〖零钱找完〗灯亮22.退还1元硬币23.退还5角硬币24.送出橙汁饮料25.送出啤酒饮料(2)画出因果图。所有原因结点列在左边,所
有结果结点列在右边。(3)由于2与3,4与5不能同时发生,分别加上约束条件E。(4)因果图•(5)转换成判定表••软件测试的策略•测试过程按4个步骤进行,即单元测试、组装测试、确认测试和系统测试。•开始是单元测试,集中对用源代码实现的每一个程序单元进行测试,检查各个程序模块是否正确地实现了规定的功
能。•组装测试把已测试过的模块组装起来,主要对与设计相关的软件体系结构的构造进行测试。•确认测试则是要检查已实现的软件是否满足了需求规格说明中确定了的各种需求,以及软件配置是否完全、正确。•系统测试把已经经过确认的软件纳入实际
运行环境中,与其它系统成份组合在一起进行测试。单元测试(UnitTesting)•单元测试又称模块测试,是针对软件设计的最小单位─程序模块,进行正确性检验的测试工作。其目的在于发现各模块内部可能存在的各种差错。•单元测试需要从程序的内部结构出发设计测试用例。多个模块可以平行地独立进行单元
测试。1.单元测试的内容•在单元测试时,测试者需要依据详细设计说明书和源程序清单,了解该模块的I/O条件和模块的逻辑结构,主要采用白盒测试的测试用例,辅之以黑盒测试的测试用例,使之对任何合理的输入和不合理的输入,都能鉴别和响应。••(1
)模块接口测试•在单元测试的开始,应对通过被测模块的数据流进行测试。测试项目包括:–调用本模块的输入参数是否正确;–本模块调用子模块时输入给子模块的参数是否正确;–全局量的定义在各模块中是否一致;•在做内外存交换时要考虑:–文件属性是否正确;–OPEN与CLOSE语句是否正确;–缓冲区容量与记
录长度是否匹配;–在进行读写操作之前是否打开了文件;–在结束文件处理时是否关闭了文件;–正文书写/输入错误,–I/O错误是否检查并做了处理。(2)局部数据结构测试•不正确或不一致的数据类型说明•使用尚未赋值或尚未初始化的变量•错误的初始值或错误的缺省
值•变量名拼写错或书写错•不一致的数据类型•全局数据对模块的影响(3)路径测试•选择适当的测试用例,对模块中重要的执行路径进行测试。•应当设计测试用例查找由于错误的计算、不正确的比较或不正常的控制流而导致的错误。•对基本执行路径和
循环进行测试可以发现大量的路径错误。(4)错误处理测试•出错的描述是否难以理解•出错的描述是否能够对错误定位•显示的错误与实际的错误是否相符•对错误条件的处理正确与否•在对错误进行处理之前,错误条件是否已经引起系统的干预等(5)边界测试•注意数据流、控制流中刚好等于、大于或小于确定的
比较值时出错的可能性。对这些地方要仔细地选择测试用例,认真加以测试。•如果对模块运行时间有要求的话,还要专门进行关键路径测试,以确定最坏情况下和平均意义下影响模块运行时间的因素。2.单元测试的步骤•模块并不是一个独立的程序,在考虑测试模块时,同时要考虑它和外界的
联系,用一些辅助模块去模拟与被测模块相联系的其它模块。–驱动模块(driver)–桩模块(stub)──存根模块驱动模块(driver)──相当于所测模块的主程序。它接收测试数据,把这些数据传送给所测模块,
最后再输出实测结果。桩模块(stub)──存根模块。用以代替所测模块调用的子模块。•••••如果一个模块要完成多种功能,可以将这个模块看成由几个小程序组成。必须对其中的每个小程序先进行单元测试要做的工作,对关键模块还要做性能测试。•对支持某些标准规程的程序,更要着手进行互联测试。有人把这种情况特别
称为模块测试,以区别单元测试。组装测试(IntegratedTesting)•组装测试(集成测试、联合测试)•通常,在单元测试的基础上,需要将所有模块按照设计要求组装成为系统。这时需要考虑的问题是:–在把各个模块连接起来的时侯,穿越模块接口的数据是否会丢失;–一个模块的功能是否会对另一个模块的功能
产生不利的影响;–各个子功能组合起来,能否达到预期要求的父功能;–全局数据结构是否有问题;–单个模块的误差累积起来,是否会放大,从而达到不能接受的程度。在单元测试的同时可进行组装测试,发现并排除在模块连接中可
能出现的问题,最终构成要求的软件系统。•子系统的组装测试特别称为部件测试,它所做的工作是要找出组装后的子系统与系统需求规格说明之间的不一致。•通常,把模块组装成为系统的方式有两种–一次性组装方式–增殖式组装方式1.一次性组装方式(bigbang)•它是一种非增
殖式组装方式。也叫做整体拼装。•使用这种方式,首先对每个模块分别进行模块测试,然后再把所有模块组装在一起进行测试,最终得到要求的软件系统。••2.增殖式组装方式•这种组装方式又称渐增式组装•首先对一个个模块进行模块测试,然后将这些模块逐步组装成较
大的系统•在组装的过程中边连接边测试,以发现连接过程中产生的问题•通过增殖逐步组装成为要求的软件系统。(1)自顶向下的增殖方式•这种组装方式将模块按系统程序结构,沿控制层次自顶向下进行组装。•自顶向下的增殖方式在测试过程中较早地验证了主
要的控制和判断点。•选用按深度方向组装的方式,可以首先实现和验证一个完整的软件功能。••(2)自底向上的增殖方式•这种组装的方式是从程序模块结构的最底层的模块开始组装和测试。•因为模块是自底向上进行组装,对于一个给定层次的模块,它的子模块(包括子模块的所有下属模块)已经组装
并测试完成,所以不再需要桩模块。在模块的测试过程中需要从子模块得到的信息可以直接运行子模块得到。•自顶向下增殖的方式和自底向上增殖的方式各有优缺点。•一般来讲,一种方式的优点是另一种方式的缺点。确认测试(ValidationTesting)•确认测试又称有效性测
试。任务是验证软件的功能和性能及其它特性是否与用户的要求一致。•对软件的功能和性能要求在软件需求规格说明书中已经明确规定。它包含的信息就是软件确认测试的基础。1.进行有效性测试(黑盒测试)•有效性测试是在模拟的环境(可能就是开发的环境)下,运用黑盒测试的方法,验证被测软件
是否满足需求规格说明书列出的需求。•首先制定测试计划,规定要做测试的种类。还需要制定一组测试步骤,描述具体的测试用例。•通过实施预定的测试计划和测试步骤,确定–软件的特性是否与需求相符;–所有的文档都是正确且便
于使用;–同时,对其它软件需求,例如可移植性、兼容性、出错自动恢复、可维护性等,也都要进行测试•在全部软件测试的测试用例运行完后,所有的测试结果可以分为两类:–测试结果与预期的结果相符。这说明软件的这部分功能或性能特征与需求规格说明书相符合,从而这部分程序被接受。–测试结果与预期的结果
不符。这说明软件的这部分功能或性能特征与需求规格说明不一致,因此要为它提交一份问题报告。