Chapter3 白盒测试
1、白盒测试
白盒测试又称结构测试,它一般用来测试程序的内部结构(Control Flow , Data Flow/控制流,数据流)。并判定其结果是否与预期的结果一致。
2、白盒测试的种类
(1)静态分析测试
(2)语句分支覆盖测试
3、控制流测试
利用有向图来进行测试。
4、有向图
用G=(N,E)来表示,其中,N是节点集合;E是边集合, 有向边e=(H(e),T(e))∈E,H(e),T(e)是一对有序的邻接节点,T(e)是尾,H(e)是头。T(e)是H(e)的后继(successor)节点,H(e)是T(e)的前驱(predecessor)节点。
5、有向图基本概念
(1)入度:以节点n为终止节点的边的个数
(2)出度:以节点n为起始节点的边的个数
(3)路径(PATH):如果P=(e1,e2,... ,eq),且满足H(ei+1)=T(ei),则P称为路径。
(4)如果P=e1e2…eq是一条路径,且满足H(e1)=Start,T(eq)=End,则P称为完整路径。
(5)如果存在输入数据使得程序按照该路径P=e1e2…eq运行,这样的路径称为可行(feasible)完整路径,否则称为不可行(infeasible)完整路径。
(6)简单路径:路径上的所有节点都是不同的
(7)基本路径:任意有向边都在路径中最多出现一次的路径。
(8)子路径:路径A=eueu+1…et是B=e1e2…eq的子路径,如果满足1≦u≦t ≦ q。
(9)回路:路径A=eueu+1…eq满足H(eu)=T(eq),称为回路。除了第一个和最后一个节点外,其它节点都不同的回路称为简单回路。
(10)无回路路径:一条路径中不包含有回路子路径。
6、控制流覆盖准则
(1)语句覆盖准则
控制流图中的所有语句都被运行的充分必要条件是,覆盖图中的所有节点。
(2)分支覆盖准则
分支覆盖要求在软件测试中,每个分支都至少获得一次真/假取值的经历。
(3)谓词测试
1) 原子谓词覆盖准则
一个分支的条件是由谓词组成。单个谓词称为原子谓词。
测试数据集T称为原子谓词覆盖充分的,如果对任意一个分支中的任意一个原子 谓词,T中存在一个测试数据使其在运行时为“真”、为“假”各一次。
2)分支-谓词覆盖准则
测试数据集T称为分支-谓词覆盖充分的,如果对任意一个分支所包含的任意一个原子谓词,T中存在一个测试数据在运行时为真/假值至少各一次,并且任意一个复合谓词本身也至少获得真/假值各一次。
3)测试数据集T称为复合谓词覆盖充分的,如果任意一个分支,对该分支所包含的原子谓词的任意一个可行的真/假值组合,T中都存在一个测试数据使该组合谓词运行时,原子谓词的取值恰好为该真/假值组合。即每个复合谓词内的原子谓词的各种可能的组合都至少出现一次。
(4)路径覆盖准则
测试数据集T称为路径覆盖充分的,当且仅当LT覆盖了GP中的所有完整路径。让EP(GP)为控制流图中的所有完整路径的集合。
7、数据流测试
数据流测试,是数据交互功能测试,用作路径测试的“真实性检查”。
它关注的是变量接收值的点和使用(引用)这些值的点的结构性测试形式。
8、 数据流覆盖准则
(1)定义覆盖测试准则
测试数据集T对测试程序P满足定义覆盖准则,如果对具有数据流信息的控制流图GP中的每一个变量x的每一个定义性出现,若该定义性出现能够可行地传递到该变量的某一个引用性出现,那么LT中存在一条路径A,它包含一条子路径A’,使得A’将该定义出现传递到某一引用性出现。
应为一个定义可能要传递到多个引用,一个定义要对多个引用都是正确的。
而定义覆盖只要求检查一个引用。所以检查的内容是弱充分的。
定义了的变量一定会被引用,不能有没有配定义得以用。
(2)引用覆盖测试准则
测试数据集T对测试程序P满足引用覆盖准则,如果对具有数据流信息的控制流图GP中的每一个变量x的每一个定义n,以及该定义的每一个能够可行地传递到的引用n’,LT中都存在一条路径A,它包含一条子路径A’,使得A’将n传递到n’。
引用覆盖准则的不足之处是路径集合中可能存在着回路,这样的路径可能是无穷的。变量x的每一个定义性出现都能够可行地传递到该变量的每一个可行的引用性出现。
(3)定义-引用覆盖测试准则
测试数据集T对测试程序P满足定义-引用覆盖准则,如果对具有数据流信息的控制流图GP中的任意一条从定义传递到其引用的路径A,若A是无回路的或A是简单回路,那么LT中存在一条路径B,使得A是B的子路径。
目的:只测试无回路或只包含简单回路的路径。
9、程序插桩
程序插桩技术最早是由J.C. Huang 教授提出的, 它是在保证被测程序原有逻辑完整性的基础上在程序中插入一些探针(又称为“探测仪”),通过探针的执行并抛出程序运行的特征数据,通过对这些数据的分析,可以获得程序的控制流和数据流信息,进而得到逻辑覆盖等动态信息,从而实现测试目的的方法。
10、测试插桩:
1.探测哪些信息:探测覆盖率,某个变量结果是否正确等
2.测试变量值放在变量负值定义之后
3.需要多少探测点:原则越少越好
插桩或设置断点是测试的基本方法。
11、白盒测试静态工具
1.代码审查检查程序是否遵循了程序设计规则规范等
2.一致性检查,各个单元是否使用了统一的记法或术语,是否遵循规格说明
3.错误检查:检查确定差异和分析错误的严重性及原因,潜在的错误
4.接口分析:单元之间的接口一致性,模块完整型
5.输入输出规格分析:用于生成测试数据
6.数据流:赋值与引用之间是否有矛盾,引用未赋值的变量,
7.类型分析:数据项和操作是否得到正确使用
8.单元分析:单元是否定义正确和使用一致
9.复杂度分析:帮助策划精确的测试活动,是软件测试成本或存在故障的指示器。
12、白盒测试动态工具
1.功能确认与接口测试
测试包括对各模块功能、模块间的接口、局部数据结构、主要执行路径、错误处理等方面进行的测试。
2.覆盖测试
覆盖分析对所涉及的程序结构元素进行度量,以确定测试执行的充分性。