软件测试理论和方法(全面推荐)_第1页
软件测试理论和方法(全面推荐)_第2页
软件测试理论和方法(全面推荐)_第3页
软件测试理论和方法(全面推荐)_第4页
软件测试理论和方法(全面推荐)_第5页
已阅读5页,还剩570页未读 继续免费阅读

下载本文档

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

文档简介

软件测试理论和方法(全面推荐)第一页,共575页。软件测试软件测试的目的和原则软件测试的重要性错误的分类软件测试用例设计软件测试的过程与策略软件测试种类程序的静态测试程序调试GUI测试文档测试面向对象系统的测试客户/服务器系统的测试WEB系统的测试RUP中的测试工作流第二页,共575页。软件测试的目的和原则软件测试的目的软件测试的原则软件测试的对象测试信息流测试与软件开发各阶段的关系第三页,共575页。软件测试的目的基于不同的立场,存在着两种完全不同的测试目的。从用户的角度出发,普遍希望通过软件测试暴露软件中隐藏的错误和缺陷,以考虑是否可接受该产品。从软件开发者的角度出发,则希望测试成为表明软件产品中不存在错误的过程,验证该软件已正确地实现了用户的要求,确立人们对软件质量的信心。第四页,共575页。Myers软件测试目的(1)测试是程序的执行过程,目的在于发现错误;(2)一个好的测试用例在于能发现至今未发现的错误;(3)一个成功的测试是发现了至今未发现的错误的测试。第五页,共575页。换言之,测试的目的是想以最少的时间和人力,系统地找出软件中潜在的各种错误和缺陷。如果我们成功地实施了测试,我们就能够发现软件中的错误。测试的附带收获是,它能够证明软件的功能和性能与需求说明相符合。实施测试收集到的测试结果数据为可靠性分析提供了依据。

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

第六页,共575页。软件测试的原则1.测试计划可以在需求模型一完成就开始,详细的测试用例定义可以在设计模型被确定后立刻开始。因此所有测试可以在任何代码被产生前进行计划和设计。应当把“尽早地和不断地进行软件测试”作为软件开发者的座右铭。2.所有的测试都应追溯到用户需求。软件测试的目标在于揭示错误,而最严重的错误(从用户角度看)是那些导致程序无法满足需求的错误。第七页,共575页。3.测试用例应由测试输入数据和对应的预期输出结果这两部分组成。4.程序员应避免检查自己的程序。5.在设计测试用例时,应包括合理的输入条件和不合理的输入条件。6.测试应从“小规模”开始,逐步转向“大规模”。从单元测试到组装测试再到系统测试7。穷举测试是不可能的,然而充分覆盖程序逻辑,并确保程序设计中使用的所有条件是有可能的。软件测试的原则第八页,共575页。8.Pareto原则应用于软件测试。Pareto原则暗示着测试发现的错误中80%很可能起源于程序模块中20%。因此应集中精力孤立有疑点的模块,对其进行彻底测试,这对测试的安排很重要。9.充分注意测试中的群集现象。经验表明,测试后程序中残存的错误数目与该程序中已发现的错误数目成正比。10.严格执行测试计划,排除测试的随意性。应当对每一个测试结果做全面检查。妥善保存测试计划,测试用例,出错统计和最终分析报告,为维护提供方便。软件测试的原则第九页,共575页。

软件测试的对象

软件测试并不等于程序测试。软件测试应贯穿于软件定义与开发的整个期间。需求分析、概要设计、详细设计以及程序编码等各阶段所得到的文档,包括需求规格说明、概要设计规格说明、详细设计规格说明以及源程序,都应成为软件测试的对象。第十页,共575页。为把握软件开发各个环节的正确性,需要进行各种确认和验证工作。确认(Validation),是一系列的活动和过程,目的是想证实在一个给定的外部环境中软件的逻辑正确性。

需求规格说明确认程序确认(静态确认、动态确认)

验证(Verification),试图证明在软件生存期各个阶段,以及阶段间的逻辑协调性、完备性和正确性。第十一页,共575页。第十二页,共575页。测试信息流第十三页,共575页。测试信息流软件配置:软件需求规格说明、软件设计规格说明、源代码等;测试配置:测试计划、测试用例、测试程序等;测试工具:测试数据自动生成程序、静态分析程序、动态分析程序、测试结果分析程序、以及驱动测试的测试数据库等等。第十四页,共575页。测试结果分析:比较实测结果与预期结果,评价错误是否发生。排错(调试):对已经发现的错误进行错误定位和确定出错性质,并改正这些错误,同时修改相关的文档。修正后的文档再测试:直到通过测试为止。第十五页,共575页。通过收集和分析测试结果数据,对软件建立可靠性模型利用可靠性分析,评价软件质量:

软件的质量和可靠性达到可以接受的程度;

所做的测试不足以发现严重的错误;如果测试发现不了错误,可以肯定,测试配置考虑得不够细致充分,错误仍然潜伏在软件中。这些错误最终不得不由用户在使用中发现,并在维护时由开发者去改正。但那时改正错误的费用将比在开发阶段改正错误的费用要高出40倍到60倍。

第十六页,共575页。测试与软件开发各阶段的关系软件开发过程是一个自顶向下,逐步细化的过程软件计划阶段定义软件作用域软件需求分析建立软件信息域、功能和性能需求、约束等软件设计把设计用某种程序设计语言转换成程序代码

第十七页,共575页。测试过程是依相反顺序安排的自底向上,逐步集成的过程。返第十八页,共575页。传统测试过程建立设计测试测试生命周期第十九页,共575页。建立1建立2建立3建立4用户改进迭代测试测试测试测试测试需要尽早的开始设计无须

“冻结”规格测试生命周期第二十页,共575页。规格测试规格1建立2建立3建立4测试规格2测试规格3测试规格4建立1测试生命周期第二十一页,共575页。开发生命周期...

维护需求定义应用定义应用开发修订建立

建立测试生命周期第二十二页,共575页。开发生命周期...

维护需求定义应用定义应用开发

修订

建立

建立测试生命周期...执行.执行执行.测试计划缺陷跟踪测试开发测试设计评估测试生命周期第二十三页,共575页。...执行.执行测试计划缺陷跟踪测试开发测试设计评估建立

建立...执行

建立测试生命周期测试计划定义测试项目的过程,以便测试项目能被正确的度量和控制。包括测试需求,测试策略,测试资源和测试计划第二十四页,共575页。...执行.执行..测试计划缺陷跟踪测试开发测试设计评估

建立建立...执行..建立测试生命周期测试设计为了最有效的验证测试需求被覆盖,定义自动的测试第二十五页,共575页。...执行..执行.测试计划缺陷跟踪测试开发测试设计评估建立

