白盒测试方法
覆盖测试
路径测试
最少测试用例数计算
白盒测试:
白盒测试是把测试对象看做一个透明的盒子,它允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试。
白盒测试也称结构测试或逻辑驱动测试,是针对被测单元内部是如何进行工作的测试。它根据程序的控制结构设计测试用例,主要用于软件或程序验证。
定义:基于系统或者组件的内部实现结构和逻辑寻找缺陷的测试技术
常用测试方法:
逻辑覆盖法(逻辑驱动测试)
基本路径测试方法
白盒测试注意事项:
- 由于测试路径可能非常多,由于时间和资源问题,选出足够多的路径测试
- 由于深入到程序编码,通常开发人员协助测试人员书写白盒测试用例
- 在进行白盒测试之前,一定要根据说明书建立黑盒测试用例。用这种方式可以真正测试模块的用意。
- 如果先从模块的白盒子角度建立测试用例,就会受到代码和注释的影响,而忽略模块的真正意图。
- 白盒测试的局限: 不可能进行彻底的白盒测试
基本路径测试:
根据程序的控制流图找出一个模块所需测试的基本路径,根据这些基本路径设计构造相应的测试用例。
设计步骤:
- 根据模块逻辑构造控制流图(Flow Graph)
- 计算控制流图的环复杂度 (Cyclomatic Complexity)
- 列出包含起始节点和终止节点的基本路径
- 检查一下列出的基本路径数目是否超过控制流图的环复杂度
- 设计覆盖这些基本路径的测试用例
控制流图:
由节点和边组成的有向图。
- 节点代表了代码或程序流程图中矩形框中所表示的处理,菱形表示的判断处理以及判断处理流程相交的汇合点,在图中用标有编号的圆圈表示
- 边表明了控制的顺序,在图中用有向箭头表示
环复杂度:
用V(G)表示;用来衡量一个模块判定结构的复杂程度,在数量上表现为独立的路径条数,是需要测试的基本路径的上限。
计算公式:
V(G) = 闭合区域的数目。
由节点和边围成的封闭区域
- 这些封闭区域一定是不可再分的
- 包括周边的区域
V(G)=二值判定节点个数+1
V(G)=边的数目-节点的数目+2
基本路径:
一条路径是基本路径如果:
- 是一条从起始节点到终止节点的路径
- 至少包含一条其他基本路径没有包含的边。(至少引入一个新处理语句或一个新判断的程序通路)
注意:对于循环而言,基本路径应包含不执行循环和执行一次循环体。
基本路径不一定是测试用例,得可行才行
案例分析,两种基本路径的寻找方式。
案例一(以复合条件为节点):
结论:如果基本路径必须是可行的,则逻辑关系会压缩基本路径集合数量,因此环复杂度是包含起始点和终止点的基本路径数目的上限
白盒测试法:
白盒测试法检查程序内部逻辑结构,对所有逻辑路径进行测试,是一种穷举路径的测试方法。但即使每条路径都测试过了,仍然可能存在错误。因为:
穷举路径测试无法检查出程序本身是否违反了设计规范,即程序是否是一个错误的程序。
穷举路径测试不可能查出程序因为遗漏路径而出错。
穷举路径测试发现不了一些与数据相关的错误。
采用白盒测试方法必须遵循一些几条原则,才能达到测试的目的:
- 保证一个模块中的所有独立路径至少被测试一次
- 所有逻辑值均需测试真 (true) 和假 (false) 两种情况
- 检查程序的内部数据结构,保证其结构的有效性
- 在上下边界及可操作范围内运行所有循环
逻辑覆盖法:
覆盖测试:
测试覆盖率,逻辑覆盖法,测试覆盖准则
测试覆盖率:用于确定测试所执行到的覆盖项的百分比。其中的覆盖项是指作为测试基础的一个入口或属性,比如语句、分支、条件等。
测试覆盖率可以表示出测试的充分性,在测试分析报告中可以作为量化指标的依据,测试覆盖率越高效果越好。但覆盖率不是目标,只是一种手段。
例如:一个程序总代码为100行,使用测试用例运行一次,执行了75行代码,则
代码覆盖率=75%
测试覆盖率包括功能点覆盖率和结构覆盖率:
功能点覆盖率大致用于表示软件已经实现的功能与软件需要实现的功能之间的比例关系。
结构覆盖率包括语句覆盖率、分支覆盖率、循环覆盖率、路径覆盖率等等。
根据覆盖目标的不同,逻辑覆盖又可分为语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖和路径覆盖。
- 语句覆盖:选择足够多的测试用例,使得程序中的每个可执行语句至少执行一次。
- 判定覆盖:通过执行足够的测试用例,使得程序中的每个判定至少都获得一次"真"值和"假"值, 也就是使程序中的每个取"真"分支和取"假"分支至少均经历一次,也称为"分支覆盖"。
- 条件覆盖:设计足够多的测试用例,使得程序中每个判定包含的每个条件的可能取值(真/假)都至少满足一次。
- 判定/条件覆盖:设计足够多的测试用例,使得程序中每个判定包含的每个条件的所有情况(真/假)至少出现一次,并且每个判定本身的判定结果(真/假)也至少出现一次。
——满足判定/条件覆盖的测试用例一定同时满足判定覆盖和条件覆盖。
- 组合覆盖:通过执行足够的测试用例,使得程序中每个判定的所有可能的条件取值组合都至少出现一次。
——满足组合覆盖的测试用例一定满足判定覆盖、条件覆盖和判定/条件覆盖。
- 路径覆盖:设计足够多的测试用例,要求覆盖程序中所有可能的路径。
设计原则:
测试用例尽量少,覆盖率尽量高。
逻辑覆盖法包含关系:
实例:
语句覆盖:
判定覆盖:
条件覆盖:
判定条件覆盖:
组合覆盖:
路径覆盖:
测试覆盖的准则:
- 逻辑覆盖的出发点是合理的、完善的。所谓"覆盖",就是想要做到全面而无遗漏,但逻辑覆盖并不能真正做到无遗漏。
- ESTCA覆盖准则:在容易发生问题的地方设计测试用例,即重视程序中谓词(条件判断)的取值
- ESTCA覆盖准则是一套错误敏感用例分析规则。这一规则虽然并不完备,但在普通程序中却是有效的。原因在于这是一种经验型的覆盖准则,规则本身针对了程序编写人员容易发生的错误,或是围绕着发生错误的频繁区域,从而提高了发现错误的命中率。具体规则如下:
[规则1] 对于A rel B型 (rel可以是<、= 或 >) 的分支谓词,应适当的选择A与B的值,使得测试执行到该分支语句时,A<B、A=B、A>B的情况分别出现一次。
——这是为了检测逻辑符号写错的情况,如将"A<B"错写为"A>B"。
[规则2] 对于A rel C型 (rel可以是>或<, A是变量,C是常量)的分支谓词:当rel为<时,应适当的选择A的值,使A=C-M (M是距C最小的机器容许正数,若A和C都为正整数时,M=1);当rel为>时,应适当的选择A的值,使A=C+M。
——这是为了检测"差1"之类的错误,如"A>1"错写成"A>0"。
[规则3] 对外部输入变量赋值,使其在每一个测试用例中均有不同的值与符号,并与同一组测试用例中其他变量的值与符号不同。
——这是为了检测程序语句中的错误,如应该引用某一变量而错成引用另一个常量。
其他白盒测试方法:
循环测试,数据流测试,程序插桩
循环测试:
关注循环体结构的正确性,对循环变量运用类似于边界值测试的方法以验证循环体结构的正确性。
四种不同类型的循环结构
- 简单循环
- 嵌套循环
- 连接循环
- 非结构循环
数据流测试:
测试思想:
- 根据被测模块中变量的定义和使用路径,发现代码中如引用未定义变量、对以前未曾使用的变量再次赋值等数据流异常情况。
- 导致这些异常情况原因是由于代码存在名字拼错、名字混淆或是语句遗漏等缺陷。
- 构造其定义——使用路径设计相应的测试用例。
程序插桩:
- "插桩":通过在源代码中加入记录信息语句,以便进行运行信息的追踪和调试,统计有关的运行资源状况。
- 程序插桩方法:借助往被测程序中插入操作,来实现测试目的的方法,即向源程序中添加一些语句,实现对程序语句的执行、变量的变化等情况进行检查。
- 如print语句(最简单的插桩)
- 插桩技术是实现各种覆盖测试的必要手段
最少测试用例数计算: