软件测试与质量保证.docx

上传人:b****7 文档编号:8731398 上传时间:2023-02-01 格式:DOCX 页数:22 大小:32.01KB
下载 相关 举报
软件测试与质量保证.docx_第1页
第1页 / 共22页
软件测试与质量保证.docx_第2页
第2页 / 共22页
软件测试与质量保证.docx_第3页
第3页 / 共22页
软件测试与质量保证.docx_第4页
第4页 / 共22页
软件测试与质量保证.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

软件测试与质量保证.docx

《软件测试与质量保证.docx》由会员分享,可在线阅读,更多相关《软件测试与质量保证.docx(22页珍藏版)》请在冰豆网上搜索。

软件测试与质量保证.docx

软件测试与质量保证

软件测试与质量保证

一、软件测试的定义

定义:

软件测试是为了发现错误而执行程序的过程。

或者说软件测试是根据软件开发各阶段的规格说明和程序的内部结构而精心设计一批测试用例,并利用这些测试用例去运行程序,以发现程序错误的过程。

二、测试的目的

基于不同的立场,存在着两种完全不同的测试目的。

从用户的角度出发,普遍希望通过软件测试暴露软件中隐藏的错误和缺陷,以考虑是否可接受该产品。

从软件开发者的角度出发,则希望测试成为表明软件产品中不存在错误的过程,验证该软件已正确地实现了用户的要求,确立人们对软件质量的信心。

GrenfordMyer软件测试目的

(1)测试是程序的执行过程,目的在于发现错误;

(2)一个好的测试用例在于能发现至今未发现的错误;(3)一个成功的测试是发现了至今未发现的错误的测试换言之,测试的目的是

–系统地找出软件中潜在的各种错误和缺陷。

–能够证明软件的功能和性能与需求说明相符合。

–测试不能表明软件中不存在错误,它只能说明软件中存在错误。

三、软件测试的原则

1.应当把“尽早地和不断地进行软件测试”作为软件开发者的座右铭。

2.测试用例应由测试输入数据和对应的预期输出结果这两部分组成。

3.程序员应避免检查自己的程序。

4.在设计测试用例时,应当包括合理的输入条件和不合理的输入条件。

5.充分注意测试中的群集现象。

经验表明,测试后程序中残存的错误数目与该程序中已发现的错误数目成正比6.严格执行测试计划,排除测试的随意性。

7.应当对每一个测试结果做全面检查。

8.妥善保存测试计划,测试用例,出错统计和最终分析报告,为维护提供方便。

四、软件测试的对象

软件测试并不等于程序测试。

软件测试应贯穿于软件定义与开发的整个期间。

需求分析、概要设计、详细设计以及程序编码等各阶段所得到的文档,包括需求规格说明、概要设计规格说明、详细设计规格说明以及源程序,都应成为软件测试的对象。

五、确认和验证

为把握软件开发各个环节的正确性,需要进行各种确认和验证工作。

确认(Validation),是一系列的活动和过程,目的是想证实在一个给定的外部环境中软件的逻辑正确性。

–需求规格说明的确认–程序的确认

验证(Verification),试图证明在软件生存期各个阶段,以及阶段间的逻辑协调性、完备性和正确性。

七、测试信息流

测试信息流:

软件配置:

软件需求规格说明、软件设计规格说明、源代码等;测试配置:

测试计划、测试用例、测试程序等;

测试工具:

测试数据自动生成程序、静态分析程序、动态分析程序、测试结果分析程序、以及驱动测试

的测试数据库等等。

测试结果分析:

比较实测结果与预期结果,评价错误是否发生。

排错(调试):

对已经发现的错误进行错误定位和确定出错性质,并改正这些错误,同时修改相关的文档。

修正后的文档再测试:

直到通过测试为止。

通过收集和分析测试结果数据,对软件建立可靠性模型利用可靠性分析,评价软件质量:

—软件的质量和可靠性达到可以接受的程度;—所做的测试不足以发现严重的错误;

