1.概述
1.1 白盒测试基本概念
白盒测试又称为结构测试或逻辑驱动测试,是针对被测试程序单元内部如何工作的测试,特点是基于被测试程序的源代码,而不是软件的需求规格说明。(以代码为对象)
使用白盒测试方法时,测试者必须全面了解程序内部逻辑结构,检查程序的内部结构,从检查程序的逻辑着手,对相关的逻辑路径进行测试,最后得出测试结果。
1.2采用白盒测试方法必须遵循原则
(1)保证一个模块中的所有独立路径至少被测试一次。
(2)所有逻辑值均需测试真值和假值两种情况。
(3)检查程序的内部数据结构,保证其结构的有效性。
(4)在上下边界及可操作范围内运行所有循环。
2.静态白盒测试方法
静态白盒测试主要通过审查、走查、检验等方法,来查找代码中的问题和缺陷。
主要原因是为了尽早发现软件缺陷,以找出黑盒测试难以发现或隔离的软件缺陷。其次,为黑盒测试员在接受软件进行测试设计时,设计和应用测试用例提供思路。通过审查评论,可以确定有问题或者容易产生软件缺陷的特性范围。
2.1检查设计和代码
静态白盒测试是在不执行软件的条件下有条理地仔细审查软件设计、体系结构和代码,从而找出软件缺陷的过程。有时又称为结构化分析。
2.2正式审查
1、正式审查有四个要素
- (1)确定问题
- (2)遵守规则
- (3)准备
- (4)编写报告
2、正式审查的效果
正式审查的主要的目的是找出软件中存在的缺陷,除此之外,还可以形成一些间接的效果。如:程序员与程序、测试人员之间的交流,增强相互了解;程序员会更仔细的编程,提高正确率等。正式审查是把大家聚在一起讨论同一个项目问题的良机。
3、正式审查几种类型
- (1)同事审查
- (2)走查
- (3)检验
4.编码标准和规范(保证审查进行的前提)
在编程和审查程序代码时,建立相关的规范和标准,并坚持标准或规范。三个重要的原因:
- (1)可靠性:坚持按照某种标准和规范编写的代码更加可靠和安全。
- (2)可读性/维护性:符合设备标准和规范的代码易于阅读、理解和维护。
- (3)移植性:代码符合设备标准,迁移到另一个平台就会轻而易举,甚至完全没有障碍。
1、编程标准和规范示例
编程标准的4个组成部分
- ①标题:描述标准包含的主题。
- ②标准(或规范):描述标准或规范的内容。
- ③解释说明:给出标准背后的原因,以使程序员理解为什么这样是好的编程习惯。
- ④示例:给出如何使用标准的简单程序示例。
示例如图3-1所示,是一个针对C++中所用的C语言特性的规范示例。说明在C++中如何使用某些C语言特性的编程。
2、获取标准
国际标准化组织(ISO): www.iso.ch
电子电气工程学会(IEEE):www.ieee.org
美国国家标准学会(ANSI):www.ansi.org
国际工程协会(IEC):www.iec.org
信息技术标准国家委员会(NCITS):www.ncits.org
美国计算机协会(ACM):www.acm.org
5.通用代码审查清单
1、数据引用错误
数据引用错误是指使用未经正确声明和初始化的变量、常量、数组、字符串或记录而导致的软件缺陷。数据引用错误是缓冲区溢出的主要原因。
2、数据声明错误
数据声明缺陷产生的原因是不正确地声明或使用变量和常量。
3、计算错误
计算或运算错误就是计算无法得到预期的结果。
4、比较错误
在使用比较和判断运算时产生的比较和判断错误,这种错误很可能是因为边界条件问题。
5、控制流程错误
控制流程错误
产生的原因是编程语言中循环等控制结构未按预期的方式工作。通常由计算或者比较错误直接或间接造成。
6、子程序参数错误子程序参数错误的来源是软件子程序不正确地传递数据。
7、输入/输出错误
输入输出错误包括文件读取、接受键盘或鼠标输入,以及向打印机或屏幕等输出设备写入错误。
8、其他检查
6.程序复杂度及度量方法
在实际的软件开发过程中,人们发现程序的复杂度不仅影响软件的可维护性、可测试性及可靠性等,而且与软件中故障的数量、软件的开发成本及软件的效率有关。
6.1流图的概念
流图又称程序图,实际上可以看作是一种简化了的程序流程图。在流图中,只关注程序的流程,不关心各个处理框的细节,因此,原来程序流程图中的各个处理框(包括语句框、判断框、输入/输出框等)都被简化为结点,一般用圆圈表示,而原来程序流程图中的带有箭头的控制流变成了程序图中的有向边。
结构化程序设计中的几种基本结构的流图。如图3-2所示。
简化后的流图只有两种图形符号:结点和控制流线。结点用带标号的圆圈表示,可以代表一个或多个语句、一个处理框或一个判断框。控制流线用带箭头的弧线表示,代表程序中控制流。
从图论的观点来看,流图是一个可表示为G=<N,E>的有向图。其中,N表示图中的结点,而E表示图中的有向边。
流图可以通过简化程序流程图得到,也可以由PAD图或其他详细设计表达工具变换得到。
图3-3是典型的程序流程图转换为相对应的流图。对图3-3中的(a)所示的程序流程图进行简化,得到图3-3(b)所示的流图。
图3-3程序流程图及对应的流图(a)程序流程图;(b)流图
6.2 环形复杂度
环形复杂度又称为圈复杂度,是一种为程序逻辑复杂度提供定量尺度的软件度量。它可以提供程序基本集的独立路径数量和确保所有语句至少执行一次的过程。常用于基本路径测试法。
环形复杂度的度量方法又称为McCabe方法。一个强连通流图中线性无关的有向环的个数就是该程序的环形复杂度。而强连通图,是指从图中任意一个结点出发都能到达图中其他结点的有向图。
在图论中可以通过以下公式来计算有向图中线性无关的有向环的个数。
$ V(G)=m-n+p ① $
其中:V(G)表示有向图G中的线性无关的环数;
m表示有向图G中有向边的个数;
n表示有向图中的结点数;
p表示有向图G中可分离出的独立连通区域数,为常数1。
流图虽为连通图,但不是强连通图,可以在流图中增加一条出口点到入口点的虚弧线,此时,流图就变成了一个强连通图。如图3-4所示,在图3-3(b)流图添加虚弧后得到的强连通图。
图3-4将图3-3(b)变换后的强连通图
采用上面的公式①计算它的环形复杂度为:
$V(G)=13-10+1=4 $ (加一是考虑虚弧)
图3-4强连通图的复杂度是4,因此图3-4中有4个线性独立环路。此时删除从结点E到结点S的虚弧,则这4个环路就是结点S到结点E的线性独立路径。
4条线性独立路径:
Path1: S→a→b→g→E
Path2: S→a→b→g→h→E
Path3: S→a→b→c→d→f→b→g→E
Path4: S→a→b→c→e→f→b→g→E
除了采用上面的公式①可以计算环形复杂度外,还可以用其他的公式计算出流图中的环形复杂度。
\(V(G)=强连通的流图在平面上围成的区域数\) ②
图3-4中,流图中围成的区域有(b,c,d,f,b),(c,d,f,e,c),(g,h,E,g)和(S,a,b,g,E,S),因此公式②计算得到的流图环形复杂度为4。
\(V(G)=判定结点数+1\) (判定节点为出来弧>1)③
在图3-4中,判定结点分别为b,c和g,根据公式③可得环形复杂度为:3+1=4。
6.3图矩阵
图矩阵是流图的邻接矩阵的表示形式,其阶数等于流图的结点数,矩阵的每列与每行都对应于标识的某一结点,矩阵元素对应于结点之间的存在的边;有边取值为1,否则为0或不填。
如图3-5和图3-6所示,一个简单流图及对应的邻接矩阵:
行相加判断是否是判定结点
3.动态白盒测试方法
3.1定义
动态白盒测试主要是按一定步骤和方法生成测试用例,并驱动相关模块去执行程序并发现软件中的错误和缺陷。测试人员要求对被测系统内的程序结构有深入的认识,清楚程序的结构、各个组成部分及其之间的关联,以及其内部的运行原理、逻辑等。
内容包括的4部分:
(1)直接测试底层函数、过程、子程序和库。
(2)以完整程序的方式从顶层测试软件,有时根据对软件运行的了解调整测试用例。
(3)从软件获得读取变量和状态信息的访问权,以便确定测试结果与预期结果是否相符,同时强制软件以正常测试难以实现的方式运行。
(4)估算执行测试时“命中”的代码量和具体代码,然后调整测试,去掉多余的测试用例,补充遗漏的测试用例。
3.2逻辑覆盖法
逻辑覆盖法是动态白盒测试中常用的测试技术,是一系列测试过程的总称。有选择地执行程序中的某些最具有代表性的通路来对尽穷测试的唯一可行的替代方法。
逻辑覆盖法的覆盖率是程序中一组被测试用例执行到的百分比。
\[
覆盖率=(至少被执行一次的被测试项数)/被测试项总数
\]
根据测试覆盖的目标不同,以及覆盖的程度不同,可由弱到强分为:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、修正的判定/条件覆盖、条件组合覆盖、路径覆盖。
3.2.1语句覆盖和块覆盖
语句覆盖又称为代码行覆盖,指选择足够多的测试用例,使得程序中的每一条可执行语句至少被执行一次。
程序的基本块就是一个连续的语句序列,只有一个入口点和一个出口点。这些唯一的入口点和出口点就是基本块的第一条语句和最后一条语句。程序的控制总是从基本块的入口点进入,从出口点退出。除了其出口点,程序不可能在基本块的其他任意点退出或中止。
例3-1 下面以一个简单的小程序段来说明怎样设计测试用例。
Void testexample1(int x,int y,int z) { if (x>1)&&(y==0) z=z+x; if (x==2)||(z>1) z=z+y; return z; }
对于这段testexample1函数相对应的程序控制流程图见图3-7所示。
图3-7例3-1的模块的流程图(图中数字1,2,3,4,5,6,7为边)
对于testexample1函数,完全语句覆盖是从第1行执行到最后一行。因此它的测试用例的设计见表3-1:
表3-1 testexample1语句覆盖测试用例
ID | 输入数据 | 输入数据 | 输入数据 | 返回值 | 通过的路径 |
---|---|---|---|---|---|
ID | x | y | z | z | |
TE1-001 | 2 | 0 | 4 | 6 | 1-4-5-6-7 |