第三章 白盒测试(2)_第1页
第三章 白盒测试(2)_第2页
第三章 白盒测试(2)_第3页
第三章 白盒测试(2)_第4页
第三章 白盒测试(2)_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

1、1第第3章章 白盒测试白盒测试目目录录l白盒测试基本概念l 控制流分析l 数据流分析l其他白盒分析方法数据流分析数据流分析控制流测试是面向程序的结构;数据流测试是面向程序中的变量。程序中变量的两种作用:1.数据与变量相绑定(将数据存储)2.与变量相绑定的数据被引用(将存储的数据取出)4l一、基本概念l变量的定义性出现:若一个变量在程序中的某处出现使数据与该变量相绑定,则称该出现是定义性出现。l变量的引用性出现:若一个变量在程序中的某处出现使与该变量相绑定的数据被引用,则称该出现是引用性出现。l 计算性引用:用于计算新的数据。 谓词性引用:判断控制转移方向的谓词引用。如x:=y+z,表示将“=”

2、右边的计算结果存放在该变量x所对应的存储空间内,即将数据与变量绑定5数据流测试思路数据流测试思路测试程序中数据的定义与使用是否正确,即,运行程序中从数据被绑定给一个变量之处到这个数据被引用之处的路径,即测试这样的路径,通过它把一个变量的定义性出现传递到该变量的一个引用性出现。优势:用数据流测试方法更能有效地发现软件缺陷。劣势:在度量测试覆盖率和选择测试路径的时候,数据流测试很困难。63.数据流测试数据流测试l二、数据流覆盖准则l定义覆盖测试准则(P58 定义3.21)l引用覆盖测试准则(P59 定义3.22)l定义引用覆盖测试准则(P59 定义3.23)73. 3.数据流测试数据流测试定义引用

3、覆盖准则引用覆盖准则定义覆盖准则其他白盒测试方法其他白盒测试方法l程序插装l程序变异l代码审查9程序插装程序插装什么是程序插装?什么是程序插装?程序插装方法简单地说是借助在被测程序中插入检查点的方法,来实现白盒测试的目的。程序插装的目的:程序插装的目的:通过测试这些检查点的信息,可以了解执行过程中程序的一些动态特性。如程序的实际执行路径,或是特定变量在特定时刻的取值。 通过程序插装技术我们可以了解一个程序在某次运行中所有可执行语句被覆盖(或称被经历)的情况,或是每个语句的实际执行次数。103.程序插装程序插装l以 计算 整数 X和 整数 Y的 最大 公约 数程 序为例。11我们有时把插入的语句

4、称为“探测器”或“探针”,借以实现“探查”或“监控”的功能。12注意问题注意问题l程序插装技术的研究涉及下列几个问题:l(1)探测哪些信息?l(2)程序的什么位置设置探测点?l(3)需要多少探测点?l(1)(2)需要结合具体程序分析。l(3)需要考虑如何设置最少探测点,达到测试的目的。13程序插装类型程序插装类型l用于测试覆盖率和测试用例有效性度量的程序插装 l用于断言检测的程序插装 (判断变量特性的语句):即当程序执行到这里时,必须是什么,否则,就会产生错误。143.程序插装程序插装断言语句 在程序中特定部位插入某些用以判断变量特性的语句,使得程序执行中这些语句得以证实,从而使程序的运行特性

5、得到证实。我们把插入的这些语句称为断言。这一做法是程序正确性证明的基本步骤,尽管算不上严格的证明,但方法本身仍然是很实用的。下面以求两个非负数NUM和DEN之商的Wensley迭代算法为例,对断言语句的作用做一简要说明。15procedure DIVIDE(NUM,DEN,E,Q) *E is the accuracy required.E0.Q is both * * the result at exit and at any interim stage. * *A.B and W are the other elements of the program vector.* Q:=0 A:=