建立...执行..建立测试生命周期测试开发在测试设计期间已被定义,创建或获得自动的测试过程.第二十六页,共575页。...执行..执行..测试计划缺陷跟踪测试开发测试设计评估建立建立...执行..建立测试生命周期测试执行运行与被测试应用的软件构造相对应的测试过程集,并记录结果日志,包括缺陷报告和测试日志。第二十七页,共575页。...执行.执行.测试计划缺陷跟踪测试开发测试设计评估建立建立...执行.建立测试生命周期测试评估分析测试结果,确定是否测试标准被覆盖的过程.第二十八页,共575页。...执行.执行.测试计划缺陷跟踪测试开发测试设计评估建立建立...执行.建立测试生命周期缺陷跟踪初始记录测试故障或用户问题,检查测试故障以及提供解决它们的结构的过程。第二十九页,共575页。测试人员项目持续时间

测试人员100%50%0%完成比率代码实现消除缺陷质量问题延迟上市维护的费用1x10x100x软件测试重要性第三十页,共575页。项目持续时间

100%50%0%完成比率消除缺陷消除缺陷保证软件质量缩短上市时间软件测试重要性第三十一页,共575页。系统性能应用性能功能可靠性100%软件测试重要性第三十二页,共575页。风险代码完成可靠性功能应用性能系统性能风险越早测试越好自动的测试测试每一个版本

传统的测试是在代码实现之后进行

软件测试重要性第三十三页,共575页。程序错误分类(1)按错误的影响和后果分类较小错误:只对系统输出有一些非实质性影响。如,输出的数据格式不合要求等。中等错误:对系统的运行有局部影响。如输出的某些数据有错误或出现冗余。较严重错误:系统的行为因错误的干扰而出现明显不合情理的现象。比如开出了0.00元的支票,系统的输出完全不可信赖。严重错误:系统运行不可跟踪,一时不能掌握其规律,时好时坏。非常严重的错误:系统运行中突然停机,其原因不明,无法软启动。最严重的错误:系统运行导致环境破坏,或是造成事故,引起生命、财产的损失。第三十四页,共575页。(2)按错误的性质和范围分类。B.Beizer从软件测试观点出发,把软件错误分为5类。①功能错误

规格说明错误:规格说明可能不完全,有二义性或自身矛盾。功能错误:程序实现的功能与用户要求的不一致。这常常是由于规格说明中包含错误的功能、多余的功能或遗漏的功能所致。测试错误:软件测试的设计与实施发生错误。软件测试自身也可能发生错误。测试标准引起的错误:对软件测试的标准要选择适当,若测试标准太复杂,则导致测试过程出错的可能就大。第三十五页,共575页。②系统错误外部接口错误:外部接口指如终端、打印机、通信线路等系统与外部环境通信的手段。所有外部接口之间,人与机器之间的通信都使用形式的或非形式的专门协议。如果协议有错,或太复杂,难以理解,致使在使用中出错。此外还包括对输入/输出格式错误理解,对输入数据不合理的容错等等。内部接口错误:内部接口指程序之间的联系。它所发生的错误与程序内实现的细节有关。例如,设计协议错、输入/输出格式错、数据保护不可靠、子程序访问错等。硬件结构错误:这类错误在于不能正确地理解硬件如何工作。例如,忽视或错误地理解分页机构、地址生成、通道容量、I/O指令、中断处理、设备初始化和启动等而导致的出错。第三十六页,共575页。操作系统错误:这类错误主要是由于不了解操作系统的工作机制而导致出错。当然,操作系统本身也有错误,但是一般用户很难发现这种错误。软件结构错误:由于软件结构不合理或不清晰而引起的错误。这种错误通常与系统的负载有关,而且往往在系统满载时才出现。这是最难发现的一类错误。例如,错误地设置局部参数或全局参数;错误地假定寄存器与存储器单元初始化了;错误地假定不会发生中断而导致不能封锁或开中断;错误地假定程序可以绕过数据的内部锁而导致不能关闭或打开内部锁;错误地假定被调用子程序常驻内存或非常驻内存等等,都将导致软件出错。控制与顺序错误:这类错误包括:忽视了时间因素而破坏了事件的顺序;猜测事件出现在指定的序列中;等待一个不可能发生的条件;漏掉先决条件;规定错误的优先级或程序状态;漏掉处理步骤;存在不正确的处理步骤或多余的处理步骤等。资源管理错误:这类错误是由于不正确地使用资源而产生的。例如,使用未经获准的资源;使用后未释放资源;资源死锁;把资源链接在错误的队列中等等。第三十七页,共575页。③加工错误算术与操作错误:指在算术运算、函数求值和一般操作过程中发生的错误。包括:数据类型转换错;除法溢出;错误地使用关系比较符;用整数与浮点数做比较等。初始化错误:典型的错误有:忘记初始化工作区,忘记初始化寄存器和数据区;错误地对循环控制变量赋初值;用不正确的格式,数据或类型进行初始化等等。控制和次序错误:这类错误与系统级同名错误类似,但它是局部错误。包括:遗漏路径;不可达到的代码;不符合语法的循环嵌套;循环返回和终止的条件不正确;漏掉处理步骤或处理步骤有错等。静态逻辑错误:这类错误主要包括:不正确地使用CASE语句;在表达式中使用不正确的否定(例如用“>”代替“<”的否定);对情况不适当地分解与组合;混淆“或”与“异或”等。第三十八页,共575页。④数据错误动态数据错误:动态数据是在程序执行过程中暂时存在的数据。各种不同类型的动态数据在程序执行期间将共享一个共同的存储区域,若程序启动时对这个区域未初始化,就会导致数据出错。由于动态数据被破坏的位置可能与出错的位置在距离上相差很远,因此要发现这类错误比较困难。静态数据错误:静态数据在内容和格式上都是固定的。它们直接或间接地出现在程序或数据库中。由编译程序或其它专门程序对它们做预处理。这是在程序执行前防止静态错误的好办法,但预处理也会出错。数据内容错误:数据内容是指存储于存储单元或数据结构中的位串、字符串或数字。数据内容本身没有特定的含义,除非通过硬件或软件给予解释。数据内容错误就是由于内容被破坏或被错误地解释而造成的错误。数据结构错误:数据结构是指数据元素的大小和组织形式。在同一存储区域中可以定义不同的数据结构。数据结构错误主要包括结构说明错误及把一个数据结构误当做另一类数据结构使用的错误。这是更危险的错误。数据属性错误:数据属性是指数据内容的含义或语义。例如,整数、字符串、子程序等等。数据属性错误主要包括:对数据属性不正确地解释,比如错把整数当实数,允许不同类型数据混合运算而导致的错误等。第三十九页,共575页。⑤代码错误,主要包括语法错误打字错误对语句或指令不正确理解所产生的错误。第四十页,共575页。(3)按软件生存期阶段分类,Gerhart分类方法把软件的逻辑错误按生存期不同阶段分为4类。①问题定义(需求分析)错误:它们是在软件定义阶段,分析员研究用户的要求后所编写的文档中出现的错误。换句话说,这类错误是由于问题定义不满足用户的要求而导致的错误。②规格说明错误:这类错误是指规格说明与问题定义不一致所产生的错误。它们又可以细分成:不一致性错误:规格说明中功能说明与问题定义发生矛盾。冗余性错误:规格说明中某些功能说明与问题定义相比是多余的。不完整性错误:规格说明中缺少某些必要的功能说明。不可行错误:规格说明中有些功能要求是不可行的。不可测试错误:有些功能的测试要求是不现实的。第四十一页,共575页。③设计错误:这是在设计阶段产生的错误,它使系统的设计与需求规格说明中的功能说明不相符。它们又可以细分为:设计不完全错误:某些功能没有被设计,或设计得不完全。算法错误:算法选择不合适。主要表现为算法的基本功能不满足功能要求、算法不可行或者算法的效率不符合要求。模块接口错误:模块结构不合理;模块与外部数据库的界面不一致,模块之间的界面不一致。控制逻辑错误:控制流程与规格说明不一致;控制结构不合理。数据结构错误:数据设计不合理;与算法不匹配;数据结构不满足规格说明要求。第四十二页,共575页。④编码错误:编码过程中的错误是多种多样的,大体可归为以下几种:数据说明错、数据使用错、计算错、比较错、控制流错、界面错、输入/输出错,及其它的错误。在不同的开发阶段,错误的类型和表现形式是不同的,故应当采用不同的方法和策略来进行检测。第四十三页,共575页。测试用例设计两种常用的测试方法黑盒测试白盒测试第四十四页,共575页。黑盒测试这种方法是把测试对象看做一个黑盒子,测试人员完全不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书,检查程序的功能是否符合它的功能说明。黑盒测试又叫做功能测试或数据驱动测试。第四十五页,共575页。黑盒测试方法是在程序接口上进行测试,主要是为了发现以下错误:

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

在接口上,输入能否正确地接受?能否输出正确的结果?

是否有数据结构错误或外部信息(例如数据文件)访问错误?

性能上是否能够满足要求?

是否有初始化或终止性错误?

第四十六页,共575页。用黑盒测试发现程序中的错误,必须在所有可能的输入条件和输出条件中确定测试数据,来检查程序是否都能产生正确的输出。但这是不可能的。第四十七页,共575页。假设一个程序P有输入量X和Y及输出量Z。在字长为32位的计算机上运行。若X、Y取整数,按黑盒方法进行穷举测试:可能采用的测试数据组:

232×232

=264

如果测试一组数据需要1毫秒,一年工作365×24小时,完成所有测试需5亿年。第四十八页,共575页。白盒测试此方法把测试对象看做一个透明的盒子,它允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试。通过在不同点检查程序的状态,确定实际的状态是否与预期的状态一致。因此白盒测试又称为结构测试或逻辑驱动测试。第四十九页,共575页。软件人员使用白盒测试方法,主要想对程序模块进行如下的检查:对程序模块的所有独立的执行路径至少测试一次;对所有的逻辑判定,取“真”与取“假”的两种情况都至少测试一次;在循环的边界和运行界限内执行循环体;测试内部数据结构的有效性,等。第五十页,共575页。对一个具有多重选择和循环嵌套的程序,不同的路径数目可能是天文数字。给出一个小程序的流程图,它包括了一个执行20次的循环。包含的不同执行路径数达520条,对每一条路径进行测试需要1毫秒,假定一年工作365×24小时,要想把所有路径测试完,需3170年。第五十一页,共575页。第五十二页,共575页。为什么进行白盒测试?一个合理的问题:“我们应该更注重于保证程序需求的实现,为什么要花费时间和精力来担心(和测试)逻辑细节?”,换一种说法,我们为什么不将所有的精力用于黑盒测试呢?答案在于软件的自身缺陷:逻辑错误和不正确的假设与一条程序路径被运行的可能性成反比。当我们设计和实现主流之外的功能、条件或控制时,错误往往开始出现在我们的工作中。我们经常相信某逻辑路径不可能被执行,而事实上,它可能在正常的基础上被执行。程序的逻辑流有时是违反直觉的,这意味着我们关于控制流和数据流的一些无意识的假设可能导致设计错误,只有路径测试能发现这种错误。;印刷上的错误是随机的。程序员可能会产生某些拼写错误,绝大多数可以在编译时被发现,但是,有些在测试时才会被发现。黑盒测试,不管它多全面,都可能忽略前面提到的某些类型的错误“错误潜伏在角落里,聚集在边界上”。白盒测试更可能发现它们!第五十三页,共575页。逻辑覆盖

语句覆盖

判定覆盖条件覆盖

判定-条件覆盖

条件组合覆盖

路径覆盖。逻辑覆盖是以程序内部的逻辑结构为基础的设计测试用例的技术。它属白盒测试。第五十四页,共575页。例(A>1)

and

(B=0)(A=2)

or

(X>1)X=X/AX=X+1TTFFabdce第五十五页,共575页。L1(ace)={(A>1)and(B=0)}and{(A=2)or(X/A>1)}=(A>1)and(B=0)and(A=2)or(A>1)and(B=0)and(X/A>1)=(A=2)and(B=0)

or

(A>1)and(B=0)and(X/A>1)

第五十六页,共575页。L2(abd)=not{(A>1)and(B=0)}

andnot{(A=2)or(X>1)}={not(A>1)ornot(B=0)}and

{not(A=2)andnot(X>1)}=

not(A>1)andnot(A=2)andnot(X>1)

or

not(B=0)and

not(A=2)andnot(X>1)第五十七页,共575页。L3(abe)=not{(A>1)and(B=0)}and

{(A=2)or(X>1)}={not(A>1)ornot(B=0)}and

{(A=2)or(X>1)}=not(A>1)and(A=2)

or

not(A>1)and

(X>1)

or

not(B=0)and(A=2)

or

not(B=0)and(X>1)第五十八页,共575页。L4(acd)={(A>1)and(B=0)}

andnot

{(A=2)or(X/A>1)}=(A>1)and(B=0)andnot(A=2)and

not(X/A>1)第五十九页,共575页。语句覆盖

语句覆盖就是设计若干个测试用例,运行被测程序,使得每一可执行语句至少执行一次。这种覆盖又称为点覆盖,它使得程序中每个可执行语句都得到执行,但它是最弱的逻辑覆盖准,效果有限,必须与其它方法交互使用。在图例中,正好所有的可执行语句都在路径L1上,所以选择路径L1设计测试用例,就可以覆盖所有的可执行语句。

第六十页,共575页。测试用例的设计格式如下

【输入的(A,B,X),输出的(A,B,X)】为图例设计满足语句覆盖的测试用例是:

【(2,0,4),(2,0,3)】

覆盖ace【L1】(A=2)and(B=0)

or

(A>1)and(B=0)and(X/A>1)

第六十一页,共575页。

判定覆盖判定覆盖就是设计若干个测试用例,运行被测程序,使得程序中每个判断的取真分支和取假分支至少经历一次。判定覆盖又称为分支覆盖。判定覆盖只比语句覆盖稍强一些,但实际效果表明,只是判定覆盖,还不能保证一定能查出在判断的条件中存在的错误。因此,还需要更强的逻辑覆盖准则去检验判断内部条件。

对于图例,如果选择路径L1和L2,就可得满足要求的测试用例:第六十二页,共575页。【(2,0,4),(2,0,3)】覆盖ace【L1】

【(1,1,1),(1,1,1)】覆盖abd【L2】(A=2)and(B=0)

or

(A>1)and(B=0)and(X/A>1)

not(A>1)andnot(A=2)andnot(X>1)

ornot(B=0)and

not(A=2)andnot(X>1)第六十三页,共575页。如果选择路径L3和L4,还可得另一组可用的测试用例:

【(2,1,1),(2,1,2)】覆盖abe【L3】

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

not(A>1)and(X>1)

ornot(B=0)and

(A=2)

ornot(B=0)and(X>1)(A>1)and(B=0)andnot(A=2)and

not(X/A>1)第六十四页,共575页。条件覆盖条件覆盖就是设计若干个测试用例,运行被测程序,使得程序中每个判断的每个条件的可能取值至少执行一次。条件覆盖深入到判定中的每个条件,但可能不能满足判定覆盖的要求。

在图例中,我们事先可对所有条件的取值加以标记。例如,对于第一个判断:条件A>1取真为,取假为

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

第六十五页,共575页。对于第二个判断:条件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)或第六十六页,共575页。

测试用例

覆盖分支

条件取值【(1,0,3),(1,0,4)】L3(b,e)【(2,1,1),(2,1,2)】L3(b,e)

第六十七页,共575页。判定-条件覆盖判定-条件覆盖就是设计足够的测试用例,使得判断中每个条件的所有可能取值至少执行一次,每个判断中的每个条件的可能取值至少执行一次。换言之,即是要求各个判断的所有可能的条件取值组合至少执行一次。

判定-条件覆盖有缺陷。从表面上来看,它测试了所有条件的取值。但是事实并非如此。往往某些条件掩盖了另一些条件。会遗漏某些条件取值错误的情况。为彻底地检查所有条件的取值,需要将判定语句中给出的复合条件表达式进行分解,形成由多个基本判定嵌套的流程图。这样就可以有效地检查所有的条件是否正确了。

第六十八页,共575页。

测试用例

覆盖分支

条件取值【(2,0,4),(2,0,3)】L1(c,e)【(1,1,1),(1,1,1)】L2(b,d)(A=2)and(B=0)

or

(A>1)and(B=0)and(X/A>1)

not(A>1)andnot(A=2)andnot(X>1)

ornot(B=0)and

not(A=2)andnot(X>1)第六十九页,共575页。

andorA>1TB=0TX=X/ATFFA=2TFX>1FX=X+1

改为单个条件判定的嵌套结构第七十页,共575页。条件组合覆盖条件组合覆盖就是设计足够的测试用例,运行被测程序,使得每个判断的所有可能的条件取值组合至少执行一次。这是一种相当强的覆盖准则,可以有效地检查各种可能的条件取值的组合是否正确。它不但可覆盖所有条件的可能取值的组合,还可覆盖所有判断的可取分支,但可能有的路径会遗漏掉。测试还不完全。

记①A>1,B=0作

②A>1,B≠0作

③A≯1,B=0作④A≯1,B≠0作第七十一页,共575页。

⑤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) ④,⑧L4被漏掉了!第七十二页,共575页。路径测试路径测试就是设计足够的测试用例,覆盖程序中所有可能的路径。这是最强的覆盖准则。但在路径数目很大时,真正做到完全覆盖是很困难的,必须把覆盖路径数目压缩到一定限度。

测试用例

通过路径

覆盖条件【(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)

第七十三页,共575页。

条件测试路径选择

当程序中判定多于一个时,形成的分支结构可以分为两类:嵌套型分支结构和连锁型分支结构。对于嵌套型分支结构,若有n个判定语句,需要n+1个测试用例;对于连锁型分支结构,若有n个判定语句,需要有2n个测试用例,覆盖它的2n条路径。第七十四页,共575页。第七十五页,共575页。

条件测试路径选择

为减少测试用例的数目,可采用试验设计法,抽取部分路径进行测试。由于抽样服从均匀分布,因此,在假定各条路径的重要性相同,或暂不明确各条路径的重要性的情况下可以做到均匀抽样。如果明确了各条路径的重要性,还可以采取加权的办法,筛选掉部分路径,再用如下的措施进行抽样。具体步骤如下:ⅰ)设连锁型分支结构中有n个判定,计算满足关系式n+1≤2m

的最小自然数m;ⅱ)设t=2m,取正交表Lt,并利用它设计测试数据。第七十六页,共575页。

条件测试路径选择

例如,一个连锁型分支结构中有三个判定语句P1,P2,P3。它全部路径是23=8条。先计算3+1≤2m

=t的t,得t=4。取正交表L4,如图所示把每一列当做一个判定,每一行当做可取的测试用例,则正交表L4最多可取三个判定,分别代之以P1,P2,P3。判定P1,P2,P3的取假分支和取真分支分别记作S1、S2;S3、S4;S5、S6,用各个判定的取假分支取代正交表L4中的“0”,用取真分支取代正交表中的“1”,就建立起一个测试路径矩阵,如图所示。测试路径数目从23=8条减少到3+1=4条。

第七十七页,共575页。

条件测试路径选择

正交表L4路径抽样矩阵第七十八页,共575页。

条件测试的策略

