第4章 白盒测试及其实例设计
第4章白盒测试及其实例设计
测试用例
Test Case 1 Test Case 2 Test Case 3 Test Case 4
表4-9 测试用例组9
输入
i
str
num1
期望输出 num2
5
‘T’
0
0
4
‘T’
1
0
4
‘A’
0
0
4
‘F’
0
1
score
执行路径
100
路径1
100
路径2
100
路径3
实例设计
3.设计测试用例 根据上面环形复杂度的计算结果,源程序的基本路径集合中有4条独立路径: 路径1:7->18 路径2:7->9->10->16->7->18 路径3:7->9->11->15->16->7->18 路径4:7->9->11->13->14->15->16->7->18 根据上述4条独立路径,设计了测试用例组9,如表4-9所示。测试用例组9 中的4个测试用例作为程序输入数据,能够遍历这4条独立路径。对于源程序 中的循环体,测试用例组9中的输入数据使其执行零次或一次。
序时,程序中每个判断条件的真值分支和假值分支至少被执行一遍。在保证完 成要求的情况下,测试用例的数目越少越好。
判断覆盖又称为分支覆盖。 以下是针对公共程序段设计的两个测试用例: Test Case 1:x=2000,y=600,z=6000 Test Case 3:x=50,y=600,z=2000
判断/条件覆盖 判断/条件覆盖是指设计若干个测试用例,执行被测试程序时,程序中 每个判断条件的真假值分支至少被执行一遍,并且每个判断条件的内 部判断式的真假值分支也要被执行一遍。 测试用例组6: Test Case 1:x=2000, y=600, z=2000 Test Case 6:x=2000, y=200, z=6000 Test Case 7:x=2000, y=600, z=2000 Test Case 8:x=50, y=200, z=2000
第4章 白盒测试方法
第4章白盒测试方法1.简述白盒测试用例的设计方法,并进行分析总结。
解:白盒测试用例设计方法主要有逻辑覆盖和独立路径测试。
从覆盖源程序语句的详尽程度分析,逻辑覆盖主要有以下不同的覆盖标准:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖。
实际项目中,由于程序内部的逻辑存在不确定性和无穷性,尤其对于大规模复杂软件,不必采用所有的覆盖指标,而应根据实际情况选择合适的覆盖指标。
独立路径测试是在程序控制流图的基础上,通过分析控制结构的环路复杂性,导出可执行的独立路径集合,从而设计出相应的测试用例。
设计出的测试用例要保证被测程序的每条可执行的独立路径至少被执行一次。
独立路径测试给出了满足路径覆盖指标所需测试用例的下限,同时给出了语句覆盖的上限,它可以确保对所有相互独立的决策结果进行测试。
2.分析归纳逻辑覆盖的各种策略,并比较每种覆盖的特点,分析在怎样的情况下采用何种覆盖方式。
解:语句覆盖是选择足够多的测试数据,使被测程序中每个语句至少执行一次。
语句覆盖是最弱的逻辑覆盖标准。
判定覆盖又叫分支覆盖,它不仅每个语句必须至少执行一次,而且每个判定表达式的每种可能的结果都应该至少执行一次。
判定条件覆盖比语句覆盖强,但是对程序逻辑的覆盖程度仍然不高。
条件覆盖的含义是,使判定表达式中的每个条件都取到各种可能的结果。
条件覆盖通常比判定覆盖强,但是也可能有相反的情况:虽然每个条件都取到了两个不同的结果,判定表达式却始终只取一个值。
判定/条件覆盖的含义是,选取足够多的测试数据,使得判定表达式中的每个条件都取到各种可能的值,而且每个判定表达式也都取到各种可能的结果。
但有时判定/条件覆盖也并不比条件覆盖更强。
条件组合覆盖是更强的逻辑覆盖标准,它要求选取足够的测试数据,使得每个判定表达式中条件的各种可能组合都至少出现一次。
满足条件组合覆盖标准的测试数据,也一定满足判定覆盖、条件覆盖和判定/条件覆盖标准。
因此,条件组合覆盖是前述几种覆盖标准中最强的。
第四章 白盒测试
一条子路经。若v1 vk,则称P为一条回路(环 路)。若子路径p从源结点I 到汇结点O,则称p为 程序的一条路经。
例:P=<3,4,5,6,7,8,10,11,12,16> 是一条程序路经。
程序控制流图的重要性在于,程序的执行对应 于从源结点到汇结点的路径。
只作到判定覆盖仍无法确定判断内部条件的错误。
a
F
T
(age>25)(sex=M)
c
b
comm=comm+150
如果在此程序段中 第2个判断条件comm>2000错 写成comm<2000,
使用上述测试用例Test5,
F
T
(age>=50)(comm>2000.0)
e d
comm=comm-200
age=50, sex=F, comm.=1900 照样能按原路径执行(abe), 不影响结果。
从程序中每个语句都得 到执行这一点来看,语 句覆盖的方法似乎能够 比较全面地检验被测 程序的每一个语句。 但语句覆盖是很弱的逻 辑覆盖准则。
图5-2 被测程序段流程图
a
F
T
(age>25)(sex=M)
c
b
comm=comm+150
F
T
(age>=50)(comm>2000.0)
e d
comm=comm-200
8种情况。
F d
(age>=50)(comm>2000.0)
T e
comm=comm-200
覆盖了两个判 断的4个分支 b、c、d和c。
第四章-白盒测试及其用例的设计汇总
锦 城
错误:
学 院
➢ 穷举路径测试无法检查出程序本身是否违反了设计规 软
范,即程序是否是一个错误的程序。
件 测
➢ 穷举路径测试不可能查出程序因为遗漏路径而出错。 试
➢ 穷举路径测试发现不了一些与数据相关的错误。
• 采用白盒测试方法必须遵循以下几条原
则: 四
➢保证一个模块中的所有独立路径至少被测试
川 大
➢ 给定控制流图G的环形复杂度—V(G),也可定义为
V(G) = P+1
其中,P是控制流图G中判定节点的数量。
环形复杂度:
5
V(G) = E-N+2 => V(G) = 10-8+2=4
or
V(G) = P+1 => V(G) = 3+1=4
7
8
9
导出独立路径集:
路径1:5-15 (iRecordNum=0)
• 图矩阵是一个方形矩阵,其维数等于控制流图
四 川
的节点数。矩阵中的每列和每行都对应于标识
大 学
的节点,矩阵元素对应于节点间的边。
锦 城
• 通常,控制流图中的结点用数字标识,边则用
学 院
字母标识。如果在控制流图中从第 i 个结点到第 软
j 个结点有一个标识为 x 的边相连接,则在对应
件 测
图矩阵的第 i 行第 j 列有一个非空的元素 x 。
11
13
路径2:5-7-8-14-5-15
(iRecordNum≥0,iType=0)
14
路径3:5-7-9-11-14-5-15
15
(iRecordNum≥0,iType=1)
路径4:5-7-9-13-14-5-15
第四章 白盒测试用例设计方法
本科《软件测试与质量保证》
SEI of ECNU 孙海英 版权所有©
4-13
基本路径(选第一条基本路经希 望二直结点尽可能的多)
形式化定义
路径p=vb, v1, v2, ..., vn, ve是由有顺序的一系列节点组成且节点之间 存在这样的关系{<vb, v1>, <v1,v2>, ..., <vn, ve>} ⊆ E 一条路径p=vb, v1, v2, ..., vn, ve是一条基本路径当且仅当p中不包含 两个子序列s1,s2, s1=s2 且 length(s1)>1 and length(s2)>1. s1,s2
本科《软件测试与质量保证》 SEI of ECNU 孙海英 版权所有© 4-3
不可能进行彻底的白盒测试
左图是具有某程序的流程图,假设循环10次,请计算一 下有多少条程序执行通路?假设由图中得到的所有路径 都是可执行路径,执行一次循环大约需要10微秒(奔腾 4 1.7G),且一年365天每天24小时不停机,请回答: 如果循环次数为10的话,遍历图中所有路径需要多长时 间? 结论是:41+42+43+……+410,需要14秒左右的时间 如果循环次数为20次,100次时,结果又如何? 结论是:循环20次,需要约4072小时,循环100次则 大约需要6.79*1047年
1. 2.
是一条从起始节点到终止节点的路径 至少包含一条其它基本路径没有包含的边
SEI of ECNU 孙海英 版权所有© 4-14
本科《软件测试与质量保证》
基本路径
基本路径
1. 2. 3. 4. 5.
1-2-11 1-2-3-4-5-6-10-2-11 1-2-3-4-5-7-10-2-11 1-2-3-8-9-10-2-11 1-2-3-8-10-2-11
白盒测试()—综合应用实例
❖ (3)利用静态分析的结果作为导引,通过代码检查 和动态测试的方式对静态发现结果进行进一步的确认, 使测试工作更为有效。
白盒测试应用策略
SWPU
❖ (4)覆盖率测试是白盒测试的重点,一般可使用基本 路径测试法达到语句覆盖标准;对于软件的重点模块, 应使用多种覆盖率标准衡量代码的覆盖率。
实例设计——实例2
SWPU
运用逻辑覆盖的方法测试程序 程序4-4:
1 If (x>1&& y=1) then 2 z=z*2 3 If (x=3|| z>1) then 4 y++;
运用逻辑覆盖的方法设计测试用例组,如下 表所示。
SWPU
实例设计——实例3
运用路径分析的方法测试程序
程序4-5:
2 7
2 9
3
3
0
1
3 2
SWPU
环复杂度(方案2)
1
❖ 环复杂度
2
▪ 闭合区域的数目 = 6
3
▪ 二值判定节点个数 + 1
4
=5+1=6
▪ 边的数目-节点的数目 + 2
5
= 17-13+2=6
6
7
8
9
1 0
1
1
1
2
1 3
SWPU
基本路径(方案2)
1 2 3 4 5 6
7
8
❖ 基本路径和相应的测试用例
SWPU
结果合并
❖ 合并的结果
1. 测试输入 = ((-999),0,360),预期结果 = -999 2. 测试输入 = ((-10,-999),0,360),预期结果 = -999 3. 测试输入 = ((180,-999),0,360),预期结果 = 180 4. 测试输入 = ((380,-999),0,360),预期结果 = -999 5. 测试输入 = ((0..100,-999),0,360),预期结果 = 49.5 6. 测试输入 = ((10,20,-999),0,360),预期结果 = 15 7. 测试输入 = ((0..49,-999),0,360),预期结果 = 24.5
第4章++白盒测试方法总结课件
测试用例 test1 test2 test3 test4 test5 test6 test7 test8 test9 test10 test11 test12 test13
货品价格R 101 0 -1 100 100 50 51 90 91 95 96 99 100
付款金额P 预期结果
有效等价类
②有非数字字符 ③少于8个数字符 ④多于8个数字符
⑥<19090101 ⑦>19920101
⑨等于"00 " ⑩>12
(15)等于"00 " (16)>31 (17)2,4,6,9,11月等于 "31 " (18)2月等于"30 " (19) 平年2月等于"29"
第4章++白盒测试方法总结
(1)A.Income=(800,1500,2000,2001) B.Income=(800,801, 1999,2000) C.Income=(799,1499,2000,2001) D.Income=(799,1500,1999,2000)
(2)A.Income=(799,1500,1999,2001) B.Income=(799,1501, 2000,2001) C.Income=(800,1500,2000,2001) D.Income=(800,1499,2000,2001)
§ 条件桩:c1:a<b+c? c2:b<a+c? c3:c<a+b?
§
c4:a2+b2=c2? c5: a2+c2=b2? c6: b2+c2=a2?
白盒测试及用例设计
白盒测试白盒测试(White-box Testing,又称逻辑驱动测试,结构测试)是把测试对象看作一个打开的盒子。
利用白盒测试法进行动态测试时,需要测试软件产品的内部结构和处理过程,不需测试软件产品的功能。
白盒测试又称为结构测试和逻辑驱动测试。
白盒测试法的覆盖标准有逻辑覆盖、循环覆盖和基本路径测试。
其中逻辑覆盖包括语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖。
六种覆盖标准:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖发现错误的能力呈由弱至强的变化。
语句覆盖每条语句至少执行一次。
判定覆盖每个判定的每个分支至少执行一次。
条件覆盖每个判定的每个条件应取到各种可能的值。
判定/条件覆盖同时满足判定覆盖条件覆盖。
条件组合覆盖每个判定中各条件的每一种组合至少出现一次。
路径覆盖使程序中每一条可能的路径至少执行一次。
白盒测试也称结构测试或逻辑驱动测试,它是知道产品内部工作过程,可通过测试来检测产品内部动作是否按照规格说明书的规定正常进行,按照程序内部的结构测试程序,检验程序中的每条通路是否都有能按预定要求正确工作,而不顾它的功能,白盒测试的主要方法有逻辑驱动、基路测试等,主要用于软件验证。
"白盒"法全面了解程序内部逻辑结构、对所有逻辑路径进行测试。
"白盒"法是穷举路径测试。
在使用这一方案时,测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据。
贯穿程序的独立路径数是天文数字。
但即使每条路径都测试了仍然可能有错误。
第一,穷举路径测试决不能查出程序违反了设计规范,即程序本身是个错误的程序。
第二,穷举路径测试不可能查出程序中因遗漏路径而出错。
第三,穷举路径测试可能发现不了一些与数据相关的错误。
白盒测试六种覆盖方法摘要:白盒测试作为测试人员常用的一种测试方法,越来越受到测试工程师的重视。
白盒测试并不是简单的按照代码设计用例,而是需要根据不同的测试需求,结合不同的测试对象,使用适合的方法进行测试。
第4章 白盒测试及其用例的设计PPT课件
A Free sample background from
第四章 白盒测试及其用例的设计
判定覆盖
• 要实现DoWork函数的判定覆盖,需要设计两个测试用例。
➢ 测试用例的输入为:{x=4、y=5、z=5};{x=2、y=5、z=5}
➢ 程序执行的路径分别是:abd;ace
• 分析:
上述两个测试用例不仅满足了判定覆盖,同时还做到语 句覆盖。从这点看似乎判定覆盖比语句覆盖更强一些,但 仍然无法确定判定内部条件的错误。例如把第二个判定中 的条件y>5错误写为y<5,使用上述测试用例,照样能按原 路径执行而不影响结果。因此,需要有更强的逻辑覆盖准 则去检验判定内的条件。
第四章 白盒测试及其用例的设计
条件覆盖(续)
• 根据条件覆盖的基本思想,要使上述4个条件可能产生的 8种情况至少满足一次,设计测试用例如下:
测试用例 执行路径 覆盖条件 覆盖分支
x=4、y=6、z=5
abd
T1、T2、 T3、T4
bd
x=2、y=5、 z=15 ace
-T1、-T2、 -T3、-T4
假设此时开发工作已结束,程序 送交到测试组,没有人知道代码中有 一个潜在的被 0 除的错误。若测试组 采用的测试用例的执行路径没有同时 经过x=0和y=5/x进行测试,显然测试 工作似乎非常完善,测试用例覆盖了 所有执行语句,也没有被 0 除的错误 发生。
Return
A Free sample background from
A Free sample background from
第四章 白盒测试及其用例的设计
判定覆盖(续)
• 说明:以上仅考虑了两出口的判断,我们还应把判定覆盖 准则扩充到多出口判断(如Case语句)的情况。因此,判 定覆盖更为广泛的含义应该是使得每一个判定获得每一种 可能的结果至少一次。
白盒测试及用例的设计
条件覆盖率
详细描述
为了提高条件覆盖率,可以增加 更多的测试用例或优化现有的测 试用例。
04
总结词
高条件覆盖率意味着测试用例对 程序中的条件进行了全面的测试, 但并不能保证所有可能的条件结 果都已覆盖。
01 03
总结词
条件覆盖率是衡量测试用例覆盖 程序中条件语句(如if、while等) 中的条件的程度的指标。
TestNG是Java语言的测试框架,具有灵活的测试用例 管理功能。
详细描述
TestNG支持多种测试类型,如单元测试、集成测试和 端到端测试。它提供了丰富的断言方法和数据驱动测试 ,有助于提高测试效率和代码覆盖率。
案例三:使用Selenium进行白盒测试
总结词
Selenium是一个用于Web应用程序 的自动化测试框架。
边界值分析法
总结词
边界值分析法是一种白盒测试用例设计方法 ,它关注输入域的边界值,通过测试边界值 和附近的值来验证软件的健壮性。
详细描述
边界值分析法主要针对输入域的边界值进行 测试,因为这些值在软件中往往容易出现问 题。通过测试边界值和附近的值,可以有效 地发现软件在处理异常情况时的缺陷和错误 。这种方法有助于提高测试的覆盖率,确保
详细描述
Selenium支持多种浏览器和操作系统, 能够模拟用户操作,如点击、输入等。 通过编写测试脚本,可以实现对Web 应用程序的全面白盒测试,确保功能 和用户体验的正确性。
感谢您的观看
THANKS
缺陷跟踪与修复
缺陷管理
对发现的问题进行跟踪管理,确保问题得到及时修复。
缺陷验证
对修复的问题进行验证,确保问题已被正确修复。
白盒测试及其用例设计
优先测试关键业务
逻辑
针对核心功能和业务流程,设计 有针对性的测试用例,提高关键 代码的覆盖率。
自动化测试工具
利用自动化测试工具进行白盒测 试,可以快速执行大量测试用例, 提高代码覆盖率。
如何处理复杂的业务逻辑?
分解复杂逻辑
将复杂的业务逻辑拆分成多个小逻辑,针对每个 小逻辑设计独立的测试用例,降低测试难度。
确定测试目标与范围
1
明确测试的目的和目标,确定测试的范围和重点。
2
了解被测系统的需求和功能,确定测试的关注点。
3
确定测试所需的资源、时间和人力,制定相应的 计划。
分析被测系统与代码
对被测系统进行详细分析,了解其架构、模块 和关键功能。
熟悉被测系统的代码结构、逻辑和实现方式。
识别潜在的缺陷和风险点,为设计测试用例提 供依据。
详细描述
判定表设计法是一种基于条件判断的测试用 例设计方法。它通过列出所有可能的输入条 件和相应的输出结果,构建判定表,然后根 据判定表设计测试用例,以覆盖所有可能的
输入条件和输出结果。
决策树设计法
总结词
通过构建决策树来设计测试用例的方法。
详细描述
决策树设计法是一种基于条件判断的测试用例设计方法。它通过构建决策树来表示软件 中各种条件判断的逻辑关系,然后根据决策树设计测试用例,以覆盖所有可能的判断逻
分析测试覆盖率和质量,评估被测系统的质量水 平。
提供改进建议和优化方案,为开发团队提供反馈 和建议。
05
白盒测试工具与技术
Junit
Junit是一个Java语言的单元测 试框架,用于编写和执行测试 用例,验证代码的正确性和可
靠性。
它支持测试驱动开发(TDD), 允许开发者先编写测试用例,再 编写实现代码,从而保证代码质
实验4 白盒测试-JUnit
实验四 白盒测试-JUNIT【实验目的】通过上机使用JUNIT 工具, 体会单元测试、白盒测试的逻辑覆盖的方法。
【实验环境】Eclipse, JAVA5以上, JUNIT4【实验要求】根据书上第3章后的第6题(P63页)的流程图,用最少的测试用例完成覆盖要求:路径覆盖+条件组合覆盖。
要求:1)根据流程图进行单元测试用例设计;(函数输入:整型x 和y ,函数输出:y ) 2)完成源代码和测试代码。
3)执行JUNIT 输出测试结果,满足覆盖率且用例通过率100%(说明:如果你想体验TDD(TestDrivenDevelope),可以先完成测试代码,再写源代码,直至所有的测试代码全部Pass 。
)【实验指导】1、JUNIT 工具的使用说明·JUNIT 简介JUNIT 工具最初是由Erich Gamma 和 Kent Beck 编写的一个单元测试(Unit Test )的支持框架。
用来编写和执行单元测试,即所谓白盒测试。
本次实验我们采用的是JUNIT4,与以前的JUNIT3相比,使用起来简单方便许多。
在JUNIT3中,测试用例必须继承TestCase 类、且测试方法必须以test 开头,在JUnit4中,测试用例无需继承TestCase 类,只需要使用@Test 等注解。
·JUNIT 环境配置Eclipse 已带有JINIT 插件,无须安装只需要配置即可。
具体步骤: 1) 创建java Project 。
例:将项目命名为TDD2) 添加Junit4 libraires 。
选择对应项目 (在Package Explorer 中) -> 右击鼠标 -> 选择properties -> 选择Java Build Path (在左边的菜单中) -> 在右边选择标签 Libraries -> 单击按钮“Add Library” -> 选择JUnit , 单击按钮 “Next>” -> 选择eJUnit library version 为:JUnit4 -> 单击按钮“Finish” –> 单击按钮“OK”即可。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第4章 白盒测试及其实例设计
4.1 4.2 4.3 4.4 小结 习题 逻辑覆盖测试 路径分析测试 其他白盒测试方法 实例设计
本章概述 白盒测试是软件测试实践中最为有效和实用的方法之一。 白盒测试是基于程序的测试,检测产品的内部结构是否合理 以及内部操作是否按规定执行,覆盖测试与路径测试是其两 大基本策略。本章重点围绕逻辑覆盖和路径分析展开介绍常 见的白盒测试方法,并通过实例说明如何实际运用白盒测试 技术。
路径覆盖 路径覆盖(Path Coverage)要求设计若干测试用例,执行被测试程 序时,能够覆盖程序中所有的可能路径。 测试用例组8: Test Case 1:x=2000,y=600,z=6000 Test Case 3:x=50,y=600,z=2000 Test Case 4:x=2000,y=600,z=2000 Test Case 7:x=2000,y=200,z=1000
图4-5 程序4-3的控制流图
4.2.3 Z路径覆盖测试
Z路径覆盖是路径覆盖面的一种变体。对于语句较少的简单程序,路径覆盖是具有 可行性的。但是对于源代码很多的复杂程序,或者对于含有较多条件语句和较多循环 体的程序来说,需要测试的路径数目会成倍增长,达到一个巨大数字,以至于无法实 现路径覆盖。 为了解决这一问题,采用简化循环方法的路径覆盖就是Z路径覆盖。 所谓简化循环就是减少循环的次数。不考虑循环体的形式和复杂度如何,也不考 虑循环体实际上需要执行多少次,只考虑通过循环体零次和一次这两种情况。这里的 零次循环是指跳过循环体,从循环体的入口直接到循环体的出口。通过一次循环体是 指检查循环初始值。 如图4-6(a)和图4-6(b)所示表示了两种最典型的循环控制结构。图4-6(a) 是先比较循环条件后执行循环体,循环体B可能执行也可能不被执行。限定循环体B 执行零次和一次,这样就和图4-6(c)的条件结构一样了。图4-6(b)是先执行循 环体后比较循环条件。假设循环体B被执行一次,在经过条件判断跳出循环,那么其 效果就和图4-6(c)的条件结构只执行右分支的效果一样了。 一旦将循环结构简化为选择结构后,路径的数量将大大减少,这样就可以实现路 径覆盖测试了。对于实现简化循环的程序,可以将程序用路径树来表示。当得到某一 程序的路径树后,从其根节点开始,一次遍历,再回到根节点时,将所经历的叶节点 名排列起来,就得到一个路径。如果已经遍历了所有叶子节点,那就得到了所有的路 径。当得到所有的路径后,生成每个路径的测试用例,就可以实现Z路径覆盖测试。
条件覆盖 条件覆盖(Condition Coverage)是指设计 若干个测试用例,执行被测试程序时,程序中 每个判断条件中的每个判断式的真值和假值至 少被执行一遍。 测试用例组5: Test Case 6:50,600,6000 Test Case 7:2000,200,1000
判断/条件覆盖 判断/条件覆盖是指设计若干个测试用例,执行被测试程序时,程序中 每个判断条件的真假值分支至少被执行一遍,并且每个判断条件的内 部判断式的真假值分支也要被执行一遍。 测试用例组6: Test Case 1:x=2000, y=600, z=2000 Test Case 6:x=2000, y=200, z=6000 Test Case 7:x=2000, y=600, z=2000 Test Case 8:x=50, y=200, z=2000
4.1 逻辑覆盖测试
白盒测试技术的常见方法之一就是覆盖测试,它是利用程序的逻辑结 构设计相应的测试用例。测试人员要深入了解被测程序的逻辑结构特点, 完全掌握源代码的流程,才能设计出恰当的用例。根据不同的测试要求, 覆盖测试可以分为语句覆盖、判断覆盖、条件覆盖、判断/条件覆盖、条 件组合覆盖和路径覆盖。 下面是一段简单的C语言程序,作为公共程序段来说明五种覆盖测试的各 自特点。 程序4-1: 1 If (x>100&& y>500) then 2 score=score+1 3 If (x>=1000|| z>5000) then 4 score=score+5
1.导出程序控制流图 根据源代码可以导出程序的 控制流图,如图4-4所示。每个圆圈 代表控制流图的节点,可以表示一个 或多个语句。圆圈中的数字对应程序 中某一行的编号。箭头代表边的方向, 即控制流方向。
图4-4 程序4-2的控制流图
2.求出程序环形复杂度 根据程序环形复杂度的计算公式,求出程序路径集合中的独立路径数目。 公式1:V(G)=10-8+2,其中10是控制流图G中边的数量,8是控制流图 中节点的数目。 公式2:V(G)=3+1,其中3是控制流图G中判断节点的数目。 公式3:V(G)=4,其中4是控制流图G中区域的数目。 因此,控制流图G的环形复杂度是4。就是说至少需要4条独立路径组成基 本路径集合,并由此得到能够覆盖所有程序语句的测试用例。
图4-6 循环结构和条件结构
4.3 其他白盒测试方法
4.3.1 循环测试
循环测试是一种着重循 环结构有效性测试的白 盒测试方法。循环结构 测试用例的设计有以下 4种模式,如图4-7所示。
3.设计测试用例 根据上面环形复杂度的计算结果,源程序的基本路径集合中有4条独立路径: 路径1:7->18 路径2:7->9->10->16->7->18 路径3:7->9->11->15->16->7->18 路径4:7->9->11->13->14->15->16->7->18 根据上述4条独立路径,设计了测试用例组9,如表4-9所遍历这4条独立路径。对于源程序 中的循环体,测试用例组9中的输入数据使其执行零次或一次。
表4-9 测试用例组9
输入 测试用例 i str „T‟ „T‟ „A‟ „F‟ num1 期望输出 num2 score 执行路径
Test Case 1 Test Case 2 Test Case 3 Test Case 4
5 4 4 4
0 1 0 0
0 0 0 1
100 100 100 90
路径1 路径2 路径3 路径4
图4-2 常见的控制流图
程序环路复杂性
程序的环路复杂性是一种描述程序逻辑复杂度的标准,该标准 运用基本路径方法,给出了程序基本路径集中的独立路径条数, 这是确保程序中每个可执行语句至少执行一次所必需的测试用 例数目的上界。 给定一个控制流图G,设其环形复杂度为V(G),在这里介绍三 种常见的计算方法来求解V(G)。 (1) V(G)=E-N+2,其中E是控制流图G中边的数量,N是控制 流图中节点的数目。 (2) V(G)=P+1,其中P是控制流图G中判断节点的数目。 (3) V(G)=A,其中A是控制流图G中区域的数目。由边和结点 围成的区域叫做区域,当在控制流图中计算区域的数目时,控 制流图外的区域也应记为一个区域。
应该注意的是,上面6种覆盖测试方法所引用的公共程序只有短短4 行,是一段非常简单的示例代码。然而在实际测试程序中,一个简短 的程序,其路径数目是一个庞大的数字。要对其实现路径覆盖测试是 很难的。所以,路径覆盖测试是相对的,尽可能把路径数压缩到一个 可承受范围。
当然,即便对某个简短的程序段做到了路径覆盖测试,也不能保证源 代码不存在其他软件问题了。其他的软件测试手段也必要的,它们之 间是相辅相成的。没有一个测试方法能够找尽所有软件缺陷,只能说 是尽可能多地查找软件缺陷。
程序4-3: 1 if (a or b) 2 then 3 procedure x 4 else 5 procedure y; 6 …… 对应的控制流图如图4-5所示,程序行1的a,b都是独立的判断节点,还 有程序行4也是判断节点,所以共计3个判断节点。图4-5的环形复杂度为 V(G)=3+1,其中3是图4-5中判断节点的数目。
4.2 路径分析测试
4.2.1 控制流图
白盒测试是针对软件产品内部逻辑结构进行测试的,测试人员必须对测试 中的软件有深入的理解,包括其内部结构、各单元部分及之间的内在联系, 还有程序运行原理等等。因而这是一项庞大并且复杂的工作。为了更加突 出程序的内部结构,便于测试人员理解源代码,可以对程序流程图进行简 化,生成控制流图(Control Flow Graph)。简化后的控制流图是由节点 和控制边组成的。 控制流图有以下几个特点: 具有唯一入口节点,即源节点,表示程序段的开始语句; 具有唯一出口节点,即汇节点,表示程序段的结束语句; 节点由带有标号的圆圈表示,表示一个或多个无分支的源程序语句; 控制边由带箭头的直线或弧表示,代表控制流的方向。
图4-1 程序流程图
语句覆盖 语句覆盖(Statement Coverage)是指设计若干个测试用例,程序运行 时每个可执行语句至少被执行一次。在保证完成要求的情况下,测试用例的数 目越少越好。 以下是针对公共程序段设计的两个测试用例: Test Case 1:x=2000,y=600,z=6000 Test Case 2:x=900,y=600,z=6000 判断覆盖 判断覆盖(Branch Coverage)是指设计若干个测试用例,执行被测试程 序时,程序中每个判断条件的真值分支和假值分支至少被执行一遍。在保证完 成要求的情况下,测试用例的数目越少越好。 判断覆盖又称为分支覆盖。 以下是针对公共程序段设计的两个测试用例: Test Case 1:x=2000,y=600,z=6000 Test Case 3:x=50,y=600,z=2000
4.2.2 独立路径测试
从前面学过的覆盖测试一节中可知,对于一个较为复杂的程序要做到完 全的路径覆盖测试是不可能实现的。既然路径覆盖测试无法达到,那么可 以对某个程序的所有独立路径进行测试,也就是说检验了程序的每一条语 句,从而达到语句覆盖,这种测试方法就是独立路径测试方法。从控制流 图来看,一条独立路径是至少包含有一条在其它独立路径中从未有过的边 的路径。路径可以用控制流图中的节点序列来表示。 例如,在如图4-3所示的控制流图中,一组独立的路径是 path1:1 - 11 path2:1 - 2 - 3 - 4 - 5 - 10 - 1 - 11 path3:1 - 2 - 3 - 6 - 8 - 9 - 10 - 1 - 11 path4:1 - 2 - 3 - 6 - 7 - 9 - 10 - 1 - 11 路径 path1,path2,path3,path4组成了控制流图的一个基本路径 集。