毕业设计(论文)软件测试方法与测试过程的分析与研究.doc

上传人:文库蛋蛋多 文档编号:3985037 上传时间:2023-03-30 格式:DOC 页数:67 大小:497KB
返回 下载 相关 举报
毕业设计(论文)软件测试方法与测试过程的分析与研究.doc_第1页
第1页 / 共67页
毕业设计(论文)软件测试方法与测试过程的分析与研究.doc_第2页
第2页 / 共67页
毕业设计(论文)软件测试方法与测试过程的分析与研究.doc_第3页
第3页 / 共67页
毕业设计(论文)软件测试方法与测试过程的分析与研究.doc_第4页
第4页 / 共67页
毕业设计(论文)软件测试方法与测试过程的分析与研究.doc_第5页
第5页 / 共67页
点击查看更多>>
资源描述

《毕业设计(论文)软件测试方法与测试过程的分析与研究.doc》由会员分享,可在线阅读,更多相关《毕业设计(论文)软件测试方法与测试过程的分析与研究.doc(67页珍藏版)》请在三一办公上搜索。

1、第一章 绪论1.1软件测试概念和目的1.1.1软件测试的概念软件测试是为了发现错误而执行程序的过程,测试只能找出程序中的错误,而不能证明程序无错。也就是说软件测试就是使用人工或者自动手段来运行或测试某个系统的过程,其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别。它是帮助识别开发完成(中间或最终的版本)的计算机软件(整体或部分)的正确度(correctness)、完全度(completeness)和质量(quality)的软件过程;是SQA(software quality assurance)的重要子域。1.1.2软件测试的目的Grenford J.Myers曾对软件测试

2、的目的提出过以下观点:(1)测试是为了发现程序中的错误而执行程序的过程;(2)好的测试方案是极可能发现迄今为止尚未发现的错误的测试方案;(3)成功的测试是发现了至今为止尚未发现的错误的测试。然而,这种观点指出测试是以查找错误为中心,而不是为了演示软件的正确功能.但是只从字面意思理解,可能会产生误导,认为发现错误是软件测试的唯一目的,查找不出错误的测试就是没有价值的测试,实际上并非如此!(1)测试并不仅仅是为了找出错误.通过分析错误产生的原因和错误的发生趋势,可以帮助项目管理者发现当前软件开发过程中的缺陷,以便及时改进;(2)这种分析也能帮助测试人员设计出有针对性的测试方法,改善测试的效率和有效

3、性;(3)没有发现错误的测试也是有价值的,完整的测试是评定软件质量的一种方法。1.1.3软件测试框图说明修复事故缺陷缺陷缺陷错误错误错误错误需求规格说明设计编码测试缺陷分类缺陷隔离缺陷解决图11 软件测试框图1.2 软件测试原则和分类1.2.1 软件测试的基本原则为了进行有效的测试,测试工程师必须掌握软件测试的基本原则,软件测试的几大原则:1.所有的测试都应追溯到用户需求;2.软件开发人员即程序员应当避免测试自己的程序;3.应尽早地和不断地进行软件测试;4.对测试用例要有正确的态度;5.人以群分,物以类聚,软件测试也不例外,一定要充分注意软件测试中的群集现象,即“Pareto原则”;6.严格执

4、行测试计划,排除测试的随意性,以避免发生疏漏或者重复无效的工作;7.应当对每一个测试结果进行全面检查;8.妥善保存测试用例、测试计划、测试报告和最终分析报告,以备回归测试及维护之用。在遵守以上原则的基础上进行软件测试,可以以最少的时间和人力找出软件中的各种缺陷,从而达到保证软件质量的目的。1.2.2 软件测试的分类软件测试的技术和方法是多种多样的,对于软件测试技术,可以从不同的角度加以分类。1.从是否关心软件内部结构和具体实现的角度(即按测试方法)划分为白盒测试和黑盒测试。2.从是否执行程序的角度(即按测试方式)划分为静态测试和动态测试。3.从软件开发的过程按阶段(即按测试过程)划分为单元测试