如果测试发现不了错误,可以肯定,测试配置考虑得不够细致充分,错误仍然潜伏在软件中。

八、测试与软件开发各阶段的关系

软件开发过程是一个自顶向下,逐步细化的过程软件计划阶段定义软件作用域

软件需求分析建立软件信息域、功能和性能需求、约束等软件设计把设计用某种程序设计语言转换成程序代码测试过程是依相反顺序安排的自底向上,逐步集成的过程。

九、软件测试用例设计

两种常用的测试方法

–黑盒测试–白盒测试

(一)黑盒测试

这种方法是把测试对象看做一个黑盒子,测试人员完全不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书,检查程序的功能是否符合它的功能说明。

黑盒测试又叫做功能测试或数据驱动测试。

黑盒测试方法是在程序接口上进行测试,主要是为了发现以下错误:

–是否有不正确或遗漏了的功能

–在接口上,输入能否正确地接受能否输出正确的结果–是否有数据结构错误或外部信息(例如数据文件)访问错误–性能上是否能够满足要求–是否有初始化或终止性错误

用黑盒测试发现程序中的错误,必须在所有可能的输入条件和输出条件中确定测试数据,来检查程序是

否都能产生正确的输出。

但这是不可能的。

假设一个程序P有输入量某和Y及输出量Z。

在字长为32位的计算机上运行。

若某、Y取整数,按黑盒方法进行穷举测试:

可能采用的

测试数据组:

232某232=264

如果测试一组数据需要1毫秒,一年工作365某24小时,完成所有测试需5亿年

(二)白盒测试

此方法把测试对象看做一个透明的盒子,它允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试。

通过在不同点检查程序的状态,确定实际的状态是否与预期的状态一致。

因此白盒测试又称为结构测试或逻辑驱动测试。

软件人员使用白盒测试方法,主要想对程序模块进行如下的检查:

–对程序模块的所有独立的执行路径至少测试一次;

–对所有的逻辑判定,取“真”与取“假”的两种情况都至少测试一次;–在循环的边界和运行界限内执行循环体;–测试内部数据结构的有效性,等。

对一个具有多重选择和循环嵌套的程序,不同的路径数目可能是天文数字。

给出一个小程序的流程图,它包括了一个执行20次的循环。

包含的不同执行路径数达5^20条,对每一条路径进行测试需要1毫秒,假定一年工作365某24小时,要想把所有路径测试完,需3170年

十、白盒测试的测试用例设计

(一)逻辑覆盖

逻辑覆盖是以程序内部的逻辑结构为基础的设计测试用例的技术。

它属白盒测试。

–语句覆盖–判定覆盖–条件覆盖–判定-条件覆盖–条件组合覆盖–路径覆盖。

举例:

所有路径为:

L1(a->c->e),L2(a->b->d),L3(a->b->e),L4(a->c->d)

L1(ace)

A1andB0andA2or某A1A1andB0andA2or

A1andB0and某A1

A2andB0or

A1andB0and某A1L2(abd)

=A1andB0andA2or某1

A1orB0andA2and某1

=A1andA2and某1orB0andA2and某1A1and某1or

B0andA2and某1

L3(abc)

A1andB0andA2or某1

A1orB0andA2or某1

A1and某1orB0andA2orB0and某1

A1and某1or

B0andA2orB0and某1L4(acd)

A1andB0andA2or某A1

A1andB0andA2and某A1

依据以上推导出来的结果就可以设计满足要求的测试用例。

(二)语句覆盖

语句覆盖就是设计若干个测试用例,运行被测程序,使得每一可执行语句至少执行一次。

在图例中,正好所有的可执行语句都在路径L1上,所以选择路径L1设计测试用例,就可以覆盖所有的可执行语句。

测试用例的设计格式如下

【输入的(A,B,某),输出的(A,B,某)】

为图例设计满足语句覆盖的测试用例是:

【(2,0,4),(2,0,3)】覆盖ace【L1】

A2andB0orA1andB0and某A1

