一、白盒测试的概念和特点
1、什么是白盒测试
主要针对代码逻辑的测试,覆盖程序内部的代码,主要应用于单元测试阶段。
与黑盒测试的不同:
1. 黑盒测试不看代码,黑盒测试是根据业务需求设计输入
2. 白盒测试看代码,白盒测试是根据代码逻辑设计输入
2、白盒测试的特点
优点:代码覆盖率高
缺点:覆盖所有代码路径难度大、业务功能可能覆盖不全、测试开销大
二、白盒测试用例设计方法
1、静态方法
含义:测试过程中不去执行代码
方法:
- 桌面检查:交叉检查。自己写完的代码给别人检查,要遵循开发规范,编码要求
- 代码审查:开会。代码作者讲解代码的逻辑结构,内容等,其他人检查
- 代码走查:开会。使用测试数据检查程序运行时数据的走向
- 代码扫描工具:通过工具检查代码是否符合编码规范
2、动态方法
含义:测试过程中要执行代码
方法:
- 逻辑覆盖法
- 语句覆盖
- 判定覆盖
- 条件覆盖
- 判定条件覆盖
- 条件组合覆盖
- 路径覆盖
- 基本路径测试法
三、逻辑覆盖法
- 逻辑覆盖法:是通过对程序逻辑结构的遍历实现程序的覆盖
- 覆盖率:是用来衡量测试完整性的一个手段
- 将程序代码转化为程序流程图
案例:
1、语句覆盖
语句覆盖:设计测试用例,使得程序中每条语句至少被执行一次
例如:案例代码中共有4条可执行语句
案例(以上面的流程图为例):
100%语句覆盖的数据 | 语句 |
{x=3,y=1,magic=2} | 1、4 |
{x=-3,y=-1,magic=-2} | 2、3、4 |
语句覆盖的局限性:
- 语句覆盖标准最弱
- 语句覆盖不能准确的判断运算中的逻辑关系错误
2、判定覆盖
判定覆盖:也叫分支覆盖,设计测试用例,使得程序中的每个判断的“真”和“假”都至少被执行一次。即:程序中的每个分支至少执行一次
例如:案例代码中有判定2个,判定结果4个
案例(以上面的流程图为例):
100%判定覆盖的数据 | if(x>0&&y>0) | if(magic<0) |
{x=3,y=1,magic=2} | T | F |
{x=-1,y=0,magic=-2} | F | T |
判定覆盖的局限性:
- 只要满足了判定覆盖标准就一定满足语句覆盖标准
- 判定覆盖会忽略条件中取或(or)的情况
3、条件覆盖
条件覆盖:设计测试用例,使得判定中的每个条件至少有一次取真值,有一次取假值
例如:案例代码中有判定2个,条件3个,条件结果6个
案例(以上面的流程图为例):
100%条件覆盖的数据 | x>0 | y>0 | magic<0 | if(x>0&&y>0) | if(magic<0) | 路径 |
{x=3,y=0,magic=-2} | T | F | T | F | T | a-c-d-f |
{x=-3,y=15,magic=2} | F | T | F | F | F | a-c-e-f |
条件覆盖的局限性:
- 条件覆盖比判定覆盖增加了对判定中所有条件的测试
- 条件覆盖并不能保证判定覆盖
4、判定条件覆盖
判定条件覆盖:设计测试用例,使得被测试程序中的每个判断本身的判定结果(真假)至少满足一次,同时每个逻辑条件的可能值(真假)也至少被满足一次。即同时满足100%判定覆盖和100%条件覆盖的标准
例如:案例代码中有判定2个,条件3个,判定结果4个,条件结果6个
案例(以上面的流程图为例):
100%判定条件覆盖的数据 | x>0 | y>0 | magic<0 | if(x>0&&y>0) | if(magic<0) | 路径 |
{x=3,y=3,magic=2} | T | T | F | T | F | a-b-e-f |
{x=-3,y=0,magic=-2} | F | F | T | F | T | a-c-d-f |
判定条件覆盖的局限性:
- 满足判定条件覆盖标准一定能够满足条件覆盖、判定覆盖和语句覆盖
- 判定条件覆盖会忽略条件中取或(or)的情况
5、条件组合覆盖
条件组合覆盖:设计测试用例,使得被测试程序中的每个判定中条件结果的所有可能组合至少执行一次
例如:案例代码中有判定2个,条件3个(判定1有2个条件,判定2有一个条件),判定1的条件组合为4个,判定2的条件组合为2个
案例(以上面的流程图为例):
100%条件组合覆盖的数据 | x>0 | y>0 | magic<0 | if(x>0&&y>0) | if(magic<0) | 路径 |
{x=3,y=0,magic=-2} | T | F | T | F | T | a-c-d-f |
{x=-3,y=15,magic=2} | F | T | F | F | F | a-c-e-f |
{x=3,y=3,magic=2} | T | T | F | T | F | a-b-e-f |
{x=-3,y=0,magic=-2} | F | F | T | F | T | a-c-d-f |
条件组合覆盖的局限性:
- 条件组合覆盖能满足判定覆盖、条件覆盖、判定条件覆盖,也就包括语句覆盖
- 条件组合覆盖不能保证所有路径被执行
6、路径覆盖
路径覆盖:设计测试用例,覆盖程序中所有可能的路径
例如:案例代码中共有4条路径
案例(以上面的流程图为例):
100%条件组合覆盖的数据 | x>0 | y>0 | magic<0 | if(x>0&&y>0) | if(magic<0) | 路径 |
{x=3,y=3,magic=-2} | T | T | T | T | T | a-b-d-f |
{x=-3,y=3,magic=-2} | F | T | T | F | T | a-c-d-f |
{x=3,y=3,magic=2} | T | T | F | T | F | a-b-e-f |
{x=-3,y=15,magic=2} | F | T | F | F | F | a-c-e-f |
路径覆盖的局限性:
- 路径覆盖可以对程序进行彻底的测试,比前面五种覆盖面都广
- 满足路径覆盖,并不一定能满足条件覆盖,也就不能满足条件组合覆盖
四、基本路径测试法
1、什么是基本路径测试法
在程序控制流程图的基础上,通过分析程序的环路复杂性,导出基本可执行路径集合,从而设计测试用例
2、基本路径测试法步骤
- 根据代码画出程序控制流程图
- 计算程序的环路复杂度
- 导出可执行路径
- 设计测试用例
2.1 根据代码画出程序流程图
2.2 计算程序的环路复杂度
方法有三种:
- 流图中区域的数量对应于环型的复杂性。上图所示区域数量为4
- 给定流图G的圈复杂度V(G),定义为V(G)=E-N+2,E是流图中边的数量,N是流图中节点的数量。上图所示:V(G)=10-8+2=4
- 给定流图G的圈复杂度V(G),定义为V(G)=P+1,P是流图G中判定节点的数量。上图所示:V(G)=3+1=4
2.3 导出可执行路径
- 路径1:4-14
- 路径2:4-6-7-14
- 路径3:4-6-9-12-13-4-14
- 路径4:4-6-9-10-13-4-14
2.4 设计测试用例
测试数据 | 预期结果 | 覆盖路径 |
iRecordNum=0 | x=0 | 4-14 |
iRecordNum=1,iType=0 | x=2 | 4-6-7-14 |
iRecordNum=1,iType=1 | x=10 | 4-6-9-12-13-4-14 |
iRecordNum=1,iType=2 | x=20 | 4-6-9-10-13-4-14 |
五、总结
- 白盒测试主要应用于单元测试阶段
- 先静态、后动态
- 设计用例一般使用基本路径测试,重点模块使用多种覆盖率标准