5、、集成测试、确认测试、系统测试和验收测试。这四个过程相互独立且顺序相接,依次进行。4.从用户的需求(即测试目的)划分为功能测试、健壮性测试、接口测试和性能测试。此外,按照测试目的划分还包括强度测试、压力测试、用户界面测试、安全测试、可靠性测试、安装反安装测试、文档测试、恢复测试和兼容性测试。1.3软件测试的复杂性与经济性1.3.1软件测试的复杂性设计测试用例是一项细致并需要高度技巧的工作,稍有不慎就会顾此失彼,发生不应有的疏漏。不论是黑盒测试方法还是白盒测试方法,由于测试情况数量巨大,都不可能进行彻底的测试。所谓彻底测试,就是让被测程序在一切可能的输入情况下全部执行一遍。通常也称这种测试为“穷

6、举测试”。 “黑盒”法是穷举输入测试,只有把所有可能的输入都作为测试情况使用,才能以这种方法查出程序中所有的错误。实际上测试情况有无穷多个,人们不仅要测试所有合法的输入,而且还要对那些不合法但是可能的输入进行测试。 “白盒”法是穷举路径测试,贯穿程序的独立路径数是天文数字,但即使每条路径都测试了仍然可能有错误。第一,穷举路径测试决不能查出程序违反了设计规范,即程序本身是个错误的程序。第二,穷举路径测试不可能查出程序中因遗漏路径而出错。第三,穷举路径测试可能发现不了一些与数据相关的错误。ewdijkstra的一句名言对测试的不彻底性作了很好的注解:“程序测试只能证明错误的存在,但不能证明错误不存

7、在”。在实际测试中,穷举测试工作量太大,实践上行不通,这就注定了一切实际测试都是不彻底的。当然就不能够保证被测试程序中不存在遗留的错误。1.3.2软件测试的经济性软件工程的总目标是充分利用有限的人力和物力资源,高效率、高质量地完成测试。为了降低测试成本,选择测试用例时应注意遵守“经济性”的原则。第一,要根据程序的重要性和一旦发生故障将造成的损失来确定它的测试等级;第二,要认真研究测试策略,以便能使用尽可能少的测试用例,发现尽可能多的程序错误。掌握好测试量是至关重要的,一位有经验的软件开发管理人员在谈到软件测试时曾这样说过:“不充分的测试是愚蠢的,而过度的测试是一种罪孽”。测试不足意味着让用户承

8、担隐藏错误带来的危险,过度测试则会浪费许多宝贵的资源。第二章 软件测试基本技术2.1软件测试技术概述通常人们把软件测试技术归结为两大类:白盒测试和黑盒测试。白盒测试又可分为静态测试和动态测试。静态测试技术不要求在计算机上实际执行所测程序,主要以一些人工的模拟技术对软件进行分析和测试。它主要包括代码检查法、静态结构分析法等;动态测试技术是通过输入一组预先按照一定的测试准则构造的实例数据来动态运行程序,而达到发现程序错误的过程。它主要包括程序插桩、逻辑覆盖、基本路径测试等。黑盒测试一般可分为功能测试和非功能测试两大类;功能测试主要包括等价类划分、边值分析、因果图法、错误推测、功能图法等,主要用于软

9、件确认测试;非功能测试主要包括使用性能测试、性能测试、强度测试、兼容性测试、配置测试、安全测试等。对任何工程产品都可以使用白盒测试和黑盒测试两种方法之一进行测试。2.2 白盒测试技术2.2.1白盒测试的概述白盒测试也称结构测试或逻辑驱动测试,它是按照程序内部的结构测试程序,通过测试来检测产品内部动作是否按照设计规格说明书的规定正常进行,检验程序中的每条通路是否都能按预定要求正确工作。这一方法是把测试对象看作一个打开的盒子,测试人员依据程序内部逻辑结构相关信息,设计或选择测试用例,对程序所有逻辑路径进行测试,通过在不同点检查程序的状态,确定实际的状态是否与预期的状态一致。白盒测试的测试方法有代码