程序中的条件分为简单条件和复合条件。简单条件是一个布尔变量或一个关系表达式(可加前缀NOT)复合条件由简单条件通过逻辑运算符(AND、OR、NOT)和括号连接而成。如果条件出错,至少是条件中某一成分有错。条件中可能的出错类型有:布尔运算符错、布尔变量错、布尔括号错、关系运算符错、算术表达式错。如果在一个判定的复合条件表达式中每个布尔变量和关系运算符最多只出现一次,而且没有公共变量,应用一种称之为BRO(分支与关系运算符)的测试法可以发现多个布尔运算符或关系运算符错,以及其它错误。第七十九页,共575页。

条件测试的策略

BRO策略引入条件约束的概念。设有n个简单条件的复合条件C,其条件约束为D=(D1,D2,…,Dn),其中Di(1≤i≤n)是条件C中第i个简单条件的输出约束。如果在C的执行过程中,其每个简单条件的输出都满足D中对应的约束,则称条件C的条件约束D由C的执行所覆盖。特别地,布尔变量或布尔表达式的输出约束必须是真(t)或假(f);关系表达式的输出约束为符号>、=、<。设条件为C1:B1&B2,其中B1、B2是布尔变量,C1的输出约束为(D1,D2),在此,D1和D2或为t或为f。则(t,f)是C1可能的一个约束。覆盖此约束的测试(一次运行)将令B1为t,B2为f。第八十页,共575页。

条件测试的策略

BRO策略要求对C1的可能约束集合{(t,t),(f,t),(t,f)}中的每一个,分别设计一组测试用例。如果布尔运算符有错,这三组测试用例的运行结果必有一组导致C1失败。设条件为C2:B1&(E3=E4),其中B1是布尔表达式,E3和E4是算术表达式,C2

的输出约束为(D1,D2),在此,D1或为t或为f;D2则是<、=或>。因此,只有D2与C1中D2的不同,可以修改C1的约束集合{(t,t),(f,t),(t,f)},导出C2的约束集合。因为在(E3=E4)中,"t"相当于"=","f"相当于"<"或">",则C2的约束集合为{(t,=),(f,=),(t,<),(t,>)}。据此设计4组测试用例,检查C2中可能的布尔或关系运算符中的错误。第八十一页,共575页。

条件测试的策略

设条件为C3:(E1>E2)&(E3=E4),其中E1、E2、E3、E4都是算术表达式,C3的输出约束为(D1,D2),在此,D1和D2的约束均为<、=、>。C3

中只有D1与C2中的D1不同,可以修改C2的约束集合{(t,=),(f,=),(t,<),(t,>)},导出C3的约束集合。因为在(E1>E2)中,"t"相当于">","f"相当于"<"或"=",则C3的约束集合为{(>,=),(<,=),(=,=),(>,<),(>,>)}。根据这个约束集合设计测试用例,就能够检测C3中的关系运算符中的错误。第八十二页,共575页。循环测试路径选择循环分为4种不同类型:简单循环连锁循环嵌套循环非结构循环。

第八十三页,共575页。第八十四页,共575页。(1)简单循环对于简单循环,测试应包括以下几种。其中的n

表示循环允许的最大次数。

①零次循环:从循环入口到出口②一次循环:查找循环初始值方面的错误

③二次循环:检查在多次循环时才能暴露的错误。④m次循环:此时的m<n,也是检查在多次循环时才能暴露的错误。⑤最大次数循环、比最大次数多一次、少一次的循环。第八十五页,共575页。例:求最小值k=i;for(j=i+1;j<=n;j++)

if(A[j]<A[k])k=j;

第八十六页,共575页。k=i;j=i+1;j<=n?A[j]<A[k]?k=jj++fdcabe第八十七页,共575页。测试用例选择第八十八页,共575页。

对于嵌套循环,不能将简单循环的测试方法简单地扩大到嵌套循环,因为可能的测试数目将随嵌套层次的增加呈几何倍数增长。这可能导致一个天文数字的测试数目。下面给出一种有助于减少测试数目的测试方法。

①对最内层循环做简单循环的全部测试。所有其它层的循环变量置为最小值;②逐步外推,对其外面一层循环进行测试。测试时保持所有外层循环的循环变量取最小值,所有其它嵌套内层循环的循环变量取“典型”值。③反复进行,直到所有各层循环测试完毕。④对全部各层循环同时取最小循环次数,或者同时取最大循环次数(2)

嵌套循环第八十九页,共575页。要区别两种情况:如果各个循环互相独立,则连锁循环可以用与简单循环相同的方法进行测试。例如,有两个循环处于连锁状态,则前一个循环的循环变量的值就可以做为后一个循环的初值。但如果几个循环不是互相独立的,则需要使用测试嵌套循环的办法来处理。对于非结构循环,应该使用结构化程序设计方法重新设计测试用例。

(3)连锁循环第九十页,共575页。基本路径测试基本路径测试方法把覆盖的路径数压缩到一定限度内,程序中的循环体最多只执行一次。它是在程序控制流图的基础上,分析控制构造的环路复杂性,导出基本可执行路径集合,设计测试用例的方法。设计出的测试用例要保证在测试中,程序的每一个可执行语句至少要执行一次。

第九十一页,共575页。1.程序的控制流图符号○为控制流图的一个结点,表示一个或多个无分支的PDL语句或源程序语句。箭头为边,表示控制流的方向。第九十二页,共575页。在选择或多分支结构中,分支的汇聚处应有一个汇聚结点。边和结点圈定的区域叫做区域,当对区域计数时,图形外的区域也应记为一个区域。如果判断中的条件表达式是由一个或多个逻辑运算符(OR,AND,...)

连接的复合条件表达式,则需改为一系列只有单个条件的嵌套的判断。第九十三页,共575页。第九十四页,共575页。第九十五页,共575页。2.程序环路复杂性程序的环路复杂性给出了程序基本路径集中的独立路径条数,这是确保程序中每个可执行语句至少执行一次所必需的测试用例数目的上界。从控制流图来看,一条独立路径是至少包含有一条在其它独立路径中从未有过的边的路径。第九十六页,共575页。例如,在图示的控制流图中,一组独立的路径是

path1:1-11

path2:1-2-3-4-5-10-1-11

path3:1-2-3-6-8-9-10-1-11