(三)判定覆盖

判定覆盖就是设计若干个测试用例,运行被测程序,使得程序中每个判断的取真分支和取假分支至少经历一次。

判定覆盖又称为分支覆盖。

对于图例,如果选择路径L1和L2,就可得满足要求的测试用例【(2,0,4),(2,0,3)】覆盖ace【L1】【(1,1,1),(1,1,1)】覆盖abd【L2】

A2andB0orA1andB0and某

A1and某1orA1B0andA2and某1如果选择路径L3和L4,还可得另一组可用的测试用例:

【(2,1,1),(2,1,2)】覆盖abe【L3】【(3,0,3),(3,1,1)】覆盖acd【L4】

A1andB0andA2andA1and某1orB0and某A1A2orB0and某1

(四)条件覆盖

条件覆盖就是设计若干个测试用例,运行被测程序,使得程序中每个判断的每个条件的可能取值至少执

行一次。

在图例中,我们事先可对所有条件的取值加以标记。

例如,对于第一个判断:

–条件A>1取真为T1,取假为T1

条件B=0取真为T2,取假为T2

对于第二个判断:

–条件A=2取真为T3,取假为T3

条件某>1取真为T4,取假为T4

测试用例覆盖分支条件取值【(2,0,4),(2,0,3)】L1(c,e)T1T2T3T4【(1,0,1),(1,0,1)】L2(b,d)T1T2T3T4【(2,1,1),(2,1,2)】L3(b,e)T1T2T3T4

测试用例覆盖分支条件取值【(1,0,3),(1,0,4)】L3(b,e)T1T2T3T4【(2,1,1),(2,1,2)】L3(b,e)T1T2T3T4

(五)判定-条件覆盖

判定-条件覆盖就是设计足够的测试用例,使得判断中每个条件的所有可能取值至少执行一次,同时每

个判断中的每个条件的可能取值至少执行一次。

测试用例覆盖分支条件取值【(2,0,4),(2,0,3)】L1(c,e)T1T2T3T4【(1,1,1),(1,1,1)】L2(b,d)T1T2T3T4

A2andB0orA1andB0and某由多个基本判断组成的流程图

A1and某1orA1B0andA2and某1

(六)条件组合覆盖

条件组合覆盖就是设计足够的测试用例,运行被测程序,使得每个判断的所有可能的条件取值组合至少执行一次。

记①A>1,B=0作T1T2②A>1,B≠0作T1T2

③A≯1,B=0作T1T2

④A≯1,B≠0作T1T2

⑤A=2,某>1作T3T4⑥A=2,某≯1作T3T4⑦A≠2,某>1作T3T4⑧A≠2,某≯1作T3T4测试用例覆盖条件覆盖组合

【(2,0,4),(2,0,3)】(L1)T1T2T3T4①,⑤【(2,1,1),(2,1,2)】(L3)T1T2T3T4②,⑥【(1,0,3),(1,0,4)】(L3)T1T2T3T4③,⑦【(1,1,1),(1,1,1)】(L2)T1T2T3T4④,⑧(七)路径测试

路径测试就是设计足够的测试用例,覆盖程序中所有可能的路径。

测试用例通过路径覆盖条件【(2,0,4),(2,0,3)】ace(L1)T1T2T3T4【(1,1,1),(1,1,1)】abd(L2)T1T2T3T4

【(1,1,2),(1,1,3)】abe(L3)T1T2T3T4【(3,0,3),(3,0,1)】acd(L3)T1T2T3T4

(八)基本路径集测试

覆盖关键路径。

得到程序的控制流程图/程序图

Sequence

If

计算环路复杂性的方法:

-V(G)=简单判定节点数+1

–V(G)=E-N+2(E是边数,N是定点数)–V(G)=封闭区域数+1

V(G)=4

根据环路复杂性产生基本路径集Path1:

1-2-3-8Path2:

1-2-3-8-1-2-3Path3:

1-2-4-5-7-8Path4:

1-2-4-6-7-8

准备测试用例覆盖所有基本路径

While

十一、黑盒测试的测试用例设计

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

(一)等价类划分

等价类划分是一种典型的黑盒测试方法,使用这一方法时,完全不考虑程序的内部结构,只依据程序的规格说明来设计测试用例。

等价类划分方法把所有可能的输入数据,即程序的输入域划分成若干部分,然后从每一部分中选取少数有代表性的数据做为测试用例。

使用这一方法设计测试用例要经历划分等价类(列出等价类表)和选取测试用例两步。

划分等价类

等价类是指某个输入域的子集合。

在该子集合中,各个输入数据对于揭露程序中的错误都是等效的。

测试某等价类的代表值就等价于对这一类其它值的测试。

等价类的划分有两种不同的情况:

①有效等价类:

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

②无效等价类:

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

在设计测试用例时,要同时考虑有效等价类和无效等价类的设计。

划分等价类的原则。

(1)如果输入条件规定了取值范围,或值的个数,则可以确立一个有效等价类和两个无效等价类。

例如,在程序的规格说明中,对输入条件有一句话:

“……项数可以从1到999……”则有效等价类是“1≤项数≤999”两个无效等价类是“项数<1”或“项数>999”。

在数轴上表示成:

(2)如果输入条件规定了输入值的集合,或者是规定了“必须如何”的条件,这时可确立一个有效等价类和一个无效等价类。

例如,在Pacal语言中对变量标识符规定为“以字母打头的……串”。

那么所有以字母打头的构成有效等价类,而不在此集合内(不以字母打头)的归于无效等价类。

(3)如果输入条件是一个布尔量,则可以确定一个有效等价类和一个无效等价类。

(4)如果规定了输入数据的一组值,而且程序要对每个输入值分别进行处理。

这时可为每一个输入值确立一个有效等价类,此外针对这组值确立一个无效等价类,它是所有不允许的输入值的集合。

例如,在教师上岗方案中规定对教授、副教授、讲师和助教分别计算分数,做相应的处理。

因此可以确定4个有效等价类为教授、副教授、讲师和助教,一个无效等价类,它是所有不符合以上身分的人员的

输入值的集合。

(5)如果规定了输入数据必须遵守的规则,则可以确立一个有效等价类(符合规则)和若干个无效等价类(从不同角度违反规则)。

例如,Pacal语言规定“一个语句必须以分号‘;’结束”。

这时,可以确定一个有效等价类“以‘;’结束”,若干个无效等价类“以‘:

’结束”、“以‘,’结束”、“以‘’结束”、“以LF结束”等。

确立测试用例

在确立了等价类之后,建立等价类表,列出所有划分出的等价类。

(2)设计一个新的测试用例,使其尽可能多地覆盖尚未被覆盖的有效等价类,重复这一步,直到所有的有效等价类都被覆盖为止;

(3)设计一个新的测试用例,使其仅覆盖一个尚未被覆盖的无效等价类,重复这一步,直到所有的无效等价类都被覆盖为止。

用等价类划分法设计测试用例的实例

在某一PASCAL语言版本中规定:

“标识符是由字母开头,后跟字母或数字的任意组合构成。

有效字符数为8个,最大字符数为80个。

并且规定:

“标识符必须先说明,再使用。

”“在同一说明语句中,标识符至少必须有一个。

用等价类划分的方法,建立输入等价类表:

下面选取了9个测试用例,它们覆盖了所有的等价类。

①VAR某,T1234567:

REAL;

BEGIN某:

=3.414;T1234567:

=2.732;...…

(1),

(2),(4),(8),(9),(12),(14)

②VAR:

REAL;(3)③VAR某,:

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,才能构成三角形。

但如果把六个不等式中的任何一个大于号“>”错写成大于等于号“≥”,那就不能构成三角形。

问题恰出现在容易被疏忽的边界附近。

这里所说的边界是指,相当于输入等价类和输出等价类而言,稍高于其边界值及稍低于其边界值的一些特定情况。