6、0 B:=DEN/2 W:=1 until WE loop if(NUMAB)0 then Q:=Q+W/2 A:=A+B endif B:=B/2 W:=W/2 endloop end 16procedure DIVIDE(NUM,DEN,E,Q) *E is the accuracy required.E0.Q is both * * the result at exit and at any interim stage. * *A.B and W are the other elements of the program vector.* Q:=0 A:=0 B:=DEN/2 W:=1

7、K:=0 until WE loop assert W=1/2*K assert A=DEN*Q assert B=DEN*W/2 assert NUM/DEN WQ and QNUM/DEN if(NUM A B)0 then Q:=Q+W/2 A:=A+B endif B:=B/2 W:=W/2 K:=K+1 endloop assert NUM/DEN WQ and QNUM/DEN end 17程序变异程序变异l经过多年的测试理论与实践研究,人们发现要找出程序中的所有错误是不可能的,现实的解决办法是尽可能缩小错误搜索的范围,这样做的好处是,便于集中目标于对软件危害较大的错误,暂时忽略危

8、害较小的错误,以此取得较高的测试效率,降低测试成本。l程序变异是一种错误驱动测试,是针对某种类型的特定程序错误而提出来的。l程序变异测试的分类:(1)程序强变异测试(通常称:程序变异)(2)程序弱变异测试18基本思想基本思想程序变异(Program Mutation)测试技术的基本思想是:对于给定的程序P,先假定程序中存在一些小错误,每假设一个错误,程序P就变成P,如果假设了n个错误:e1,e2,en,则对应有n个不同的程序:P1,P2,Pn,这里Pi称为P的变异因子。理论上,若P正确, Pi肯定错误,即存在测试数据Ci,使得P和Pi的输出结果是不同的。因此,根据程序P和每个变异的程序,可以求

9、得P1,P2,Pn的测试数据集C=C1,C2,Cn。运行C,如果对每一个Ci,P都是正确的,而Pi都是错误的,这说明P的正确性较高。如果对某个Ci,P是错误的,而Pi是正确的,这说明P存在错误,而错误就是ei。变异测试的缺点是它需要大量的计算机资源来完成测试充分性分析。对于一个中等规模的软件,所需的存储空间也是巨大的,运行大量变异因子也导致了时间上巨大的开销。实际使用中,对故障类型难以把握,因此,变异测试局限性很大。19l给定一个程序P和一个测试数据集T,通过变异算子为P产生一组变异体Mi(合乎语法的变更),对P和M都使用T进行测试运行,如果某Mi在某个测试输入t上与P产生不同的结果,则该Mi

10、被杀死;若某Mi在所有的测试数据集上都与P产生相同的结果,则称其为活的变异体。接下来对活的变异体进行分析,检查其是否等价于P;对不等价于P的变异体M进行进一步的测试,直到充分性度量达到满意的程度。20l假设程序P已使用测试T中的测试用例测试通过,而且没有错误。变异是一种轻微改变程序的操作。Example: Program 11 begin 2 int x,y;3 input (x,y);4 if (x y)5 output(x+y)6else 7 output(x*y);8end Program 1的变异体M11 begin 2 int x,y;3 input (x,y);4 if (xy)5

11、 output(x+y)6else 7 output(x*y);8end Program 1的变异体M21 begin 2 int x,y;3 input (x,y);4 if (x y)5 output(x+y)6else 7 output(x/y);8end Changed to PP21lP称为P的变异体l如果对于T中的测试t,有P(t)P(t),称作P与P有区别( distinguishes),或者t杀死(killed)P.l如果T中所有的测试 t使得P(t)=P(t),称T不能区别P和P。那么称在测试过程中P是活的(live).l如果在程序P的输入域中不存在任何测试用例t使得P与P

12、区别,则称P等价于P。l如果P不等价于P,而且T中没有测试能够将P与P区别,则认为T是不充分的。l不等价而且是活的变异体为测试人员提供了一个生成新测试用例的机会,进而增强测试T。 程序变异步骤程序变异步骤22l第1步:程序执行lP(t)表示给定测试用例t,程序P的执行结果由P中变量的输出值表示(也可能与P的性能有关)l如果P已经采用测试T测试通过,测试结果已保存至数据库中,则这一步可以跳过。l不论何种情况,第一步的结果是对于T中的所有t,P(t)数据库对T中的每一个测试用例,测试P对于T中所有的t,P(t)测试集T(1)23l第2步:生成变异体l例如“”运算变成“”运算,“”运算变成“/”运算

