白盒测试是一种结构测试,有时也被称为逻辑驱动测试,它与程序内部结构相关,需要利用程序结构的实现细节等知识,才能有效进行测试用例的设计工作。
1.
控制流图
程序流程图
(flowchart)
控制流图(
Control Flow Graph
,
CFG
):控制流图一般只有两种简单的图示符号:节点和控制流。
(1)
节点。以标有编号的圆圈表示,它一般代表了程序流程图中矫形框所表示的处理、以及菱形框所表示的判定条件,以及两条或多条节点的汇合点等。
(2)
控制流。以带箭头的弧线表示,用来连接相关的两个节点。
控制流图的一个重要性质是它的可规约性(
reducibility
)。如果程序中不存在从循环外跳到循环内的
goto
语句,那么这个程序对应的控制流图是可规约的
(reducible)
,反之这个控制流图是不可规约的
(irreducible)
。因此,模块符合结构化程序设计的准则是控制流图可规约的基础。
2.
代码覆盖率分析
典型的逻辑覆盖度量标准有
5
种,它们按照从低到高的排序一般可分为:语句覆盖(
Statement Coverage SC
)、判定覆盖(
Decision Coverage DC
)、条件覆盖(
Condition Coverage CC
)、判定
/
条件覆盖(
Decision/Condition Coverage DCC
)和条件组合覆盖(
Multiple condition Coverage MCC
),条件组合覆盖,也被称为多条件覆盖,它所完成的逻辑覆盖程序最高。
(1)
语句覆盖(
Statement Coverage SC
)
语句覆盖指通过选择足够的测试用例,使得运行这些测试用例时,被测程序的每上语句至少被执行一次。
(2)
判定覆盖(
Decision Coverage DC
)
判定覆盖又称为分支覆盖,它指通过设计足够的测试用例,使得程序中的每一个判定至少都获得一次“真值”和“假值”的机会,或者说使得程序中的每一个分支都至少通过一次。满足判定覆盖度量标准的测试用例,一定也满足语句覆盖的度量标准。
(3)
条件覆盖(
Condition Coverage CC
)
条件覆盖指对于每个判定中所包含的若干个条件,应设计足够多的测试用例,便得判定中的每个条件都至少取到一次“真值”和“假值”的机会,也就是说,判定中的每个条件的所有结果至少出现一次。
(4)
判定
/
条件覆盖(
Decision/Condition Coverage DCC
)
判定
/
条件覆盖指通过设计足够多的测试用例,使得运行这些测试用例时,判定中的每个条件的所有结果至少出现一次,并且每个判定本身的所有可能结果也至少出现一次。满足判定
/
条件覆盖度量标准的测试用例一定也满足判定覆盖、条件覆盖和语句覆盖度量标准。
(5)
条件组合覆盖(
Multiple condition Coverage MCC
)
条件组合覆盖指通过设计足够多的测试用例,使得运行这些测试用例时,每个判定中条件结果的所有可能组合至少出现一次。条件组合覆盖是对每个判定分别考虑它们的条件组合,而不是对整个程序中所有判定的所有条件的组合。满足条件组合覆盖的测试用例一定也满足语句覆盖、判定覆盖、条件覆盖、判定
/
条件覆盖,它是上述
5
种覆盖度量标准中最强的一种。
(6)
修正的条件
/
判定覆盖(
Modified Decision/Condition Coverage MCDC
)
(7)
路径覆盖(
Path Coverage
)
路径覆盖指通过设计足够多的测试用例,使得运行这些测试用例时,程序的每条可能执行到的路径都至少经过一次(如果程序中有环路,则要求环路至少经过一次)。路径覆盖,也称为断言覆盖(
predicate Coverage
)
3.
其它的覆盖度量标准
(1)
函数覆盖(
Function Coverage
)。
(2)
调用覆盖(
Call Coverage
)。也被称为调用对覆盖(
call pair coverage
)。
(3)
线性代码顺序及跳转覆盖(
Linear Code Sequence and Jump Coverage
)。
(4)
数据流覆盖(
Data Flow Coverage
)。
(5)
目标代码分支覆盖
(Object Code Branch Coverage)
。
(6)
循环覆盖
(Loop Coverage)
。
(7)
竞争覆盖(
Race Coverage
)。
(8)
关系操作符覆盖(
Relational Operator Coverage
)。
(9)
弱变化覆盖(
Weak Mutation Coverage
)。
(10)
表覆盖(
Table Coverage
)。
(11)
函数出入口覆盖(
Function Exits Coverage
)。