白盒测试(初)

  • Post author:
  • Post category:其他




一、白盒测试



1、白盒测试的概念

又称为结构测试或者逻辑驱动测试,是一种按照程序的逻辑和编码结构设计测试数据的方法

白盒测试是关注程序的内部逻辑实现的



2、白盒测试和调试

目的:白盒测试主要目的是发现问题,找bug(不一定是功能bug、逻辑bug,冗余代码、注释率、代码太复杂);改正问题,使得代码运行正常

角色:白盒测试也是由测试人员参与,开发人员可以做单元测试;开发人员完成调试工作

方法:白盒测试是一个较为系统、全面的过程,有丰富的测试方法(等价类、边界值、正交表等、判定表等);调试更多的经验的总结



3、白盒测试的作用

  • 可以发现系统/软件运行时由于数据流或者控制流导致的逻辑错误
  • 对源程序或代码,对照设计文档进行检查,一查找代码或者设计文档中不一致的问题(代码走查)
  • 可以验证代码的所有的独立路径(检查是否有独立路径不能被运行到)



4、常见的白盒测试技术

  • 静态的白盒测试技术:
  • 代码走查
  • 编码规范检查(Testbed、klockwork、splint)
  • 代码的注释率
  • 代码圈复杂度
  • 动态的白盒测试技术:
  • 逻辑覆盖测试
  • 路径测试
  • 数据流测试
  • 覆盖率分析
  • 单元测试



二、逻辑覆盖测试

逻辑覆盖测试是以程序内部的逻辑结构为基础的测试方法

  • 逻辑覆盖的种类有:
  • 语句覆盖
  • 条件覆盖
  • 判定覆盖
  • 判定条件覆盖
  • 条件组合覆盖
  • 路径覆盖

if(a>1 && b==0){}

  • 条件:a>1、b==0是两个条件
  • 判定:(a>1 && b==0)整体看作是一个判定
  • 路径:在代码执行流中至少要包括一条新的路径(其他路径中从未走过的)。



1、语句覆盖(Statement Coverage)

对程序的逻辑覆盖很少,只关心判定表达式的值,是很弱的逻辑覆盖标准。

  • 【基本思想】:设计若干测试用例,运行被测程序,使程序中每个可执行语句至少执行一次。
  • 【优点】:检查所有语句、代码覆盖率高
  • 【缺点】:无法检查出条件、循环语句的错误



2、判定覆盖(Decision Coverage)

判定覆盖比语句覆盖强一些,能发现一些语句覆盖无法发现的问题。但是往往一些判定条件都是由多个逻辑条件组合而成的,进行分支判断时相当于对整个组合的最终结果进行判断,这样就会忽略每个条件的取值情况,导致遗漏部分测试路径。

  • 【基本思想】:设计若干测试用例,运行被测程序,使得程序中每个判断的取真分支和取假分支至少经历一次,即判断真假值均曾被满足。
  • 【优点】:判定覆盖具有比语句覆盖更强的测试能力。
  • 【缺点】:往往大部分的判定语句是由多个逻辑条件组合而成,若仅仅判断其整个最终结果,而忽略每个条件的取值情况,必然会遗漏部分测试路径,判定覆盖仍是较弱的逻辑覆盖。



3、条件覆盖(Condition Coverage)

通常而言条件覆盖比判定覆盖强,因为条件覆盖使得判定中的每一个条件都取到了不同的结果,这一点判定覆盖则无法保证。但条件覆盖也有缺陷,因为它只能保证每个条件都取到了不同结果,但没有考虑到判定结果,因此有时候条件覆盖并不能保证判定覆盖。

  • 【基本思想】:设计若干测试用例,执行被测程序以后要使每个判断中每个条件的可能取值至少满足一次。
  • 【优点】:能够检查所有的条件错误。
  • 【缺点】:不能保证所有的分支(判定)都能覆盖,仍是较弱的覆盖方式。



4、判定/条件覆盖(Decision/Condition Coverage)

