目录
什么是白盒测试?
白盒测试也称为结构测试或逻辑驱动测试,它是知道产品内部工作过程,可通过测试来检测产品内部动作是否按照规格说明书的规定正常进行,按照程序内部的结构测试程序,检验程序中的每条通路是否都有能按预定要求正确工作,而不顾它的功能。
白盒测试的目的
通过检查软件内部的逻辑结构,对软件中的逻辑路径进行覆盖测试;在程序不同地方设立检查点,检查程序的状态,以确保实际的运行状态和预期结果相一致。
白盒测试的特点
根据需求文档进行测试 ,主要对程序的内部细节进行严密检验,针对特定条件设计测试用例、对软件的逻辑路径进行覆盖测试。
白盒测试的方法
白盒测试的方法分为静态测试和动态测试。
静态测试
静态测试是不用运行程序的测试,包括以下几点:
- 桌面检查
- 代码审查
- 代码走查
- 代码扫描工具
动态测试:
需要执行代码,通过运行程序找到问题,包括功能确认与接口测试、覆盖率分析、性能分析、内存分析等。
(1)逻辑覆盖法
逻辑覆盖法是通过对程序逻辑的遍历实现程序的覆盖。
逻辑覆盖包括语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖和路径覆盖。
以上六种覆盖标准发现错误的能力依次由弱到强。
覆盖率:用来度量测试完整性的一个手段;
覆盖率=至少被执行一次的item数/item的总数
item指的是语句、判定、条件、判定条件、条件组合、路径。
在进行测试时,每次先将拿到的代码转换成程序流程图
如:
将代码转换为程序流程图:
1、语句覆盖
语句覆盖:设计测试用例,使得程序中每条语句至少被执行一次。
是六种逻辑覆盖标准中,标准最弱的。
语句覆盖率:衡量语句覆盖的标准
语句覆盖率=至少被执行一次的语句数量/可执行的语句总数
例如:
- 上面的案例代码中共有4条可执行语句
- 设计的测试用例执行了3条语句,那么语句覆盖率为3/4=75%
如果想要达到好的测试效果,语句覆盖率就要达到100%
语句覆盖的局限性:
语句覆盖不能准确判断运算中的逻辑关系错误。
例如:
如果将判断条件误写为if(x>0||y>0),使用同样的数据,虽然覆盖率达到了100%,但是发现不了这个错误的逻辑关系。
2、判定覆盖
判定覆盖:也称为分支覆盖;设计测试用例,使得程序中的每个判断(“真”和“假”)都至少被执行一次。即:程序中的每个判定(分支)至少有一次为true一次为false。
判定覆盖率:
判定覆盖率=每个判定的真值和假值至少出现一次/判定结果的总数
例如:
- 最上面的案例代码中有2个判定,那么判定结果就有4个
- 设计的测试用例只执行了3个分支,则分支覆盖率为3/4=75%
总结:只要满足了判定覆盖标准就一定满足语句覆盖标准。
判定覆盖法的局限性:
和语句覆盖的局限性相同,判定覆盖也会忽略判定条件中取(or)||的情况。
例如:
将判断条件误写为if(x>0||y>0),使用同样的数据,虽然覆盖率达到了100%,但是依旧发现不了错误的逻辑关系。
3、条件覆盖
条件覆盖:设计测试用例,使得判定中的每个条件获得各种可能的结果,每个条件至少有一次取真值,有一次取假值。
例如,对于判定语句if(x>1 && y>0)中存在x>1 和y>0两个逻辑条件
条件覆盖率:
条件覆盖率=每个条件的真假值至少出现一次/条件结果的总数
例如:
- 最上面的案例代码中有2个判定,(判定1有两个条件:x>0和y>0,判定2有一个条件:magic<0)则总共有3个条件,那么3个条件总共就有6个结果
- 假如设计的测试用例执行了5个条件结果,条件覆盖率为5/6=83%
条件覆盖的局限性
条件覆盖相比于判定覆盖,确实增加了对判定中所有条件的测试,但完成了100%的条件覆盖并不能保证就完成了100%的判定覆盖。
4、判定条件覆盖
判定条件覆盖:设计测试用例,使得被测试程序中的每个判断本身的判定结果(真假)至少满足一次,同时,每个逻辑条件的可能值(真假)也至少被满足一次。即同时满足100%判定覆盖和100%条件覆盖的标准。
判定条件覆盖率:
判定条件覆盖率=每个判定真价值和条件真价值至少出现一次/(判定结果的总数+条件结果的总数)
例如:
- 上述案例代码中有2个判定,总共有3个条件,那么就有4判定结果,6个条件结果
- 假设设计测试用例执行了3个判定结果,5个条件结果,判定条件覆盖率为:(3+5)/(4+6)=80%
判定条件覆盖的局限性:
满足判定条件覆盖标准一定能够满足判定覆盖、条件覆盖和语句覆盖。
但是判定条件覆盖依旧会忽略条件中取或(or、||)的情况。
5、条件组合覆盖
条件组合覆盖:设计测试用例,使得被测试程序中的每个判定中条件结果的所有可能组合至少执行一次。
【这里需要注意:是同一个判定里面的条件的结果进行组合,如果有多个判定,则多个判定之间的条件结果不需要组合】
(组合:n个条件的组合结果为2^n)
条件组合覆盖率:
条件覆盖率=条件组合至少出现一次的数量/条件组合的总数
例如:
- 案例代码中有2个判定,3个条件,判定1的条件组合为4个,判定2的条件组合为2个
- 设计测试用例执行了5个条件组合,条件组合覆盖率为:5/(4+2)=83%
条件组合覆盖的局限性:
条件组合覆盖能满足判定覆盖、条件覆盖、判定条件覆盖,当然也包括语句覆盖。
但是条件组合覆盖并不能保证所有的路径能够被执行到。
6、路径覆盖
路径覆盖:设计测试用例,覆盖程序中所有可能的路径。
路径覆盖率:
路径覆盖率=至少被执行一次的路径数/总的路径数
例如:
- 案例代码中共有4条路径
- 如果设计的测试用例执行了3条路径,路径覆盖率为3/4=75%
路径覆盖的局限性:
路径覆盖可以对程序进行彻底的测试,比前面五种覆盖面都广。
但是满足了路径覆盖,并不一定能满足条件覆盖,即也就不能满足条件组合覆盖。
对于项目而言,代码都比较复杂,如果要使用100%的路径覆盖,成本是非常高的
(2)基本路径测试法
基本路径测试法:在程序控制流程图的基础上,通过分析程序的环路复杂性,导出基本可执行路径集合,从而设计测试用例
基本路径测试法的步骤:
- 根据代码画出程序控制流图
- 根据程序控制流图,计算程序的环路复杂度
- 导出可执行路径
- 设计测试用例
注意:环路复杂度为几,就有几条可执行路径。
测试流程
测试计划阶段:根据需求文档(产品说明书),制定测试进度。
测试设计阶段:依据程序设计说明书,按照一定规范化的方法进行软件结构划分,设计测试用例。
测试执行阶段:输入测试用例,得到测试结果
测试总结阶段:对比测试的结果和代码的预期结果,分析错误原因,找到并解决错误。
白盒测试的优缺点
优点:
- 代码覆盖率高,对代码的测试比较彻底;
- 迫使测试人员仔细思考软件的实现
- 揭示隐藏在代码中的错误
缺点:
- 测试开销大
- 无法检测代码中遗漏的路径和数据敏感性错误
- 不验证规格的正确性
- 覆盖所有代码路径难度大
- 业务功能可能覆盖不全