第九章软件测试二.docx
- 文档编号:5646485
- 上传时间:2022-12-30
- 格式:DOCX
- 页数:6
- 大小:20.25KB
第九章软件测试二.docx
《第九章软件测试二.docx》由会员分享,可在线阅读,更多相关《第九章软件测试二.docx(6页珍藏版)》请在冰豆网上搜索。
第九章软件测试二
第九章:
软件测试
(二)
1.软件测试用例设计
设计测试用例就是为测试准备测试数据。
由于测试用例不同,发现程序错误的能力也就不同,为了提高测试效率降低测试成本,应该选用高效的测试用例。
白盒测试用例设计主要采用逻辑覆盖,包括语句覆盖、判定覆盖、条件覆盖、判定—条件覆盖、条件组合覆盖和路径覆盖。
黑盒测试用例设计包括等价划分、边界值分析和错误推测等几种方法。
通常的做法是,用黑盒法设计基本的测试方案,再用白盒法补充一些必要的测试方案。
具体地说,可以使用下述策略结合各种方法:
(1)在任何情况下都应该使用边界值分析的方法。
经验表明,用这种方法设计出的测试用例暴露程序错误的能力最强。
(2)必要时用等价划分法补充测试用例。
(3)必要时再用错误推测法补充测试用例。
(4)对照程序逻辑,检查已经设计出的测试方案。
可以根据对程序可靠性的要求采用不同的逻辑覆盖标准。
1.1白盒测试用例设计
白盒测试用例设计主要采用的是逻辑覆盖,这是一种以程序内部逻辑结构为依据的用例设计方法,包括语句覆盖、判定覆盖、条件覆盖、判定—条件覆盖、条件组合覆盖和路径覆盖等几种覆盖强度各不相同的逻辑覆盖形式。
(1)语句覆盖为了暴露程序中的错误,至少每个语句应该执行一次。
语句覆盖的含义是,选择足够多的测试数据,使被测程序中每个语句至少执行一次。
(2)判定覆盖判定覆盖含义是:
不仅每个语句必须至少执行一次,而且每个判定的每种可能的结果都应该至少执行一次。
判定覆盖能够包含语句覆盖,因此判定覆盖比语句覆盖强。
(3)条件覆盖条件覆盖的含义是:
不仅每个语句至少执行一次,而且使判定表达式中的每个条件都取到各种可能的结果。
(4)判定-条件覆盖判定-条件覆盖是指既能满足判定覆盖,又能满足条件覆盖,其含义是:
选取足够多的测试数据,使得判定表达式中的每个条件都取到各种可能的值,而且每个判定表达式也都取到各种可能的结果。
(5)条件组合覆盖条件组合覆盖是更强的逻辑覆盖标准,它要求选取足够多的测试数据,使得每个判定表达式中条件的各种可能组合都至少出现一次。
(6)点覆盖点覆盖的含义是:
选取足够多的测试数据,使得程序执行路径至少经过了程序图中每个节点一次。
显然,点覆盖标准和语句覆盖标准是相同的。
(7)边覆盖边覆盖的含义是:
选取足够多的测试数据,使得程序执行路径至少经过程序图中每条边一次。
通常,边覆盖和判定覆盖是一致的。
(8)路径覆盖路径覆盖的含义是:
选取足够多的测试数据,使程序的每条可能的路径都至少执行一次(如果程序图中有环,则要求每个环至少经过一次)。
1.2黑盒测试用例设计
(1)等价类划分
等价类划分的特点是把所有可能的输入数据(有效的和无效的)划分成若干个等价类,并做出如下假定:
每个等价类中的一个典型值在测试中的作用与这一类中所有其他值的作用相同。
因此,可以从每个等价类中只取一组数据作为测试数据。
在使用等价类划分法设计测试用例时,首先需要划分输入数据的等价类,为此需要研究程序的功能说明,从而确定输入数据的有效等价类和无效等价类。
在确定输入数据的等价类时,常常还需要分析输出数据的等价类,以便根据输出数据的等价类导出对应的输入数据的等价类。
例如,学生成绩的录入与输出。
假如录入的是百分制成绩,范围是:
0—100分;输出的是等级制成绩,等级是:
优秀(85—100分)、合格(60—84分)、不合格(0—59分)。
则根据等价划分划分的原则,可以考虑以下的用例设计方案。
根据录入数据,可以确定以下3个等价类:
<0(无效类)
>=0并且录入数据<=100(有效类)
>100(无效类)
根据输出结果,还可以将录入数据的有效类继续细分为以下3个等价类:
>=85并且录入数据<=100(有效类)
>=60并且录入数据<85(有效类)
>=0并且录入数据<60(有效类)
因此,根据对录入数据与输出结果的综合考虑,可以从上述5个等价类中各取一个数据组成一组测试用例,如:
–20,20,80,90,120划分等价类往往需要经验,下面几条规则可能有助于等价类的划分:
a.如果规定了输入值的范围,则可划分出一个有效的等价类(输入值在此范围内),两个无效的等价类(输入值小于最小值和大于最大值)。
b.如果规定了输入数据的个数,则类似地也可以划分出一个有效的等价类和两个无效的等价类。
c.如果规定了输入数据的一组值,而且程序对不同输入值做不同处理,则每个允许的输入值是一个有效的等价类,此外还有一个无效的等价类(任一个不允许的输入值)。
d.如果规定了输入数据必须遵循的规则,则可以划分出一个有效的等价类(符合规则)和若干个无效的等价类(从各种不同角度违反规则)。
e.如果规定了输入数据为整型,则可以划分出正整数、零和负整数等三个有效类;如果程序的处理对象是表格,则应该使用空表以及含一项或多项的表。
在划分出等价类以后,接着可以按以下步骤进行用例设计:
a.设计一个新的测试用例,以尽可能多地覆盖尚未被覆盖的有效等价类,重复这一步骤直到所有有效等价类都被覆盖为止。
b.设计一个新的测试用例,使它覆盖一个而且只覆盖一个尚未被覆盖的无效等价类,重复这一步骤直到所有无效等价类都被覆盖为止。
(注意:
通常程序发现一类错误后就不再检查是否还有其他错误,因此,应该使每个测试用例只覆盖一个无效的等价类。
)
(2)边界值分析
经验表明,程序在处理边界问题时最容易发生错误。
例如,数组下标、条件判断、循环的边界处可能出现遗漏或错误。
因此,需要在边界处设计专门的测试用例,用于发现程序运行在边界附近时,是否会发生错误。
例如前面的学生成绩的录入与输出问题。
其在0、60、85、100这些边界点上最容易出错。
如下面的语句:
if(grade>=85)&&(grade<=100)printf(“优秀”);其中,就有可能因为编码疏忽,而使条件式grade>=85漏了一个“=”号,由此使得85分不能输出结果。
在使用边界值分析方法设计测试用例时,首先需要确定边界情况,然后在边界附近选取测试数据,应该选取刚好等于、稍小于和稍大于等价类边界值的数据作为测试数据。
例如学生成绩的录入与输出问题。
可以按照边界值分析原则设计出以下一组测试用例。
即:
(–1,0,1),(59,60,61),(84,85,86),(99,100,101)。
(3)错误推测
错误推测法依靠测试人员的测试经验与直觉。
它的基本想法是列举出程序中可能有的错误和容易发生错误的特殊情况,并且根据它们选择测试用例。
例如前面单元测试中列出的一些常见错误,就是模块测试经验的总结。
对于程序中容易出错的情况,也可以总结出一些经验来。
例如,输入数据为零或输出数据为零往往容易发生错误;在进行数据表操作时,一个没有任何记录的空表容易带来操作错误;等等。
程序中的错误还具有成堆聚集的特点,也就是说,一段程序中已经发现的错误数目往往和尚未发现的错误数成正比。
这可能与设计、编码时的工作疏忽或理解错误等因素有关。
因此,一旦在程序的某个位置发现了错误,则意味着需要对这段程序进行重点测试,应该着重测试那些已发现了较多错误的程序段。
2.面向对象测试
2.1面向对象单元测试不能孤立地测试单个操作,而应该把操作作为类的一部分来测试。
2.2面向对象集成测试面向对象软件是基于类而构造的,类之间的关系是依赖与引用关系。
因此,面向对象软件中已经没有了分层的控制结构,传统的自顶向下和自底向上的集成策略也就没有意义了
面向对象软件的集成测试可以采用以下两种策略。
(1)基于线程的测试:
其特点是把响应系统的一个输入或一个事件所需要的一组类集成起来。
分别集成并测试每个线程,同时应用回归测试以保证没有产生副作用。
(2)基于使用的测试:
其特点是首先测试几乎不使用其他类的那些类,称为独立类。
在把独立类都测试完之后,接下来测试使用独立类的下一个层次的类,称为依赖类。
对依赖类的测试一个层次一个层次地持续进行下去,直至构造出整个软件系统为止
2.3面向对象确认测试研究系统的用例模型和活动模型,设计出确认测试时的用户操作脚本。
与传统的确认测试一样,面向对象确认测试也是面向用户的,其主要测试内容是用户可见的动作和用户可识别的输出。
3.软件调试
软件调试也叫做排错,涉及以下两个步骤。
(1)诊断:
用于确定程序中出现错误的性质与错误位置。
(2)排错:
对出现错误的程序段进行修改,由此排除错误。
在进行软件调试的上述两个步骤中,诊断是关键。
3.1调试方法
常用的调试方法有:
输出存储器内容、在程序中插入输出语句、使用自动调式工具。
(1)输出存储器内容
这种方法通常以八进制或十六进制的形式输出存储器的内容。
这是一种效率很低的调试方法,其主要缺点是:
a.很难把存储单元和源程序变量对应起来。
b.输出信息量极大,而且大部分是无用的信息。
c.输出的是程序的静态映像,然而为了找出故障,往往需要研究程序的动态行为。
d.输出的存储器内容常常并不是程序出错时的状态,使其往往不能提供有用的调试线索。
e.输出信息的形式不易阅读和解释。
(2)在程序中插入输出语句
这种方法是把程序设计语言提供的一些输出语句插到源程序的关键位置中去,以便输出关键变量的中间值。
这种方法能够对源程序的执行情况进行一定的动态追踪,能够显示程序的动态行为,而且给出的信息容易和源程序对应起来。
这种方法的缺点主要是:
a.可能会输出大量的需要分析的信息,对于大型系统来说,情况更是如此。
b.必须修改源程序才能插入输出语句,这有可能改变一些关键的时间关系,从而可能掩盖错误。
(3)使用自动调式工具
使用自动调式工具进行程序调试是目前使用最多的调试方法。
在一些集成开发环境中,自动调式工具往往和整个程序创建工作结合在一起,因此可以非常有效地提高程序调试速度与质量。
自动调式工具一般具有对程序的动态调试功能,能够发现程序运行过程中出现的错误。
自动调式工具主要的调试功能包括逐行或逐过程地执行源程序、在源程序中设置中断点、在源程序中设置需要监控的变量或表达式等。
3.2调试策略
调试策略是指在对程序进行调试时可以采取的对策。
常用的调试策略有:
试探法、回溯法、对分查找法、归纳法、演绎法。
(1)试探法调试人员分析错误征兆,猜测故障的大致位置,然后使用前述的一两种调试方法检测程序中被怀疑位置附近的信息,由此获得对程序错误的准确定位。
(2)回溯法调试人员分析错误征兆,确定最先发现“症状”的位置,然后人工沿程序的控制流程往回追踪源程序代码,直到找出错误根源或确定故障范围为止。
回溯法对于小程序而言是一种比较好的调试策略,但是对于大规模的程序,由于需要回溯的路径数目太多,以致回溯变得困难起来。
(3)对分查找法如果已经知道每个变量在程序内若干个关键点的正确值,则可以用赋值语句或输入语句在程序中点附近“注入”这些变量的正确值,然后检查程序的输出。
如果输出结果是正确的,则故障在程序的前半部分;反之,故障在程序的后半部分。
对于程序中有故障的那部分再重复使用这个方法,直到把故障范围缩小到容易诊断的程度为止。
(4)归纳法归纳法是一种从个别推断一般的系统化的错误定位方法。
归纳法往往以程序的错误征兆为线索,通过分析这些线索之间的关系,由此找出故障。
归纳法的使用主要有下述四个步骤:
a.收集有关的数据
列出已经知道的关于程序工作的一切数据,然后分析哪些数据结果是正确的,哪些数据结果是错误的。
b.组织数据
因为归纳法是从特殊推断出一般的方法,所以需要整理数据以便发现规律。
常用的组织数据的方法是对数据进行分类。
c.导出假设
分析线索之间的关系,力求找出它们的规律,从而提出关于故障的一个或多个假设。
如果无法做出推测,则可以再设计并执行一些测试用例,以便获得更多的数据;如果可以做出多种假设,则可以首先选取最有可能成为出错原因的那一个假设。
d.证明假设
假设不等于事实,不经证明就根据假设排除故障,往往只能消除错误的征兆或只能改正部分错误。
因此,需要对假设的合理性证明。
证明假设的方法是,用它解释所有原始的测试结果。
如果能圆满地解释一切现象,则假设得到证实,否则要么是假设不成立或不完备,要么是有多个故障同时存在。
(5)演绎法演绎法则从一般原理或前提出发,经过排除和精化的过程推导出结论。
使用演绎法进行程序调试时,需要先列出所有看来可能成立的原因或假设,然后一个一个地排除列举出的原因,最后,证明剩下的原因确实是错误的根源。
演绎法的使用主要有下述四个步骤:
a.列出所有可能的原因
根据错误信息,将所有可能的原因以假设形式列举出来,对于这些假设,这时并不需要对它们作出任何解释,而只是将它们作为可能的原因提出来。
b.用已有的数据排除不正确的假设
仔细分析已有的数据,寻找矛盾,力求排除前一步列出的假设。
如果所有列出的假设都被排除了,则需要提出新的假设,如果余下的假设多于一个,则首先选取最有可能成为出错原因的那一个假设。
c.精化余下的假设
利用已知的线索进一步精化余下的假设,使之更具体化,以便精确确定故障的位置。
d.证明余下的假设
这一步非常重要,具体做法与归纳法的第4步相同。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第九 软件 测试