path4:1-2-3-6-7-9-10-1-11路径path1,path2,path3,path4组成了控制流图的一个基本路径集。只要设计出的测试用例能够确保这些基本路径的执行,就可以使得程序中的每个可执行语句至少执行一次,每个条件的取真和取假分支也能得到测试。基本路径集不是唯一的,对于给定的控制流图,可以得到不同的基本路径集。第九十七页,共575页。第九十八页,共575页。通常环路复杂性可用以下三种方法求得:将环路复杂性定义为控制流图中的区域数。设E为控制流图的边数,N为图的结点数,则定义环路复杂性为V(G)=E-N+2。若设P为控制流图中的判定结点数,则有V(G)=P+1。因为图所示控制流图有4个区域。其环路复杂性为4。它是构成基本路径集的独立路径数的上界。可以据此得到应该设计的测试用例的数目。第九十九页,共575页。3.导出测试用例导出测试用例,确保基本路径集中的每一条路径的执行。根据判断结点给出的条件,选择适当的数据以保证某一条路径可以被测试到—用逻辑覆盖方法。第一百页,共575页。每个测试用例执行之后,与预期结果进行比较。如果所有测试用例都执行完毕,则可以确信程序中所有的可执行语句至少被执行了一次。必须注意,一些独立的路径(如例中的路径1),往往不是完全孤立的,有时它是程序正常的控制流的一部分,这时,这些路径的测试可以是另一条路径测试的一部分。

第一百零一页,共575页。黑盒测试的测试用例设计

等价类划分

边界值分析

错误推测法

因果图第一百零二页,共575页。等价类划分等价类划分是一种典型的黑盒测试方法,使用这一方法时,完全不考虑程序的内部结构,只依据程序的规格说明来设计测试用例。由于不可能用所有可以输入的数据来测试程序,而只能从全部可供输入的数据中选择一个子集进行测试。如何选择适当的子集,使其尽可能多地发现错误。解决的办法之一就是等价类划分。首先把数目极多的输入数据(有效的和无效的)划分为若干等价类。所谓等价类是指某个输入域的子集合。在该子集合中,各个输入数据对于揭露程序中的错误都是等效的。并合理地假定:测试某等价类的代表值就等价于对这一类其它值的测试。因此,我们可以把全部输入数据合理划分为若干等价类,在每一个等价类中取一个数据做为测试的输入条件,就可用少量代表性测试数据,取得较好的测试效果。第一百零三页,共575页。使用这一方法设计测试用例要经历划分等价类(列出等价类表)和选取测试用例两步。划分等价类

等价类是指某个输入域的子集合。在该子集合中,各个输入数据对于揭露程序中的错误都是等效的。测试某等价类的代表值就等价于对这一类其它值的测试。第一百零四页,共575页。等价类的划分有两种不同的情况:

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

无效等价类:是指对于程序的规格说明来说,是不合理的,无意义的输入数据构成的集合。在设计测试用例时,要同时考虑有效等价类和无效等价类的设计。软件不能都只接收合理的数据,还要经受意外的考验,接受无效的或不合理的数据,这样获得的软件才能具有较高的可靠性。

第一百零五页,共575页。划分等价类等价类的原则。(1)按区间划分:如果输入条件规定了取值范围,或值的个数,则可以确立一个有效等价类和两个无效等价类。第一百零六页,共575页。例如,在程序的规格说明中,对输入条件有一句话:

“……项数可以从1到999……”

则有效等价类是“1≤项数≤999”两个无效等价类是“项数<1”或“项数>999”。在数轴上表示成:第一百零七页,共575页。

(2)按数值集合划分:如果输入条件规定了输入值的集合,或者是规定了“必须如何”的条件,这时可确立一个有效等价类和一个无效等价类。例如,在Pascal语言中对变量标识符规定为“以字母打头的……串”。那么所有以字母打头的构成有效等价类,而不在此集合内(不以字母打头)的归于无效等价类。第一百零八页,共575页。

(3)按数值划分:如果规定了输入数据的一组值,而且程序要对每个输入值分别进行处理。这时可为每一个输入值确立一个有效等价类,此外针对这组值确立一个无效等价类,它是所有不允许的输入值的集合。第一百零九页,共575页。例如,在教师上岗方案中规定对教授、副教授、讲师和助教分别计算分数,做相应的处理。因此可以确定4个有效等价类为教授、副教授、讲师和助教,一个无效等价类,它是所有不符合以上身分的人员的输入值的集合。

(4)按限制条件或规则划分:如果规定了输入数据必须遵守的规则,则可以确立一个有效等价类(符合规则)和若干个无效等价类(从不同角度违反规则)。第一百一十页,共575页。例如,Pascal语言规定“一个语句必须以分号‘;’结束”。这时,可以确定一个有效等价类“以‘;’结束”,若干个无效等价类“以‘:’结束”、“以‘,’结束”、“以‘’结束”、“以LF结束”等。确立测试用例

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

第一百一十一页,共575页。再从划分出的等价类中按以下原则选择测试用例:

(1)

为每一个等价类规定一个唯一编号;

(2)

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

(3)

设计一个新的测试用例,使其仅覆盖一个尚未被覆盖的无效等价类,重复这一步,直到所有的无效等价类都被覆盖为止。第一百一十二页,共575页。

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

在某一PASCAL语言版本中规定:“标识符是由字母开头,后跟字母或数字的任意组合构成。有效字符数为8个,最大字符数为80个。” 并且规定:“标识符必须先说明,再使用。”“在同一说明语句中,标识符至少必须有一个。”

第一百一十三页,共575页。用等价类划分方法,建立输入等价类表:第一百一十四页,共575页。下面选取了9个测试用例,它们覆盖了所有的等价类。

①VARx,T1234567:REAL;

BEGINx:=3.414;

T1234567:=2.732;

...…(1),(2),(4),(8),(9),(12),(14)

②VAR:REAL;

(3)

③VARx,:REAL;(5)

第一百一十五页,共575页。④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;第一百一十六页,共575页。边界值分析边界值分析也是一种黑盒测试方法,是对等价类划分方法的补充。人们从长期的测试工作经验得知,大量的错误是发生在输入或输出范围的边界上,而不是在输入范围的内部。因此针对各种边界情况设计测试用例,可以查出更多的错误。

第一百一十七页,共575页。比如,在做三角形计算时,要输入三角形的三个边长:A、B和C。我们应注意到这三个数值应当满足

A>0、B>0、C>0、

A+B>C、A+C>B、B+C>A,才能构成三角形。但如果把六个不等式中的任何一个大于号“>”错写成大于等于号“≥”,那就不能构成三角形。问题恰出现在容易被疏忽的边界附近。第一百一十八页,共575页。这里所说的边界是指,相当于输入等价类和输出等价类而言,稍高于其边界值及稍低于其边界值的一些特定情况。使用边界值分析方法设计测试用例,首先应确定边界情况。应当选取正好等于,刚刚大于,或刚刚小于边界的值做为测试数据,而不是选取等价类中的典型值或任意值做为测试数据。边界值分析方法是最有效的黑盒测试方法,但当边界情况很复杂的时候,要找出适当的测试用例还需针对问题的输入域、输出域边界,耐心细致地逐个考虑。

