第四章 白盒测试
4.1:白盒测试概述
白盒测试与程序内部测试有关,故也称结构测试或逻辑驱动测试。测试者必须检查程序的逻辑结构等内部因素。得出测试数据。
4.2:程序控制流图
4.2.1:基本块
如果P是一个过程式程序设计语言(例如C、Java等)写的程序,那么一个只有一个入口块和出口块的连续的语句序列就可以被认为是一个基本块。
基本块的特征:
1:一个基本块只有唯一的入口块和出口块,这个入口块即为基本块的第一条语句,出口块是最后一条语句:
2:程序的控制从入口块进入,出口块退出,除此之外程序不能在基本块其它点退出或是中止:
3:如果基本块仅有一条语句,那么认为入口和出口是重合的。
4.2.2:流图的定义与图形表示
一般来说我们用G=(N,E)来表示流图G,其中N是结点的有限集合,E是有向边的有限集合,每一条边(i,j)用由i指向j的箭头表示,这条边连接的就是结点集合N中的结点ni和nj。Start和End是N中两个特殊的结点,N中的任何其它结点都可以从Start出发到达,同样,任何一个N中的起点也都有一道终止于End的路径。Start结点没有输入边,End结点没有输出边。
一般来说,在程序P的流图中,使用结点来对基本块进行表示,边则表示基本块之间的控制流。同时,对基本块和结点进行标识,基本块bi对应结点ni。若基本块bi和bj被边(i,j)连接,则表示控制可能从基本块bi转移到bj。
4.2.3:测试覆盖率
测试覆盖是对测试完全程度的评测。测试覆盖率是用于确定测试所执行到的覆盖项的百分比,其中覆盖项是作为指作为测试基础的一个入口或属性,如语句、分支、条件等。
测试覆盖率是对测试充分性的表示,它可以作为在测试分析报告中的一个可量化的指标依据,一般认为测试覆盖率越高,则测试效果越好。但是测试覆盖率并非测试的绝对目标,而只是一种手段。
测试覆盖分为覆盖策略,基于需求,基于代码。
4.2.4:逻辑覆盖
-
语句覆盖(SC)
简言之,语句覆盖,就是设计若干个测试用例,运行被测程序,使得每一可执行语句至少执行一次。这里的“若干个”,意味着使用测试用例越少越好。语句覆盖率的公式可以表示如下:
语句覆盖率=可执行的语句总数/被评价到的语句数量×100% -
判定覆盖(DC)
判定覆盖又叫做分支覆盖,是设计足够多的测试用例,使得程序中的每一个判断至少获得一次“真”和一次“假”,即使得程序流程图中的每一个真假分支至少被执行一次。分支(判定)覆盖具有比语句覆盖更强的测试能力。 -
条件覆盖(CC)
条件覆盖是指选择足够的测试用例,使得运行这些测试用例后,要使每个判断中每个条件的可能取值至少满足一次,覆盖程序中所有可能的数据。 -
条件/判定组合覆盖(CDC)
条件/判定组合覆盖是通过设计足够多的测试用例,使得运行这些测试用例后,要使每个判断中每个条件的可能取值至少满足一次,也使得程序中的每一个判断至少获得一次“真”和一次“假”。条件/判定组合覆盖的测试用例一定也符合条件覆盖和判定覆盖。 -
多条件覆盖(MCC)
多条件覆盖是指选择足够的测试用例,使得运行这些测试用例后,要使每个判断中每个条件的各种可能组合至少出现一次,但在判断语句较多时条件的组合也会相应变多。 -
修正条件判定覆盖(MCDC)
条件组合覆盖要求覆盖判定中所有条件取值的所有可能组合,它要求满足两个条件:首先,每一个程序模块的入口和出口点都要考虑至少要被调用一次,每个程序的判定到所有可能的结果值要至少转换一次;其次,程序的判定被分解为通过逻辑操作符(and、or)连接的布尔条件,每个条件对于判定的结果值是独立的。 -
组合覆盖
组合覆盖是执行足够的测试用例,使得程序中每个判定的所有可能的条件取值都至少出现一次。满足组合覆盖的测试用例一定满足判定覆盖、条件覆盖和条件判定组合覆盖。 -
路径覆盖
利用设计足够多的测试用例,覆盖程序中所有可能的路径。
4.2.5:测试覆盖准则
一:ESTCA(Error Sensitive Test Cases Analysis)错误敏感测试用例分析
二:LCSAJ(Linear Code Sequence and Jump)线性代码序列与跳转
4.3:路径测试
路径测试(path testing)是指根据路径设计测试用例的一种技术,经常用于状态转换测试中。基本路径测试法是在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径集合,从而设计测试用例的方法。设计出的测试用例要保证在测试中程序的每个可执行语句至少执行一次路径覆盖是利用设计足够多的测试用例,覆盖程序中所有可能的路径。
路径测试的基本步骤:
- 画出程序的控制流图。
- 计算程序的环形复杂度,导出程序基本路径集中的独立路径条数,这是确定程序中每个可执行语句至少执行一次所必须的测试用例数目的上界。
- 导出基本路径集,确定程序的独立路径。
- 根据上一步中的独立路径,设计测试用例的输入数据和预期输出。
4.4:测试充分性
4.4.1:测试充分性基础
软件测试的充分性准则描述有谓词形式和度量函数形式两种。谓词形式的充分性准则描述将充分性定义为一个谓词,用于确定测试数据必须具备什么性质才是一个彻底的测试;度量函数形式的充分性准则将充分性描述为测试的充分程度,是一种更广义的充分性准则定义。
4.4.2:测试充分性准则的度量
-
揭错能力
揭错能力是测试充分性准则有效性的最直接度量之一,如果使用充分性准则A比使用充分性准则B可以发现更多的软件错误,则认为准则A的有效性要高于准则B。揭错能力可由缺陷检测效力(fault detection effectiveness,fde)和缺陷检测概率(fault detection probability,fdp)来表示。 -
缺陷检测效力fde
给定测试集T和软件P,T对P的缺陷检测效力定义为T所检测到的缺陷占P所包含的缺陷的比率 -
缺陷检测概率fdp
对软件P所包含的缺陷类型Fi,满足测试准则C的所有测试集中能检测到该缺陷的测试集占整个测试集的比率。 -
缺陷检测效力(fde)定义了满足测试准则C的单个测试集的检测出缺陷的能力,而缺陷检测概率(fdp)定义了满足测试准则C的测试集对软件包含某一类缺陷类型的检测能力。
-
软件可靠性
-
潜在失效距离
-
测试的开销等
4.4.3:测试集充分性的度量
4.4.4:数据流测试
数据流测试面向的是程序中的变量。
一:变量的定义和使用
根据程序设计的理论,程序中的变量有两种不同的作用,一个是对数据进行存储,另一个则是对已经存储的数据进行取出。变量在程序中的具体位置决定了该变量具体实现的是两种作用的哪一种。例如,在y=x1+x2语句中,出现在赋值语句左边的y就表示要把赋值语句右边的计算结果存放在该变量所对应的存储空间内,也就是对数据和变量进行绑定。而出现在赋值语句右边的x1和x2则是表示该变量所存储的数据被取出,参与计算,即与该变量绑定的数据被引用。