使用边界值分析方法设计测试用例,首先应确定边界情况。

应当选取正好等于,刚刚大于,或刚刚小于边界的值做为测试数据,而不是选取等价类中的典型值或任意值做为测试数据。

(三)错误推测法

人们也可以靠经验和直觉推测程序中可能存在的各种错误,从而有针对性地编写检查这些错误的例子。

这就是错误推测法。

错误推测法的基本想法是:

列举出程序中所有可能有的错误和容易发生错误的特殊情况,根据它们选择

测试用例。

十二、软件测试的策略

测试过程按4个步骤进行,即单元测试、组装测试、确认测试和系统测试。

开始是单元测试,集中对用源代码实现的每一个程序单元进行测试,检查各个程序模块是否正确地实现了规定的功能

组装测试:

把已测试过的模块组装起来,主要对与设计相关的软件体系结构的构造进行测试。

确认测试:

则是要检查已实现的软件是否满足了需求规格说明中确定了的各种需求,以及软件配置是否完全、正确。

系统测试:

把已经经过确认的软件纳入实际运行环境中,与其它系统成份组合在一起进行测试。

(一)单元测试(UnitTeting)

单元测试又称模块测试,是针对软件设计的最小单位─程序模块,进行正确性检验的测试工作。

其目的在于发现各模块内部可能存在的各种差错。

单元测试需要从程序的内部结构出发设计测试用例。

多个模块可以平行地独立进行单元测试。

1.单元测试的内容

在单元测试时,测试者需要依据详细设计说明书和源程序清单,了解该模块的I/O条件和模块的逻辑结

构,主要采用白盒测试的测试用例,辅之以黑盒测试的测试用例,使之对任何合理的输入和不合理的输入,都能鉴别和响应。

(1)模块接口测试

在单元测试的开始,应对通过被测模块的数据流进行测试。

测试项目包括:

–调用本模块的输入参数是否正确;

–本模块调用子模块时输入给子模块的参数是否正确;–全局量的定义在各模块中是否一致

在做内外存交换时要考虑:

–文件属性是否正确;

–OPEN与CLOSE语句是否正确;–缓冲区容量与记录长度是否匹配;–在进行读写操作之前是否打开了文件;–在结束文件处理时是否关闭了文件;–正文书写/输入错误,

–I/O错误是否检查并做了处理。

(2)局部数据结构测试

不正确或不一致的数据类型说明

使用尚未赋值或尚未初始化的变量错误的初始值或错误的缺省值变量名拼写错或书写错不一致的数据类型全局数据对模块的影响

(3)路径测试

选择适当的测试用例,对模块中重要的执行路径进行测试。

应当设计测试用例查找由于错误的计算、不正确的比较或不正常的控制流而导致的错误。

对基本执行路径和循环进行测试可以发现大量的路径错误。

(4)错误处理测试

出错的描述是否难以理解

出错的描述是否能够对错误定位显示的错误与实际的错误是否相符对错误条件的处理正确与否

在对错误进行处理之前,错误条件是否已经引起系统的干预等

(5)边界测试

注意数据流、控制流中刚好等于、大于或小于确定的比较值时出错的可能性。

对这些地方要仔细地选择

测试用例,认真加以测试。

如果对模块运行时间有要求的话,还要专门进行关键路径测试,以确定最坏情况下和平均意义下影响模块运行时间的因素。

2.单元测试的步骤

–驱动模块(driver)

–桩模块(tub)──存根模块

驱动模块(driver)──相当于所测模块的主程序。

它接收测试数据,把这些数据传送给所测模块,最后再输出实测结果。

桩模块(tub)──存根模块。

用以代替所测模块调用的子模块。

如果一个模块要完成多种功能,可以将这个模块看成由几个小程序组成。

必须对其中的每个小程序先进

行单元测试要做的工作,对关键模块还要做性能测试。

对支持某些标准规程的程序,更要着手进行互联测试。

有人把这种情况特别称为模块测试,以区别单元

测试。

(二)组装测试(IntegratedTeting)

组装测试(集成测试、联合测试)

通常,在单元测试的基础上,需要将所有模块按照设计要求组装成为系统。

这时需要考虑的问题是:

–在把各个模块连接起来的时侯,穿越模块接口的数据是否会丢失;–一个模块的功能是否会对另一个模块的功能产生不利的影响;–各个子功能组合起来,能否达到预期要求的父功能;–全局数据结构是否有问题;

–单个模块的误差累积起来,是否会放大,从而达到不能接受的程度。

在单元测试的同时可进行组装测试,发现并排除在模块连接中可能出现的问题,最终构成要求的软件系统。

子系统的组装测试特别称为部件测试,它所做的工作是要找出组装后的子系统与系统需求规格说明之间

的不一致。

通常,把模块组装成为系统的方式有两种

–一次性组装方式–增殖式组装方式

1.一次性组装方式(bigbang)

它是一种非增殖式组装方式。

也叫做整体拼装。

使用这种方式,首先对每个模块分别进行模块测试,然后再把所有模块组装在一起进行测试,最终得到

要求的软件系统。

2.增殖式组装方式

这种组装方式又称渐增式组装

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

(1)自顶向下的增殖方式

这种组装方式将模块按系统程序结构,沿控制层次自顶向下进行组装。

自顶向下的增殖方式在测试过程中较早地验证了主要的控制和判断点。

选用按深度方向组装的方式,可以首先实现和验证一个完整的软件功能。

(2)自底向上的增殖方式

这种组装的方式是从程序模块结构的最底层的模块开始组装和测试。

因为模块是自底向上进行组装,对于一个给定层次的模块,它的子模块(包括子模块的所有下属模块)已经组装并测试完成,所以不再需要桩模块。

在模块的测试过程中需要从子模块得到的信息可以直接运行子模块得到。

自顶向下增殖的方式和自底向上增殖的方式各有优缺点。

一般来讲,一种方式的优点是另一种方式的缺点。

(3)混合增殖式测试

衍变的自顶向下的增殖测试

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

自底向上自顶向下的增殖测试

–首先对含读操作的子系统自底向上直至根结点模块进行组装和测试;–然后对含写操作的子系统做自顶向下的组装与测试。

回归测试

–这种方式采取自顶向下的方式测试被修改的模块及其子模块;–然后将这一部分视为子系统,再自底向上测试。

关键模块问题

在组装测试时,应当确定关键模块,对这些关键模块及早进行测试。

关键模块的特征:

①满足某些软件需求;

②在程序的模块结构中位于较高的层次(高层控制模块);③较复杂、较易发生错误;④有明确定义的性能要求

(三)确认测试(ValidationTeting)

确认测试又称有效性测试。

任务是验证软件的功能和性能及其它特性是否与用户的要求一致。

对软件的功能和性能要求在软件需求规格说明书中已经明确规定。

它包含的信息就是软件确认测试的基础。

1.进行有效性测试(黑盒测试)

有效性测试是在模拟的环境(可能就是开发的环境)下,运用黑盒测试的方法,验证被测软件是否满足需求规格说明书列出的需求。

首先制定测试计划,规定要做测试的种类。

还需要制定一组测试步骤,描述具体的测试用例。

通过实施预定的测试计划和测试步骤,确定

–软件的特性是否与需求相符;–所有的文档都是正确且便于使用;

–同时,对其它软件需求,例如可移植性、兼容性、出错自动恢复、可维护性等,也都要进行测

在全部软件测试的测试用例运行完后,所有的测试结果可以分为两类:

–测试结果与预期的结果相符。

这说明软件的这部分功能或性能特征与需求规格说明书相符合,

从而这部分程序被接受。

–测试结果与预期的结果不符。

这说明软件的这部分功能或性能特征与需求规格说明不一致,因

此要为它提交一份问题报告。

2.软件配置复查

软件配置复查的目的是保证

软件配

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1