判定/条件覆盖,说白了就是我们设计的测试用例可以使得判断中每个条件所有的可能取值至少执行一次(条件覆盖),同时每个判断本身所有的结果也要至少执行一次(判定覆盖)。不难发现判定条件覆盖同时满足判定覆盖和条件覆盖,弥补了两者各自的不足,但是判定条件覆盖并未考虑条件的组合情况。

  • 【基本思想】:设计足够的测试用例,使得判断条件中的所有条件可能至少执行一次取值,同时所有判断的可能结果至少执行一次。
  • 【优点】:既考虑了每一个条件,又考虑了每一个分支,发现错误的能力强于分支覆盖和条件覆盖
  • 【缺点】:仍然不能覆盖所有的路径,有进一步提升的空间



5、条件组合覆盖(Branch Condition Combination Coverage)

条件组合覆盖,测试用例应该使得每个判定中的各个条件的各种可能组合都至少出现一次。显然,满足条件组合覆盖的测试用例一定是满足判定覆盖、条件覆盖和判定条件覆盖的。

  • 【基本思想】:设计足够的测试用例,使得所有可能的条件取值组合至少执行一次。
  • 【优点】:能够检查所有的条件错误
  • 【缺点】:不一定能使程序中的每条路径都执行到,用例数明显增加



6、路径覆盖(Path Coverage)

路径覆盖,意思是说我们设计的测试用例可以覆盖程序中所有可能的执行路径。这种覆盖方法可以对程序进行彻底的测试用例覆盖,比前面讲的五种方法覆盖度都要高。

  • 【基本思想】:要求设计足够多的测试用例,使得程序中所有的路径都至少执行一次 。
  • 【优点】:这种测试方法可以对程序进行彻底的测试,比前面五种的覆盖面都广。
  • 【缺点】:需要设计大量、复杂的测试用例,使得工作量呈指数级增长,不一定把所有的条件组合都覆盖。



总结一下:

  • 在实际的操作中,要从代码分析和代码调研入手,可以选择上述方法中的某一种,或者好几种方法的结合,设计出高效的测试用例,尽可能全面地覆盖到代码中的每一个逻辑路径。
  • 白盒测试又很少能使用手工进行,选择一款不错的自动化工具也是很重要的,之前工作中使用的testbed工具进行这种覆盖测试非常方便,而且提供一个MC/DC(修正条件/判定覆盖)的方式,在能够保证覆盖效果的情况下,尽可能减少测试用例的数量。



三、路径测试

概念:根据程序的逻辑控制所产生的路径进行测试用例设计的方法 。

  • 它是从一个程序的入口开始,执行所经历的各个语句的完整过程
  • 完成路径测试的理想情况是做到路径覆盖



1、基本路径测试

基本路径测试是McCabe提出的一种“白盒”测试方法。

  • 计算程序的圈复杂度;
  • 用该复杂度为指南定义执行路径的基本集合;
  • 从该基本集合中导出的测试用例可以保证程序中的每条语句被覆盖;
  • 而且每个条件在执行时都分别取真、假两种值。

把程序结构的控制流程图转化为有向图(即程序图),然后计算强连通有向图的环数来衡量软件的质量,用此方法得到的复杂度称为圈复杂度。(为了使之强连通,我们可以从出口点到入口点画一条虚弧)。

圈复杂度计算公式为:V(G)=m-n+p

  • G是强连通有向图
  • V(G)是强连通有向图G中的环数
  • m是G中的弧数
  • n是G中的节点数
  • p是G中分离部分的数目
  • 对于一个正常的程序来说,程序图总是连通的,即p=1

圈复杂度其他计算方法:

  • 圈复杂度等于程序图中判定节点的数目加1;
  • 圈复杂度等于强连通程序图在平面上围成的区域的个数。



2、路径测试的基本步骤

  • 根据过程设计结果画出相应的流图
  • 计算控制流图的圈复杂度
  • 确定线性独立路径的基本集合
  • 设计可强制执行基本集合中每条路径的测试用例



版权声明:本文为wang3289696原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。