第一百一十九页,共575页。错误推测法人们也可以靠经验和直觉推测程序中可能存在的各种错误,从而有针对性地编写检查这些错误的例子。这就是错误推测法。错误推测法的基本想法是:列举出程序中所有可能有的错误和容易发生错误的特殊情况,根据它们选择测试用例。第一百二十页,共575页。例如,输入数据为0,或输出数据为0是容易发生错误的情形,因此可选择输入数据为0,或使输出数据为0的例子作为测试用例。又例如,输入表格为空或输入表格只有一行,也是容易发生错误的情况。可选择表示这种情况的例子作为测试用例。再例如,可以针对一个排序程序,输入空的值(没有数据)、输入一个数据、让所有的输入数据都相等、让所有输入数据有序排列、让所有输入数据逆序排列等,进行错误推测。

第一百二十一页,共575页。因果图前面介绍的等价类划分方法和边界值分析方法,都是着重考虑输入条件,但未考虑输入条件之间的联系。如果在测试时必须考虑输入条件的各种组合,可能的组合数将是天文数字。因此必须考虑使用一种适合于描述对于多种条件的组合,相应产生多个动作的形式来考虑设计测试用例,这就需要利用因果图。因果图方法最终生成的就是判定表。它适合于检查程序输入条件的各种组合情况。第一百二十二页,共575页。用因果图生成测试用例的基本步骤

(1)

分析软件规格说明描述中,哪些是原因(即输入条件或输入条件的等价类),哪些是结果(即输出条件),并给每个原因和结果赋予一个标识符。

(2)

分析软件规格说明描述中的语义,找出原因与结果之间,原因与原因之间对应的是什么关系?根据这些关系,画出因果图。

第一百二十三页,共575页。

(3)

由于语法或环境限制,有些原因与原因之间,原因与结果之间的组合情况不可能出现。为表明这些特殊情况,在因果图上用一些记号标明约束或限制条件。

(4)

把因果图转换成判定表。

(5)

把判定表的每一列拿出来作为依据,设计测试用例。

第一百二十四页,共575页。在因果图中出现的基本符号

通常在因果图中用Ci表示原因,用Ei表示结果,各结点表示状态,可取值“0”或“1”。“0”表示某状态不出现,“1”表示某状态出现。主要的原因和结果之间的关系有:第一百二十五页,共575页。表示约束条件的符号

为了表示原因与原因之间,结果与结果之间可能存在的约束条件,在因果图中可以附加一些表示约束条件的符号。第一百二十六页,共575页。

例如,有一个处理单价为5角钱的饮料的自动售货机软件测试用例的设计。其规格说明如下:若投入5角钱或1元钱的硬币,押下〖橙汁〗或〖啤酒〗的按钮,则相应的饮料就送出来。若售货机没有零钱找,则一个显示〖零钱找完〗的红灯亮,这时在投入1元硬币并押下按钮后,饮料不送出来而且1元硬币也退出来;若有零钱找,则显示〖零钱找完〗的红灯灭,在送出饮料的同时退还5角硬币。”第一百二十七页,共575页。(1)分析这一段说明,列出原因和结果

原因:1.

售货机有零钱找

2.

投入1元硬币

3.

投入5角硬币

4.

押下橙汁按钮

5.

押下啤酒按钮

建立中间结点,表示处理中间状态

11.

投入1元硬币且押下饮料按钮

12.

押下〖橙汁〗或〖啤酒〗的按钮

13.

应当找5角零钱并且售货机有零钱找

14.

钱已付清

第一百二十八页,共575页。

结果:21.

售货机〖零钱找完〗灯亮

22.

退还1元硬币

23.

退还5角硬币

24.

送出橙汁饮料

25.

送出啤酒饮料

(2)画出因果图。所有原因结点列在左 边,所有结果结点列在右边。

(3)

由于2与3,4与5不能同时发生,

分别加上约束条件E。

(4)因果图

(5)转换成判定表第一百二十九页,共575页。

第一百三十页,共575页。由因果图得到的判定表第一百三十一页,共575页。在判定表中,阴影部分表示因违反约束条件的不可能出现的情况,删去。第16列与第32列因什么动作也没做,也删去。最后可根据剩下的16列作为确定测试用例的依据。因果图方法是一个非常有效的黑盒测试方法,它能够生成没有重复性的且发现错误能力强的测试用例,而且对输入、输出同时进行了分析。第一百三十二页,共575页。黑盒测试方法选择的综合策略Myers提出了使用各种测试方法的综合策略:在任何情况下都必须使用边界值分析方法。经验表明用这种方法设计出测试用例发现程序错误的能力最强。必要时用等价类划分方法补充一些测试用例用错误推测法再追加一些测试用例。对照程序逻辑,检查已设计出的测试用例的逻辑覆盖程度。如果没有达到要求的覆盖标准,应当再补充足够的测试用例。如果程序的功能说明中含有输入条件的组合情况,则一开始就可选用因果图法。第一百三十三页,共575页。软件测试的过程与策略测试过程按4个步骤进行:开始是单元测试,集中对用源代码实现的每一个程序单元进行测试,检查各个程序模块是否正确地实现了规定的功能。组装测试把已测试过的模块组装起来,主要对与设计相关的软件体系结构的构造进行测试。确认测试则是要检查已实现的软件是否满足了需求规格说明中确定了的各种需求,以及软件配置是否完全、正确。系统测试把已经经过确认的软件纳入实际运行环境中,与其它系统成份组合在一起进行测试。严格地说,系统测试已超出了软件工程的范围第一百三十四页,共575页。第一百三十五页,共575页。单元测试(UnitTesting)单元测试又称模块测试,是针对软件设计的最小单位─程序模块,进行正确性检验的测试工作。其目的在于发现各模块内部可能存在的各种差错。单元测试需要从程序的内部结构出发设计测试用例。多个模块可以平行地独立进行单元测试。第一百三十六页,共575页。1.单元测试的内容在单元测试时,测试者需要依据详细设计说明书和源程序清单,了解该模块的I/O条件和模块的逻辑结构,主要采用白盒测试的测试用例,辅之以黑盒测试的测试用例,使之对任何合理的输入和不合理的输入,都能鉴别和响应。

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

第一百三十九页,共575页。在做内外存交换时要考虑:文件属性是否正确;

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

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

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