13、等l系统的生成方法:通过变异算子生成l第二步的结果是:活的变异体l这些变异体还没有与程序P区分,即没有被杀死。生成变异体活的变异体L被测试程序P(2)24l第3步和第4步:选择下一个变异体l从L中选择,任意选择活的变异体L下一个变异体M所有的变异体 都遍历了的吗?(3)yesNoM25l第5步和第6步:选择下一个测试用例l是否存在测试t能够区分变异体与被测试程序Pl采用测试T中的测试用例执行变异体M。l结束:所有的测试用例执行完毕或者M被某个测试用例区别(杀掉)。选择下一个测试用例t所有的测试 都完成了吗?测试集T(5)(6)yesNoMt26l第7,8和9步:变异体执行和分类l变异体执行的结

14、果是否与P的执行结果相同或不同l第10步:活变异体l如果没有测试用例能够区分变异体与P,则该变异体存活,并被放回活变异体集合L中。P(t)=M(t)?对于T中所有的t,P(t)选用测试用例t执行M(8)(7)M(t)P(t)NoYest活的变异体L所有的测试 都完成了吗?将M放回L(5)(10)NoyesM27l第11步:等价变异体l如果对于程序P的输入域中的每一个输入,变异体M的执行结果等于P的执行结果,则认为M等价于P。l例活的变异体L确定并从L移出等价的变异体等价的变异体E(11)Example: Program 11 begin 2 int x,y;3 input (x,y);4 if

15、 (x y)5 output(x+y)6else 7 output(x*y);8end Program 1的变异体M1 begin 2 int x,y;3 input (x,y);4 if (x y+1)5 output(x+y)6else 7 output(x*y);8end 测试t: 使得P(t)=2,M (t)=1,M不等价于P28l第12步:变异数的计算l量化评价指标:l1代表相关于变异T是充分的l1表示相关于变异T是不充分的l可以通过增加额外的测试用例提高变异数lT的变异数记为MS(T)其中:|D|表示:杀死的变异体数 |L|表示:表示活的变异体数 |E|表示:等价的变异体数 |M|

16、表示:第2步生成的所有变异体数计算变异的分数杀掉的变异体D等价的变异体E(12)关于变异的T的充分性EMD)(TMSDLD)(TMS或29l P使用测试T并测试通过 t1:,t2:,t3:,t4:lM使用T运行的结果与P相同,无法区分P与Ml增加一个测试用例 ,使P和M区别,表明增强了TExample: Program 11 begin 2 int x,y;3 input (x,y);4 if (x y)5 output(x+y)6else 7 output(x*y);8end Program 1的变异体M1 begin 2 int x,y;3 input (x,y);4 if (x y+1)

17、5 output(x+y)6else 7 output(x*y);8end 30白盒测试工具白盒测试工具l一、静态工具(不执行程序的情况下)l静态测试工具类型:1.代码审查2.一致性检查3.错误检查4.接口分析5.输入/输出规格说明分析检查6.数据流分析7.类型分析8.单元分析9.复杂度分析LogiscopeAudit(P66)31l二、动态工具l动态测试工具类型:1.功能确认与接口测试 测试包括对各模块功能、模块间的接口、局部数据结构、主要执行路径、错误处理等方面进行的测试。2.覆盖测试 覆盖分析对所涉及的程序结构元素进行度量,以确定测试执行的充分性。32软件缺陷分析软件缺陷分析软件缺陷简单

18、说就是指对软件产品预期属性的偏离现象。即存在于软件(文档、数据、程序)之中的那些不希望,或不可接受的偏差,而导致软件产生的质量问题。按照一般的定义,只要符合下面5个规则中的一个,就叫做软件缺陷。33l软件未达到软件规格说明书中规定的功能;l软件超出软件规格说明书中指明的范围;l软件未达到软件规格说明书中指出的应达到的目标;l软件运行出现错误;l软件测试人员认为软件难于理解,不易使用,运行速度慢,或者最终用户认为软件使用效果不好。34影响软件缺陷数目的因素:宏观上:包括管理水平、技术、测试水平等。微观上:软件规模、复杂度、类型、测试工具、测试自动化程度、测试支撑环境、开发成本等。35l一、软件缺

19、陷的种类(P80)1.输入/输出缺陷 2.逻辑缺陷 3.计算缺陷 4.接口缺陷 5.数据缺陷 36l二、软件缺陷的产生1.疏忽造成的错误(Carelessness defect,CD)2.不理解造成的错误(Misapprehend defect,MD)3.二义性造成的错误(Ambiguity defect,AD)4.遗漏造成的错误(Skip defect,SD)其中:MD,AD,SD主要存在于软件开发的前期阶段,如需求分析阶段,设计阶段,编码阶段。检测概率较大,容易测试。37lCD错误(必然的,不可预测,不可估计):1.显式约束造成的错误:A是程序的一个元素(一条语句或语句的一部分,或语句的集

20、合),在A之前或之后要跟另外一个动作B,则称显式约束。如果B不存在或B不是A所要求的,则都是错误。2.隐式约束造成的错误:A是程序中一个元素,根据程序的语义,A必须满足某些约束,否则就是错误。例如:数组越界错误,非法计算类错误等。38l软件缺陷可能存在于软件过程的每一个阶段,各阶段所占的比例如图:软件需求报告56%设计27%编码7%其它10%39l三、软件缺陷数目估计1.撒播模型(利用概率论,类似于估计一个大箱子中乒乓球的个数) 原理:用人工随机的向待估算的软件置入错误,然后进行测试,待测试到足够长的时间后,对所测试到的错误进行分类,看看哪个是人工置入的错误,哪个是程序中固有的错误;然后根据上

21、述公式即可估算出程序中所有的错误。mnnMNNMmnN*40此方法估计的准确性不高,原因如下:(1)程序中固有的缺陷是未知的,每个错误被检测的难易程度也同样是未知的。(2)人工置入的缺陷是否和程序中存在缺陷检测的难易程度一致也是未知的。41Hyman提出另外一种模型:假设软件总的排错时间是X个月,假设经过排错程序中将不再存在错误。让两个人共同对程序进行排错,经过足够长(X的一半或更少)的排错时间后,第一个人发现了n个错误,第二个人发现了m个错误,其中属于两个人共同发现的错误有m1个 此方法估计精度高于前一个,但由于两人水平不一,实际难以达到准确的估计。1mmnNnmmN*1422.静态模型 思

22、想:软件越大越复杂,残留的故障数目也就越多。lAkiyama模型: N=486十0018*L。其中:N是缺陷数;L是可执行的源语句数目。l谓词模型:N=C+J其中:C是谓词数目;J是子程序数目。lHalstead模型:N=V/3000。其中:V=xlny,x=x1+x2,y=y1+y2x1:程序中使用操作符的总次数;x2:程序中使用操作数的总次数;y1:程序中使用操作符的种类;y2:程序中使用操作数的种类; 43lLipow模型:N=L*(A0+A1InL+A21n2L)。Fortran语言:A0=0.0047,A1=0.023,A2=0.000043。汇编语言:A0=0.0012,A1=0.0001,A2=0.000002。lGaffnev模型:N=4.2十0.0015L43。 lCompton and Withrow模型:N=0.069十0.00156L十0.00000047L2。 44l3.根据测试覆盖率的预测模型 错误与时间曲线 错误与覆盖率曲线 错误数时间t1错误数覆盖率0.50.9545 覆盖率与时间曲线 覆盖率时间t146l四、软件缺陷的发现、排除及效率分析1.软件测试的检测效率分析 软件测试阶段 测试能力 非形式化的设计检查 25%40% 形式化的

温馨提示

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

评论

0/150

提交评论