01 什么是白盒测试

白盒测试也称结构测试,透明盒测试。主要用于单元测试阶段,代码和逻辑的测试,重点复杂的测试,是一种测试用例设计方法,不同于黑盒测试,白盒测试是可以看到内部代码如何运作的,可通过测试来检测产品内部是否符合规定正常运行。

白盒测试Java代码 白盒测试要写代码吗_自动化测试

优点:

  • 代码覆盖率高

缺点:

  • 覆盖所有代码路径难度大
  • 业务功能可能覆盖不全
  • 测试开销大

02 白盒测试方法

(先)静态

桌面检查、代码审查、代码走查、代码扫描工具

动态

逻辑覆盖法:

通过对程序逻辑结构的遍历实现程序的覆盖

下方都以这个案例为练习

首先:要画出流程图,比较好理解

白盒测试Java代码 白盒测试要写代码吗_白盒测试Java代码_02

1、语句覆盖

语句覆盖:设计测试用例,使得程序中每条语句至少被执行一次

语句覆盖率 = 被执行过的语句数量/可执行的语句总数

举个案例:

白盒测试Java代码 白盒测试要写代码吗_自动化测试_03

白盒测试Java代码 白盒测试要写代码吗_自动化测试_04

这个案例语句覆盖率是百分百的。但是当把判断条件从if(x>0 && y>0)变成if(x>0 || y>0)时,会发现这个数据同样适合逻辑覆盖标准,但显然,这样是不正确的。

2、判断覆盖

判断覆盖:也叫分支覆盖,设计测试用例,使得程序中的每个判断的”真“和”假“都至少被执行一次

判断覆盖率 = 每个判定的真假值至少出现一次/判断结果的总数

举个案例:

将两个判定 if(x>0 && y>0)和if(magic<0) 分别定义为P1、P2

白盒测试Java代码 白盒测试要写代码吗_软件测试_05

白盒测试Java代码 白盒测试要写代码吗_软件测试_06

这个案例判断覆盖率是百分百的。但是当把判断条件从if(x>0 && y>0)变成if(x>0 || y>0)时,也会发现这个数据同样适合逻辑覆盖标准,但显然,这样也是不正确的。

3、条件覆盖

条件覆盖:设计测试用例,使得判定中的每个条件至少有一次取真值,有一次取假值

条件覆盖率 = 每个条件的真价值至少出现一次/条件结果的总数(条件结果 = 判断数 * 条件数)

举个案例:

将if(x>0 && y>0)和if(magic<0) 分别定义为P1、P2

将x>0、y>0、magic<0 分别定义为C1、C2、C3

白盒测试Java代码 白盒测试要写代码吗_面试_07

白盒测试Java代码 白盒测试要写代码吗_自动化测试_08

这个案例条件覆盖率是百分百的。但是会发现,P1都是F、F,P1为真是没有被覆盖到的所以条件覆盖不能保证判定覆盖

4、判定条件覆盖

判定条件覆盖:

设计测试用例,使得被测程序中的每个判断本身的判定结果(真假)至少满足一次,每个逻辑条件的可能值也至少被满足一次。就是既满足判断覆盖,也满足条件覆盖。

判断条件覆盖率 =每个判断真假值和条件真假值至少出现一次/(判断结果的总数 + 条件结果的总数)

举个案例:

将if(x>0 && y>0)和if(magic<0) 分别定义为P1、P2

将x>0、y>0、magic<0 分别定义为C1、C2、C3

白盒测试Java代码 白盒测试要写代码吗_白盒测试Java代码_02

白盒测试Java代码 白盒测试要写代码吗_单元测试_10

这个案例判断条件覆盖率是百分百的。但是当把判断条件从if(x>0 && y>0)变成if(x>0 || y>0)时,也会发现这个数据同样适合逻辑覆盖标准,但显然,这样是不正确的。

5、条件组合覆盖

条件组合覆盖:设计测试用例,使得被测程序中的每个判定中条件结果的所有可能组合至少执行一次

条件组合覆盖率 = 条件组合至少出现一次的数量/条件组合的总数

举个案例:

将if(x>0 && y>0)和if(magic<0) 分别定义为P1、P2

将x>0、y>0、magic<0 分别定义为C1、C2、C3

白盒测试Java代码 白盒测试要写代码吗_面试_11

白盒测试Java代码 白盒测试要写代码吗_面试_12

条件组合覆盖能够满足语句覆盖、判定覆盖、条件覆盖、判定条件覆盖,但是条件组合覆盖不能保证所有路径被执行。

6、路径覆盖

路径覆盖:设计测试用例,覆盖程序中所有可能的路径

路径覆盖率 = 至少被执行过一次的路径数/总的路径数

举个案例:

将if(x>0 && y>0)和if(magic<0) 分别定义为P1、P2

将x>0、y>0、magic<0 分别定义为C1、C2、C3

白盒测试Java代码 白盒测试要写代码吗_面试_11

白盒测试Java代码 白盒测试要写代码吗_白盒测试Java代码_14

仔细看出C2为假是没有被覆盖的,路径覆盖可以对程序进行彻底的测试,比前面五种覆盖更广。但是满足路径覆盖,并不一定能满足条件覆盖,也就不能满足条件组合覆盖

7、基本路径测试法(最常使用)

基本路径测试法:

在程序控制流图的基础上,通过分析程序的环路复杂性,导出基本可执行路径集合,从而设计测试用例

白盒测试Java代码 白盒测试要写代码吗_面试_15

白盒测试Java代码 白盒测试要写代码吗_软件测试_16

白盒测试Java代码 白盒测试要写代码吗_单元测试_17

白盒测试Java代码 白盒测试要写代码吗_软件测试_18