第一百四十一页,共575页。(3)路径测试选择适当的测试用例,对模块中重要的执行路径进行测试。应当设计测试用例查找由于错误的计算、不正确的比较或不正常的控制流而导致的错误。对基本执行路径和循环进行测试可以发现大量的路径错误。第一百四十二页,共575页。(4)错误处理测试出错的描述是否难以理解出错的描述是否能够对错误定位显示的错误与实际的错误是否相符对错误条件的处理正确与否在对错误进行处理之前,错误条件是否已经引起系统的干预等第一百四十三页,共575页。(5)边界测试注意数据流、控制流中刚好等于、大于或小于确定的比较值时出错的可能性。对这些地方要仔细地选择测试用例,认真加以测试。如果对模块运行时间有要求的话,还要专门进行关键路径测试,以确定最坏情况下和平均意义下影响模块运行时间的因素。

第一百四十四页,共575页。2.单元测试的步骤通常单元测试在编码阶段进行。在源程序代码编制完成,经过评审和验证,确认没有语法错误之后,就开始进行单元测试的测试用例设计。利用设计文档,设计可以验证程序功能、找出程序错误的多个测试用例。对于每一组输入,应有预期的正确结果。模块并不是一个独立的程序,在考虑测试模块时,同时要考虑它和外界的联系,用一些辅助模块去模拟与被测模块相联系的其它模块。

驱动模块(driver)

:相当于被测模块的主程序。它接收测试数据,把这些数据传送给被测模块,最后输出实测结果。

桩模块(stub)──存根模块:用以代替被测模块调用的子模块。桩模块可以做少量的数据操作,不需要把子模块所有功能都带进来,但不允许什么事情也不做。

第一百四十五页,共575页。单元测试的测试环境第一百四十六页,共575页。如果一个模块要完成多种功能,且以程序包或对象类的形式出现,例如Ada中的包,MODULA中的模块,C++中的类。可以将这个模块看成由几个小程序组成。必须对其中的每个小程序先进行单元测试要做的工作,对关键模块还要做性能测试。对支持某些标准例程的程序,更要着手进行互联测试。有人把这种情况特别称为模块测试,以区别单元测试。第一百四十七页,共575页。组装测试(IntegratedTesting)组装测试(集成测试、联合测试)通常,在单元测试的基础上,需要将所有模块按照设计要求组装成为系统。这时需要考虑的问题是:在把各个模块连接起来的时侯,穿越模块接口的数据是否会丢失;一个模块的功能是否会对另一个模块的功能产生不利的影响;各个子功能组合起来,能否达到预期要求的父功能;全局数据结构是否有问题;单个模块的误差累积起来,是否会放大,从而达到不能接受的程度。在单元测试的同时可进行组装测试,发现并排除在模块连接中可能出现的问题,最终构成要求的系统。第一百四十八页,共575页。

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

第一百四十九页,共575页。1一次性组装方式(bigbang)它是一种非增殖式组装方式。也叫做整体拼装。使用这种方式,首先对每个模块分别进行模块测试,然后再把所有模块组装在一起进行测试,最终得到要求的软件系统。由于程序中不可避免地存在涉及模块间接口、全局数据结构等方面的问题,所以一次试运行成功的可能性并不很大。第一百五十页,共575页。第一百五十一页,共575页。2.增殖式组装方式这种组装方式又称渐增式组装首先对一个个模块进行模块测试,然后将这些模块逐步组装成较大的系统在组装的过程中边连接边测试,以发现连接过程中产生的问题通过增殖逐步组装成为要求的软件系统。

第一百五十二页,共575页。(1)自顶向下的增殖方式这种组装方式将模块按系统程序结构,沿控制层次自顶向下进行组装。自顶向下的增殖方式在测试过程中较早地验证了主要的控制和判断点。在一个功能划分合理的程序结构中,判断常出现在较高的层次,较早就能遇到。如果主要控制有问题,尽早发现它能够减少以后的返工。选用按深度方向组装的方式,可以首先实现和验证一个完整的软件功能。第一百五十三页,共575页。第一百五十四页,共575页。(2)自底向上的增殖方式这种组装的方式是从程序模块结构的最底层的模块开始组装和测试。因为模块是自底向上进行组装,对于一个给定层次的模块,它的子模块(包括子模块的所有下属模块)已经组装并测试完成,所以不再需要桩模块。在模块的测试过程中需要从子模块得到的信息可以直接运行子模块得到。

第一百五十五页,共575页。第一百五十六页,共575页。自顶向下增殖方式的缺点是需要建立桩模块。要使桩模块能够模拟实际子模块的功能将是十分困难的。同时涉及复杂算法和真正输入/输出的模块一般在底层,它们是最容易出问题的模块,到组装和测试的后期才遇到这些模块,一旦发现问题,导致过多的回归测试。自顶向下增殖方式的优点是能够较早地发现在主要控制方面的问题。自底向上增殖方式的缺点是“程序一直未能做为一个实体存在,直到最后一个模块加上去后才形成一个实体”。就是说,在自底向上组装和测试的过程中,对主要的控制直到最后才接触到。自底向上增殖方式的优点是不需要桩模块,而建立驱动模块一般比建立桩模块容易,同时由于涉及到复杂算法和真正输入/输出的模块最先得到组装和测试,可以把最容易出问题的部分在早期解决。此外自底向上增殖的方式可以实施多个模块的并行测试。第一百五十七页,共575页。(3)混合增殖式测试衍变的自顶向下的增殖测试首先对输入/输出模块和引入新算法模块进行测试;

再自底向上组装成为功能相当完整且相对独立的子系统;

然后由主模块开始自顶向下进行增殖测试。第一百五十八页,共575页。自底向上自顶向下的增殖测试首先对含读操作的子系统自底向上直至根结点模块进行组装和测试;

然后对含写操作的子系统做自顶向下的组装与测试。回归测试这种方式采取自顶向下的方式测试被修改的模块及其子模块;

然后将这一部分视为子系统,再自底向上测试。以检查该子系统与其上级模块的接口是否适配。第一百五十九页,共575页。关键模块问题在组装测试时,应当确定关键模块,对这些关键模块及早进行测试。关键模块的特征:

①满足某些软件需求;

②在程序的模块结构中位于较高的层次(高层控制模块);

③较复杂、较易发生错误;

④有明确定义的性能要求。

第一百六十页,共575页。确认测试(ValidationTesting)确认测试又称有效性测试。任务是验证软件的功能和性能及其它特性是否与用户的要求一致。对软件的功能和性能要求在软件需求规格说明书中已经明确规定。它包含的信息就是软件确认测试的基础。第一百六十一页,共575页。第一百六十二页,共575页。1.进行有效性测试(黑盒测试)有效性测试是在模拟的环境(可能就是开发的环境)下,运用黑盒测试的方法,验证被测软件是否满足需求规格说明书列出的需求。首先制定测试计划,规定要做测试的种类。还需要制定一组测试步骤,描述具体的

温馨提示

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

评论

0/150

提交评论