10、检查法、静态结构分析法、静态质量度量法、逻辑覆盖法、基本路径测试法、域测试、符号测试、Z路径覆盖、程序变异。白盒测试法的覆盖标准有逻辑覆盖、循环覆盖和基本路径测试。逻辑覆盖测试分支结构,循环覆盖测试循环结构。其中逻辑覆盖代码的覆盖深度是不同的,从覆盖源程序语句的详尽程度分析包括语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖。白盒法全面了解程序内部逻辑结构、对所有逻辑路径进行测试。白盒法是穷举路径测试。在使用这一方案时,测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据。贯穿程序的独立路径数是天文数字。但即使每条路径都测试了仍然可能有错误。第一,穷举路径测试决

11、不能查出程序违反了设计规范,即程序本身是个错误的程序。第二,穷举路径测试不可能查出程序中因遗漏路径而出错。第三,穷举路径测试可能发现不了一些与数据相关的错误。2.2.2白盒测试的工具白盒测试目前主要用在具有高可靠性要求的软件领域,例如:军工软件、航天航空软件、工业控制软件等等。白盒测试工具在选购时应当主要是对开发语言的支持、代码覆盖的深度、嵌入式软件的测试、测试的可视化等。对开发语言的支持:白盒测试工具是对源代码进行的测试,测试的主要内容包括词法分析与语法分析、静态错误分析、动态检测等。但是对于不同的开发语言,测试工具实现的方式和内容差别是较大的。目前测试工具主要支持的开发语言包括:标准C、C

12、+、Visual C+、Java、Visual J+、Visual unit等。不同的测试工具对于代码的覆盖能力也是不同的,通常能够支持修正条件判定覆盖的测试工具价格是极其昂贵的。嵌入式软件的测试:对于嵌入式软件的测试,我们还需要一方面进一步考虑测试工具对于嵌入式操作系统的支持能力,例如DOS、Vxworks、Neculeus、Linux和Windows CE等;另一方面还需要考虑测试工具对于硬件平台的支持能力,包括是否支持所有64/32/16位CPU 和 MCU,是否可以支持 PCI/VME/CPCI 总线。测试的可视化:白盒测试是工作量巨大并且枯燥的工作,可视化的设计对于测试来说是十分重要

13、的。在选购白盒测试工具时,应当考虑该款测试工具的可视化是否良好,例如:测试过程中是否可以显示覆盖率的函数分布图和上升趋势图,是否使用不同的颜色区分已执行和未执行的代码段显示分配内存情况实时图表等,这些对于测试效率和测试质量的提高是具有很大的作用的。2.2.3 白盒测试的方法介绍1. 白盒测试之基本路径法白盒测试的测试方法有代码检查法、静态结构分析法、静态质量度量法、逻辑覆盖法、基本路径测试法、域测试、符号测试、Z路径覆盖、程序变异。其中运用最为广泛的是基本路径测试法。基本路径测试法是在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径集合,从而设计测试用例的方法。设计出的测

14、试用例要保证在测试中程序的每个可执行语句至少执行一次。在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径集合,从而设计测试用例。包括以下4个步骤和一个工具方法:(1) 程序的控制流图:描述程序控制流的一种图示方法。(2) 程序圈复杂度:McCabe复杂性度量。从程序的环路复杂性可导出程序基本路径集合中的独立路径条数,这是确定程序中每个可执行语句至少执行一次所必须的测试用例数目的上界。(3) 导出测试用例:根据圈复杂度和程序结构设计用例数据输入和预期结果。(4) 准备测试用例:确保基本路径集中的每一条路径的执行。基本路径测试的工具方法:图形矩阵:是在基本路径测试中起辅助作用

15、的软件工具,利用它可以实现自动地确定一个基本路径集。程序的控制流图:描述程序控制流的一种图示方法。圆圈称为控制流图的一个结点,表示一个或多个无分支的语句或源程序语句流图只有二种图形符号:图中的每一个圆称为流图的结点,代表一条或多条语句。流图中的箭头称为边或连接,代表控制流任何过程设计都要被翻译成控制流图。如何根据程序流程图画出控制流程图呢?在将程序流程图简化成控制流图时,应注意:在选择或多分支结构中,分支的汇聚处应有一个汇聚结点。 边和结点圈定的区域叫做区域,当对区域计数时,图形外的区域也应记为一个区域。 基本路径测试法的步骤:第一步:画出控制流图流程图用来描述程序控制结构。可将流程图映射到一

16、个相应的流图(假设流程图的菱形决定框中不包含复合条件)。在流图中,每一个圆,称为流图的结点,代表一个或多个语句。一个处理方框序列和一个菱形决测框可被映射为一个结点,流图中的箭头,称为边或连接,代表控制流,类似于流程图中的箭头。一条边必须终止于一个结点,即使该结点并不代表任何语句(例如:if-else-then结构)。由边和结点限定的范围称为区域。计算区域时应包括图外部的范围。图2.1控制流程图和控制流图 第二步:计算圈复杂度圈复杂度是一种为程序逻辑复杂性提供定量测度的软件度量,将该度量用于计算程序的基本的独立路径数目,为确保所有语句至少执行一次的测试数量的上界。独立路径必须包含一条在定义之前不

17、曾用到的边。有以下三种方法计算圈复杂度:流图中区域的数量对应于环型的复杂性;给定流图G的圈复杂度V(G),定义为V(G)=E-N+2,E是流图中边的数量,N是流图中结点的数量;给定流图G的圈复杂度V(G),定义为V(G)=P+1,P是流图G中判定结点的数量。第三步:导出测试用例根据上面的计算方法,可得出四个独立的路径。一条独立路径是指,和其他的独立路径相比,至少引入一个新处理语句或一个新判断的程序通路。V(G)值正好等于该程序的独立路径的条数。下面我们通过一个实例来说明基本路径测试。例:请看以下代码,它由C+语言书写,把它转化成图形矩阵,最后请使用基本路径测试法为变量temp设计测试用例,使之

18、满足基本路径覆盖要求。/*1*/ void ReadPara( CString temp)/*2*/ /*3*/ if ( temp = = =)/*4*/ m_oper.SetCurSel(0);/*5*/ else/*6*/ /*7*/ if (temp = = )/*8*/ m_oper.SetCurSel(1);/*9*/ else/*10*/ /*11*/ if ( temp = = = =)/*12*/ m_oper.SetCurSel(2);/*13*/ else/*14*/ /*15*/ if( temp = = =)/*16*/ m_oper.SetCurSel(3);/*1

19、7*/ Else/*18*/ /*19*/ if ( temp = = =”)m_oper.SetCurSel(0)Path 2ReadPara(”)m_oper.SetCurSel(1)Path 3ReadPara(”=”)m_oper.SetCurSel(2)Path 4ReadPara(”)m_oper.SetCurSel(3)Path 5ReadPara(”=”)m_oper.SetCurSel(4)Path 6ReadPara(”+”)m_oper.SetCurSel(5)2. 白盒测试之程序插桩在软件测试中,常常要用到一种“插桩”技术,通过在源代码中加入记录信息语句,以便进行运行信

20、息的追踪和调试,统计有关的运行资源状况。想做插桩,可以思考以下几点:(1)如果出现在语句中包含了return语句,怎么在它前面插入指定语句?同时保证语句的语法合法性? 例如: for ( j=0;j1 and b=0 then x=x/aif a=2 or x1 then x=x+1(a)流程图 (b)程序图acbed1426357s图2.3被测试代码段的流程图和被测试代码段的程序图(1)语句覆盖 为了暴露程序中的错误,至少每个语句应该执行一次。语句覆盖的含义是,选择足够多的测试数据,使被测程序中每个语句至少执行一次。例如选择测试数据a=2,b=0,x=3能够覆盖语句c、e。(2)判定覆盖判定

21、覆盖又叫分支覆盖,它的含义是,不仅每个语句必须至少执行一次,而且每个判定的每种可能的结果都应该至少执行一次,也就是每个判定的每个分支都至少执行一次。选择两组测试数据: a=3,b=0,x=1(通过路径1453) a=2,b=1,x=2(通过路径1267)(3)条件覆盖 条件覆盖的含义是,不仅每个语句至少执行一次,而且使判定表达式中的每个条件都取到各种可能的结果。上述两个判定表达式中有4个条件: a1, b=0, a=2, x1选择两组测试数据: a=2,b=0,x=3(使a1,b=0,a=2,x1为真,通过路径14567) a=1,b=1,x=1(使a1,b=0,a=2,x1为假,通过路径12

22、3)选择另外两组测试数据: a=1,b=0,x=3(使b=0,x1为真,a1,a=2为假,通过路径1267) a=2,b=1,x=1(使b=0,x1为假,a1,a=2为真,通过路径1267) 这两组测试数据均使a1 AND b=0为假,a=2 OR x1为真,不满足判定覆盖。所以满足条件覆盖不一定满足判定覆盖。(4)判定/条件覆盖 既然判定覆盖不一定包含条件覆盖,条件覆盖也不一定包含判定覆盖,自然会提出一种能同时满足这两种覆盖标准的逻辑覆盖,这就是判定/条件覆盖。它的含义是,选取足够多的测试数据,使得判定表达式中的每个条件都取到各种可能的值,而且每个判定表达式也都取到各种可能的结果。选择两组测

23、试用例:a=2,b=0,x=3(使a1,b=0,a=2,x1和(a1)AND(b=0), (a=2)OR(x1)为真a=1,b=1,x=1(使a1,b=0,a=2,x1和(a1)AND(b=0),(a=2)OR(x1)为假注意:若将b=0写为b0,而a1为假, x1写为x1,而a=2为真,就测试不出来。(5)条件组合覆盖 条件组合覆盖是更强的逻辑覆盖标准,它要求选取足够多的测试数据,使得每个判定表达式中条件的各种可能组合都至少出现一次。两个判定表达式共有四个条件,因此有8种组合: a1, b=0; a1, b0; a1, b=0; a1, b0 a=2, x1; a=2, x1; a2, x1

24、; a2,x1以下4组测试用例可以满足条件组合覆盖: a=2,b=0,x=2 a=2,b=1,x=1 a=1,b=0,x=2 a=1,b=1,x=1(6)路径覆盖 覆盖所有可能的路径,以下4组测试用例可以路径覆盖: a=2,b=0,x=2 a=2,b=1,x=1 a=1,b=1,x=1 a=1,b=0,x=2 但不能覆盖a1,b=0和a2,x1。所以满足路径覆盖不一定满足条件组合覆盖。 在实际的逻辑测试中,一般以条件组合覆盖为主设计测试用例,然后补充测试用例,达到路径覆盖。 4. 白盒测试之循环覆盖循环测试是一种白盒测试技术,它专注于测试循环结构的有效性。在结构化的程序中通常只有三种循环,分别

25、是简单循环、串接循环和嵌套循环,如图2.4所示。简单循环 嵌套循环 串接循环图2.4三种循环结构类型下面分别讨论不同类型循环的测试方法。 (1)简单循环应该使用下列测试集来测试简单循环,其中n是允许通过循环的最大次数。 跳过循环。 只通过循环一次。 通过循环两次。 通过循环m次,其中mn-1。 通过循环n-1,n,n+1次。【例】n=k; /为测试设置的语句i=1;while(in) i=i+1;若允许循环的最大次数为6,k取值分别为:0:跳过循环1,2:只执行1,2次循环4:执行4次循环5,6,7:执行n-1,n,n+1次循环(2)嵌套循环如果把简单循环的测试方法直接应用到嵌套循环,可能的测

26、试数就会随嵌套层数的增加按几何级数增长,这会导致不切实际的测试数目。B.Beizer提出了一种能减少测试数的方法。 从最内层循环开始测试,把所有其他循环都设置为最小值。 对最内层循环使用简单循环测试方法,而使外层循环的迭代参数(例如,循环计数器)取最小值,并为越界值或非法值增加一些额外的测试。 由内向外,对下一个循环进行测试,但保持所有其他外层循环为最小值,其他嵌套循环为“典型”值。 继续进行下去,直到测试完所有循环。(3)串接循环如果串接循环的各个循环都彼此独立,则可以使用前述的测试简单循环的方法来测试串接循环。 如果两个循环串接,而且第一个循环的循环计数器值是第二个循环的初始值,则这两个循

27、环并不是独立的。当循环不独立时,建议使用测试嵌套循环的方法来测试串接循环。白盒测试作为软件质量保证中的重要一环,对产品稳定性起到至关重要的影响,不幸的是,由于实施白盒测试有较高技术难度,该软件过程常被厂商忽略,因为难于实施,所以容易失败,失败后产生畏惧心理,就更不愿意进一步去尝试,如此形成恶性循环。我们应该克服这种心理恐惧,不畏惧“白盒测试”这只拦路虎,只要方法得当,白盒测试还是能做起来的。2.3 黑盒测试技术2.3.1 黑盒测试技术概述黑盒测试也称功能测试,它是通过测试来检测每个功能是否都能正常使用。在测试中,把程序看作一个不能打开的黑盒子,在完全不考虑程序内部结构和内部特性的情况下,在程序

28、接口进行测试,它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数据而产生正确的输出信息。黑盒测试着眼于程序外部结构,不考虑内部逻辑结构,主要针对软件界面和软件功能进行测试。黑盒测试法注重于测试软件的功能需求,主要试图发现下列几类错误:功能不正确或遗漏,界面错误,数据库访问错误,性能错误,初始化和终止错误等。 从理论上讲,黑盒测试只有采用穷举输入测试,把所有可能的输入都作为测试情况考虑,才能查出程序中所有的错误。实际上测试情况有无穷多个,人们不仅要测试所有合法的输入,而且还要对那些不合法但可能的输入进行测试。这样看来,完全测试是不可能的,所以我们要进行有针对性的测试

29、,通过制定测试案例指导测试的实施,保证软件测试有组织、按步骤,以及有计划地进行。黑盒测试行为必须能够加以量化,才能真正保证软件质量,而测试用例就是将测试行为具体量化的方法之一。具体的黑盒测试用例设计方法包括等价类划分法、边界值分析法、错误推测法、因果图法、判定表驱动法、正交试验设计法、功能图法等。2.3.2 黑盒测试方法的介绍1. 黑盒测试之等价类划分法等价类划分是一种典型的黑盒测试方法,用这一方法设计测试用例完全不考虑程序的内部结构,只根据对程序的要求和说明,即需求规格说明书。我们必须仔细分析和推敲说明书的各项需求,特别是功能需求。把说明中对输入的要求和输出的要求区别开来并加以分解。等价类划

30、分的办法是把程序的输入域划分成若干部分,然后从每个部分中选取少数代表性数据作为测试用例。每一类的代表性数据在测试中的作用等价于这一类中的其他值,也就是说,如果某一类中的一个例子发现了错误,这一等价类中的其他例子也能发现同样的错误;反之,如果某一类中的一个例子没有发现错误,则这一类中的其他例子也不会查出错误(除非等价类中的某些例子属于另一等价类,因为几个等价类是可能相交的)。使用这一方法设计测试用例,首先必须在分析需求规格说明的基础上划分等价类,列出等价类表。(1) 划分等价类和列出等价类表等价类是指某个输入域的子集合。在该子集合中,各个输入数据对于揭露程序中的错误都是等效的。并合理地假定:测试

31、某等价类的代表值就等于对这一类其他值的测试。因此,可以把全部输入数据合理地划分为若干等价类,在每一个等价类中取一个数据作为测试的输入条件,就可以用少量代表性的测试数据取得较好的测试结果。等价类划分有两种不同的情况:有效等价类和无效等价类。有效等价类:指对于程序的规格说明来说是合理的、有意义的输入数据构成的集合。利用有效等价类可检验程序是否实现了规格说明中所规定的功能和性能。无效等价类:与有效等价类的定义恰巧相反。设计测试用例时,要同时考虑这两种等价类。因为软件不仅要能接收合理的数据,也要能经受意外的考验。这样的测试才能确保软件具有更高的可靠性。下面给出6条确定等价类的原则:在输入条件规定了取值

32、范围或值的个数的情况下,可以确立一个有效等价类和两个无效等价类。在输入条件规定了输入值的集合或者规定了“必须如何”的条件的情况下,可以确立一个有效等价类和一个无效等价类。在输入条件是一个布尔量的情况下,可确定一个有效等价类和一个无效等价类。在规定了输入数据的一组值(假定n个),并且程序要对每一个输入值分别处理的情况下,可确立n个有效等价类和一个无效等价类。在规定了输入数据必须遵守的规则的情况下,可确立一个有效等价类(符合规则)和若干个无效等价类(从不同角度违反规则)。在确知已划分的等价类中,各元素在程序处理中的方式不同的情况下,则应再将该等价类进一步地划分为更小的等价类。在确立了等价类之后,建

33、立等价类表,列出所有划分出的等价类表2.1所示。表2.1等价类表示例表输入条件有效等价类无效等价类输入条件有效等价类无效等价类(2) 确定测试用例根据已列出的等价类表,按以下步骤确定测试用例:为每个等价类规定一个惟一的编号。设计一个新的测试用例,使其尽可能多地覆盖尚未覆盖的有效等价类。重复这一步,最后使得所有有效等价类均被测试用例所覆盖。设计一个新的测试用例,使其只覆盖一个无效等价类。重复这一步使所有无效等价类均被覆盖。在寻找等价区间时,想办法把软件的相似输入、输出、操作分成组。这些组就是等价区间。请看一些例子,在两数相加用例中,测试1+13和1+99999999似乎有点不同。这是一种直觉,一

34、个是普通加法,而另一个似乎有些特殊,这个直觉是对的。程序对1和最大数值相加的处理和对两个小一些的数值相加的处理有所不同。后者必须处理溢出情况。因为软件操作可能不同,所以这两个用例属于不同的等价区间。【例】根据下面给出说明,利用等价类划分的方法,给出足够的测试用例。“一个程序读入3个整数,把这3个数值看作一个三角形的3条边的长度值。这个程序要打印出信息,说明这个三角形是不等边的、是等腰的、还是等边的”。我们可以设三角形的3条边分别为A,B,C。如果它们能够构成三角形的3条边,必须满足:A0,B0,C0,且A+BC,B+CA,A+CB。如果是等腰的,还要判断A=B,或B=C,或A=C。如果是等边的

35、,则需判断是否A=B,且B=C,且A=C。列出等价类表,如表2.2所示。设计测试用例:输入顺序是【A,B,C】,如表2.3所示。表2.2 等价类表输 入 条 件有效等价类无效等价类是否三角形的3条边(A0), (1)(B0), (2)(C0), (3)(A+BC), (4)(B+CA), (5)(A+CB) (6)(A0), (7)(B0), (8)(C0), (9)(A+BC), (10)(B+CA), (11)(A+CB) (12)是否等腰三角形(A=B), (13)(B=C), (14)(C=A), (15)(AB)and(BC)and(CA),(16)是否等边三角形(A=B)and(B

36、=C)and(C=A),(17)(AB), (18)(BC), (19)(CA), (20)表2.3 测试用例列表序号【A,B,C】覆盖等价类输 出1【3,4,5】(1),(2),(3),(4),(5),(6)一般三角形2【0,1,2】(7)不能构成三角形3【1,0,2】(8)4【1,2,0】(9)5【1,2,3】(10)6【1,3,2】(11)7【3,1,2】(12)8【3,3,4】(1),(2),(3),(4),(5),(6),(13)等腰三角形9【3,4,4】(1),(2),(3),(4),(5),(6),(14)10【3,4,3】(1),(2),(3),(4),(5),(6),(15)

37、11【3,4,5】(1),(2),(3),(4),(5),(6),(16)非等腰三角形12【3,3,3】(1),(2),(3),(4),(5),(6),(17)是等边三角形13【3,4,4】(1),(2),(3),(4),(5),(6),(14),(18)非等边三角形14【3,4,3】(1),(2),(3),(4),(5),(6),(15),(19)15【3,3,4】(1),(2),(3),(4),(5),(6),(13),(20)请记住,等价分配的目标是把可能的测试用例组合缩减到仍然足以满足软件测试需求为止。因为,选择了不完全测试,就要冒一定的风险,所以必须仔细选择分类。关于等价分配最后要讲

38、的一点是,这样做有可能不客观。科学有时也是一门艺术。测试同一个复杂程序的两个软件测试员,可能会制定出两组不同的等价区间。只要审查等价区间的人都认为它们足以覆盖测试对象就可以了。2. 黑盒测试之边界值分析法人们从长期的测试工作经验得知,大量的错误是发生在输入或输出范围的边界上的,而不是在输入范围的内部。因此针对各种边界情况设计测试用例,可以查出更多的错误。例如,在做三角形计算时,要输入三角形的3个边长A、B和C。这3个数值应当满足A0、B0、C0、A+BC、A+CB、B+CA,才能构成三角形。但如果把6个不等式中的任何一个大于号“”错写成大于等于号“”,那就不能构成三角形。问题恰恰出现在容易被疏

39、忽的边界附近。这里所说的边界是指相当于输入等价类和输出等价类而言,稍高于其边界值及稍低于其边界值的一些特定情况。(1) 边界条件。我们可以想象一下,如果在悬崖峭壁边可以自信地安全行走,平地就不在话下了。如果软件在能力达到极限时能够运行,那么在正常情况下一般也就不会有什么问题。边界条件是特殊情况,因为编程从根本上说不怀疑边界有问题。奇怪的是,程序在处理大量中间数值时都是对的,但是可能在边界处出现错误。下面的一段源代码说明了在一个极简单的程序中是如何产生边界条件问题的。rem create a 10 element integer arrayrem initialize each element

40、to1dim data(10)as integerdim i as integerfor i=1 to 10data(i)=1next iend这段代码的意图是创建包含10个元素的数组,并为数组中的每一个元素赋初值1。看起来相当简单。它建立了包含10个整数的数组data和一个计数值i。For循环是从110,数组中从第1个元素到第10个元素被赋予数值1。那么边界问题在哪儿呢?在大多数开发语言脚本中,应当以声明的范围定义数组,在本例中定义语句是dim data(10)as interger,第一个创建的元素是data(0),而不是data(1)。该程序实际上创建了一个从data(0) data(1

41、0)共11个元素的数组。程序从110循环将数组元素的值初始化为-1,但是由于数组的第一个元素是data(0),因此它没有被初始化。程序执行完毕,数组值如下:data(0)=0data(6)=1data(1)=1data(7)=1data(2)=1data(8)=1data(3)=1data(9)=1data(4)=1data(10)=1data(5)=1注意data(0)的值是0,而不是1。如果这位程序员以后忘记了,或者其他程序员不知道这个数据数组是如何初始化的,那么他就可能会用到数组的第1个元素data(0),以为它的值是1。诸如此类的问题很常见,在复杂的大型软件中,可能导致极其严重的软件缺陷。(2) 次边界条件。上面讨论的普通边界条件是最容易找到的。它们在产品说明书中有定义,或者在使用软件的过程中确定。而有些边界在软件内部,最终用户几乎看不到,但是软件测试仍有必要检查。这样的边界条件称为次边界条件或者内部边界条件。寻找这样的边界不要求软件测试员具有程序员那样阅读源代码的能力,但是要求大体了解软件的工作方式。ASCII表就是这样的例子。ASCII表。另一个常见的次边界条件是ASCII字符表。如表2.5所示是部分ASCII值表的清单。表2.5 部分ASCLL值表字符ASCII值字符ASCII值字符ASCII值字符

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

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号