白盒测试方式
覆盖测试
路径测试
最少测试用例数估算
白盒测试:
白盒测试是把测试对象看做一个透明的袋子,它容许测试人员借助程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试。
白盒测试称作结构测试或逻辑驱动测试,是针对被测单元内部是怎样进行工作的测试。它按照程序的控制结构设计测试用例,主要用于软件或程序验证。
定义:基于系统或则组件的内部实现结构和逻辑找寻缺陷的测试技术
常用测试方式:
逻辑覆盖法(逻辑驱动测试)
基本路径测试方式
白盒测试注意事项:
由于测试路径可能特别多,由于时间和资源问题,选出足够多的路径测试因为深入到程序编码,通常开发人员协助测试人员书写白盒测试用例在进行白盒测试之前,一定要按照说明书构建黑盒测试用例。用这些方法可以真正测试模块的用意。如果先从模块的白袋子角度构建测试用例,就会遭到代码和注释的影响,而忽视模块的真正意图。
白盒测试的局限: 不可能进行彻底的白盒测试
基本路径测试:
根据程序的控制流图找出一个模块所需测试的基本路径,根据这种基本路径设计构造相应的测试用例。
设计步骤:
根据模块逻辑构造控制流图(Flow Graph)计算控制流图的环复杂度 (Cyclomatic Complexity)列出包含起始节点和中止节点的基本路径检测一下列举的基本路径数量是否超过控制流图的环复杂度
设计覆盖这种基本路径的测试用例
控制流图:
由节点和边组成的有向图。
节点代表了代码或程序流程图中方形框中所表示的处理,菱形表示的判定处理以及判定处理流程相交的汇合点,在图中用标有编号的圆圈表示边表明了控制的次序,在图中用有向箭头表示
#d:d:b:a:9:a:e:0:d:2:9:b:6:f:b:1:f:9:e:a:f:5:b:8:4:a:9:8:b:1:2:9#
#6:e:c:b:0:4:2:d:e:5:3:9:a:6:c:6:f:e:b:f:8:4:4:1:5:4:1:a:5:9:2:8#
环复杂度:
用V(G)表示;用来评判一个模块判断结构的复杂程度,在数目上表现为独立的路径条数,是须要测试的基本路径的上限。
计算公式:
V(G) = 闭合区域的数量。
由节点和边围成的封闭区域
这些封闭区域一定是不可再分的包括周边的区域
V(G)=二值判断节点个数+1
V(G)=边的数量-节点的数量+2
#2:3:7:c:b:0:7:6:8:6:f:c:5:e:c:d:7:1:c:e:4:0:8:1:f:c:f:d:3:4:7:d#
基本路径:
一条路径是基本路径假如:
是一条从起始节点到中止节点的路径起码包含一条其他基本路径没有包含的边。(至少引入一个新处理句子或一个新判定的程序通路)
注意:对于循环而言,基本路径应包含不执行循环和执行一次循环体。
#c:7:c:e:0:7:e:a:a:d:9:5:e:2:4:5:8:2:d:d:e:2:0:6:9:5:7:5:e:e:9:4#
#f:a:3:f:2:0:0:a:8:4:9:5:a:3:b:3:c:d:5:c:1:7:a:0:a:4:d:e:d:2:d:b#
#a:c:3:d:9:8:5:9:b:e:4:5:2:a:3:4:7:9:5:c:4:3:a:2:2:c:b:7:3:c:3:7#
基本路径不一定是测试用例,得可行才行
案例剖析,两种基本路径的找寻方法。
案例一(以复合条件为节点):
#2:8:4:f:e:7:a:c:3:c:6:d:e:8:3:9:0:7:c:7:d:5:6:3:2:f:5:f:3:4:8:6#
#0:3:c:2:0:6:7:7:3:9:a:6:c:0:b:c:8:3:f:1:0:3:1:0:6:c:4:2:5:9:c:b#
#d:8:2:d:e:a:a:e:8:6:4:d:b:6:7:2:4:8:d:2:6:e:c:8:c:3:7:1:0:7:8:4#
#9:5:0:0:e:2:0:0:f:b:7:a:9:0:3:e:5:a:0:9:6:4:d:1:f:5:e:7:0:a:6:b#
#6:1:b:7:2:6:a:0:f:6:d:2:f:f:c:e:0:9:7:4:d:a:5:f:0:2:8:d:b:d:7:a#
#4:8:b:8:2:e:e:9:0:b:7:0:4:5:9:6:d:1:4:d:d:1:4:6:1:0:2:1:a:a:0:9#
#1:5:9:1:e:d:6:c:4:f:d:7:7:8:4:e:5:e:4:8:7:a:b:1:0:c:1:1:1:7:8:9#
#1:9:8:f:9:c:9:7:5:2:2:6:9:e:1:4:f:7:1:6:e:c:f:1:6:a:4:5:a:1:0:1#
#4:9:2:7:d:8:8:2:0:7:8:7:a:b:c:1:e:5:6:a:6:d:7:a:b:5:9:b:5:c:6:e#
#b:b:3:d:1:8:9:2:8:2:0:5:3:8:c:6:d:5:5:0:9:d:9:7:0:1:2:c:3:e:d:f#
#1:0:4:c:0:f:f:e:c:1:a:1:8:e:1:b:a:8:2:7:3:2:d:b:3:b:6:a:0:0:6:2#
结论:如果基本路径必须是可行的,则逻辑关系会压缩基本路径集合数目,因此环复杂度是包含起始点和中止点的基本路径数量的上限
白盒测试法:
白盒测试法检测程序内部逻辑结构,对所有逻辑路径进行测试,是一种穷举路径的测试方式。但虽然每条路径都测试过了,仍然可能存在错误。因为:
穷举路径测试难以检测出程序本身是否违背了设计规范,即程序是否是一个错误的程序。
穷举路径测试不可能查出程序由于遗漏路径而出错。
穷举路径测试发觉不了一些与数据相关的错误。
采用白盒测试方式必须遵守一些几条原则,才能达到测试的目的:
保证一个模块中的所有独立路径起码被测试一次所有逻辑值均需测试真 (true) 和假 (false) 两种情况检测程序的内部数据结构,保证其结构的有效性在上下边界及可操作范围内运行所有循环
逻辑覆盖法:
覆盖测试:
测试覆盖率,逻辑覆盖法,测试覆盖准则
测试覆盖率:用于确定测试所执行到的覆盖项的比率。其中的覆盖项是指作为测试基础的一个入口或属性,比如句子、分支、条件等。
测试覆盖率可以表示出测试的充分性,在测试分析报告中可以作为量化指标的根据,测试覆盖率越高疗效越好。但覆盖率不是目标,只是一种手段。
#3:1:c:1:c:c:e:e:c:5:b:c:c:7:d:5:1:7:d:a:3:2:a:f:7:4:3:0:1:1:2:b#
例如:一个程序总代码为100行,使用测试用例运行一次,执行了75行代码,则
代码覆盖率=75%
测试覆盖率包括功能点覆盖率和结构覆盖率:
功能点覆盖率大致用于表示软件早已实现的功能与软件须要实现的功能之间的比列关系。
结构覆盖率包括句子覆盖率、分支覆盖率、循环覆盖率、路径覆盖率等等。
根据覆盖目标的不同,逻辑覆盖又可分为句子覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖和路径覆盖。
语句覆盖:选择足够多的测试用例,使得程序中的每位可执行句子起码执行一次。判定覆盖:通过执行足够的测试用例,使得程序中的每位判断起码都获得一次"真"值和"假"值, 也就是使程序中的每位取"真"分支和取"假"分支起码均经历一次,也称为"分支覆盖"。条件覆盖:设计足够多的测试用例,使得程序中每位判断包含的每位条件的可能取值(真/假)都起码满足一次。判定/条件覆盖:设计足够多的测试用例,使得程序中每位判断包含的每位条件的所有情况(真/假)至少出现一次,并且每位判断本身的判断结果(真/假)也起码出现一次。
——满足判断/条件覆盖的测试用例一定同时满足判断覆盖和条件覆盖。
组合覆盖:通过执行足够的测试用例,使得程序中每位判断的所有可能的条件取值组合都起码出现一次。
——满足组合覆盖的测试用例一定满足判断覆盖、条件覆盖和判断/条件覆盖。
路径覆盖:设计足够多的测试用例,要求覆盖程序中所有可能的路径。
设计原则:
测试用例尽量少,覆盖率尽量高。
逻辑覆盖法包含关系:
#d:d:d:9:9:0:a:4:7:e:1:3:0:b:2:c:f:e:4:5:e:6:c:d:7:7:5:9:b:3:c:1#
实例:
#f:e:f:0:5:3:6:6:7:9:1:2:7:2:e:f:d:a:e:6:7:f:c:4:1:7:0:b:e:0:c:8#
#b:a:e:e:e:b:4:0:c:f:4:b:f:0:9:a:e:6:9:7:9:7:c:1:c:e:d:6:b:2:a:9#
语句覆盖:
#b:2:4:6:c:0:a:3:3:c:8:e:d:7:5:3:6:c:0:a:4:6:9:8:2:0:b:4:e:5:1:b#
#e:5:9:f:7:9:4:4:9:0:9:b:d:c:4:b:a:a:f:f:f:7:7:a:b:b:4:d:4:f:0:0#
#2:0:3:d:1:d:3:0:6:4:3:6:0:2:3:f:8:d:9:1:b:3:c:0:9:a:9:1:5:7:3:f#
#4:f:3:6:d:4:c:2:3:7:b:0:6:7:2:f:b:9:b:d:0:7:4:8:8:4:e:a:0:d:8:f#
判定覆盖:
#0:3:7:a:5:0:0:7:5:f:f:6:a:4:d:a:1:1:b:e:b:7:5:3:9:a:7:8:8:1:d:a#
#d:5:4:3:b:2:3:9:6:9:6:2:8:8:f:d:f:5:8:8:6:b:d:7:6:c:3:d:c:6:3:c#
#f:9:3:9:5:8:c:c:7:3:1:4:5:e:c:0:4:0:1:f:2:b:e:1:2:f:6:8:1:4:3:3#
#9:8:9:6:6:2:3:7:5:0:6:6:9:e:a:a:8:3:7:2:3:5:0:0:1:c:3:b:6:c:3:2#
#c:1:b:3:1:8:7:5:6:d:0:4:7:2:a:2:5:d:6:0:7:0:7:5:9:5:0:1:8:2:b:d#
条件覆盖:
#1:a:4:a:8:a:6:6:a:3:5:e:7:4:c:9:a:1:6:f:e:c:9:f:d:5:1:0:f:e:f:c#
#9:8:a:2:e:f:a:2:6:d:b:f:7:9:8:d:8:3:9:d:f:c:6:9:c:5:3:c:b:c:4:5#
#0:c:4:0:b:6:a:1:6:0:8:4:4:8:0:d:1:6:8:3:4:5:9:b:9:9:c:d:0:d:6:6#
#9:7:7:9:0:2:f:f:c:0:9:0:7:b:b:4:6:5:2:5:1:b:c:e:6:b:e:0:d:3:6:1#
#9:c:a:b:6:b:3:7:7:5:b:6:9:c:c:9:b:c:d:1:5:1:1:f:9:e:2:0:a:b:d:7#
#1:e:c:9:2:6:0:3:5:f:e:7:5:5:1:3:f:3:9:f:7:9:8:8:a:f:5:b:8:3:9:5#
判定条件覆盖:
#d:7:5:7:1:3:7:b:0:b:4:1:c:d:1:0:e:a:d:0:6:0:9:5:1:8:1:8:a:2:5:1#
#5:4:6:3:c:f:9:1:a:f:3:a:8:2:d:8:8:f:e:d:d:d:4:6:1:a:8:c:d:9:2:b#
#5:6:8:d:2:7:1:a:d:b:3:d:1:9:f:6:0:1:8:f:3:5:8:3:b:f:4:a:e:7:3:c#
#5:4:9:f:1:0:9:4:5:a:c:c:0:a:8:1:0:d:b:8:c:f:b:7:3:7:5:c:a:c:0:c#
组合覆盖:
#e:b:3:7:3:b:c:c:b:5:a:7:3:9:3:4:4:6:7:2:1:4:4:4:7:d:f:9:f:9:b:5#
#f:7:c:9:e:e:9:c:2:b:1:d:f:8:9:c:3:6:7:a:9:2:6:5:c:8:c:2:2:d:b:7#
#d:2:f:3:8:b:5:a:5:7:7:e:e:7:3:0:1:0:4:6:7:1:a:c:3:7:1:1:f:6:2:a#
#8:b:4:f:8:1:4:0:f:5:4:e:a:5:9:b:b:a:6:8:a:7:f:a:4:6:3:9:0:3:0:a#
路径覆盖:
#1:e:2:b:b:c:5:b:d:3:6:a:d:4:4:4:2:0:4:5:0:7:5:a:7:c:f:3:5:d:a:1#
#d:6:c:5:0:0:9:1:3:9:c:a:a:8:2:3:e:8:9:5:9:d:8:3:f:c:d:4:2:4:2:6#
测试覆盖的准则:
其他白盒测试方式:
循环测试,数据流测试,程序插桩
循环测试:
关注循环体结构的正确性,对循环变量运用类似于边界值测试的方式以验证循环体结构的正确性。
四种不同类型的循环结构
简单循环嵌套循环连接循环非结构循环
#f:4:e:7:8:8:9:8:a:3:a:2:c:4:d:d:6:1:1:f:d:9:a:a:a:e:7:5:e:f:0:9#
#1:9:6:5:b:7:c:3:e:e:9:d:e:0:3:0:b:8:f:1:7:0:5:9:f:4:3:1:a:f:4:2#
#6:2:6:d:7:e:e:c:a:1:a:6:9:3:e:1:f:9:a:d:e:f:4:6:b:5:c:a:a:1:e:b#
#4:3:1:5:c:2:e:1:5:e:f:f:3:e:3:9:9:5:a:e:d:a:a:8:1:b:0:9:a:5:1:5#
#b:a:1:5:0:7:4:d:4:6:c:f:f:c:d:8:2:1:9:5:8:5:f:6:7:b:5:e:6:0:6:5#
数据流测试:
测试思想:
根据被测模块中变量的定义和使用路径,发现代码中如引用未定义变量、对先前从未使用的变量再度形参等数据流异常情况。导致这种异常情况缘由是因为代码存在名子拼错、名字混淆或是句子遗漏等缺陷。构造其定义——使用路径设计相应的测试用例。
#d:0:9:8:c:1:f:7:8:8:a:d:3:1:f:8:1:c:c:d:5:8:a:b:3:f:7:d:3:3:6:e#
#1:7:f:c:5:4:7:2:8:b:1:9:d:5:6:5:7:e:a:9:2:5:1:8:5:9:2:d:c:0:3:4#
程序插桩:
最少测试用例数估算: