1、第四章第四章 白盒测试及其用例设计白盒测试及其用例设计软件测试概论软件测试概论Software Testing韩启龙韩启龙RCIIP Software Testing2第第4章章 白盒测试及其用例的设计白盒测试及其用例的设计4.1 白盒测试方法白盒测试方法4.2 基本概念基本概念4.3 静态白盒测试静态白盒测试4.4 动态白盒测试动态白盒测试RCIIP Software Testing3本章教学目标本章教学目标理论环节v学习理解白盒测试方法的基本概念学习理解白盒测试方法的基本概念v学习理解白盒测试的覆盖理论学习理解白盒测试的覆盖理论v学习掌握白盒测试的路径表达学习掌握白盒测试的路径表达v学习掌
2、握白盒测试的基本路径测试法学习掌握白盒测试的基本路径测试法实践环节v通过案例运用学习掌握覆盖问题的解决方法通过案例运用学习掌握覆盖问题的解决方法v运用基本路径测试方法进行实际程序测试运用基本路径测试方法进行实际程序测试RCIIP Software Testing44.1 白盒测试方法白盒测试方法v 为什么要进行白盒测试?为什么要进行白盒测试?如果所有软件错误的根源都可以追溯到某个如果所有软件错误的根源都可以追溯到某个唯一原因唯一原因,那,那么问题就简单了。然而,事实上一个么问题就简单了。然而,事实上一个bug 常常是由多个因常常是由多个因素共同导致的,如下图所示。素共同导致的,如下图所示。假设
3、此时开发工作已结束,程序送交到测试组,没有人知道代码中有一个潜在的被 0 除的错误。若测试组采用的测试用例的执行路径没有同时经过x=0和y=5/x进行测试,显然测试工作似乎非常完善,测试用例覆盖了所有执行语句,也没有被 0 除的错误发生。RCIIP Software Testing5白盒测试方法(续)白盒测试方法(续)v 白盒测试也称白盒测试也称结构测试结构测试或或逻辑驱动测试逻辑驱动测试,是针对被测单元,是针对被测单元是如何进行工作的测试。它根据程序的是如何进行工作的测试。它根据程序的设计设计测试用例,主要用于测试用例,主要用于。v 白盒测试法检查程序白盒测试法检查程序内部逻辑结构内部逻辑结
4、构,对,对所有所有逻辑路径进行逻辑路径进行测试,是一种测试,是一种穷举穷举路径的测试方法。路径的测试方法。因为:。因为:穷举路径测试无法检查出程序本身是否违反了设计规范,即程序是否是一个错误的程序。穷举路径测试不可能查出程序因为遗漏路径而出错。穷举路径测试发现不了一些与数据相关的错误。RCIIP Software Testing6白盒测试方法(续)白盒测试方法(续)v 采用白盒测试方法必须遵循以下采用白盒测试方法必须遵循以下几条原则几条原则,才能,才能达到测试的目的:达到测试的目的:1.保证一个模块中的保证一个模块中的所有独立路径所有独立路径至少被测试一次。至少被测试一次。2.所有逻辑值所有逻
5、辑值均需测试真均需测试真(true)和假和假(false)两种情两种情况。况。3.检查程序的检查程序的内部数据结构内部数据结构,保证其结构的有效性。,保证其结构的有效性。4.在上下边界及可操作范围内运行在上下边界及可操作范围内运行所有循环所有循环。v 白盒测试主要是检查程序的白盒测试主要是检查程序的内部结构、逻辑、循内部结构、逻辑、循环和路径。环和路径。常用测试用例设计方法有:常用测试用例设计方法有:逻辑覆盖法(逻辑驱动测试)逻辑覆盖法(逻辑驱动测试)基本路径测试方法基本路径测试方法RCIIP Software Testing74.2 白盒测试的基本概念白盒测试的基本概念4.2.1 控制流图控
6、制流图4.2.2 环形复杂度环形复杂度4.2.3 图矩阵图矩阵RCIIP Software Testing84.2.1 控制流图控制流图v控制流图(控制流图(可简称可简称流图)流图)是对程序流程图进行简化是对程序流程图进行简化后得到的,它可以更加突出的表示后得到的,它可以更加突出的表示程序控制流的结程序控制流的结构。构。v控制流图中包括两种图形符号:控制流图中包括两种图形符号:节点节点和和控制流线。控制流线。节点由带标号的节点由带标号的圆圈圆圈表示,可代表表示,可代表一个或多个语句一个或多个语句、一一个处理框序列和一个条件判定框个处理框序列和一个条件判定框(假设不包含复合条(假设不包含复合条件
7、)。件)。控制流线由带箭头的弧或线表示,可称为边。它代表程控制流线由带箭头的弧或线表示,可称为边。它代表程序中的控制流。序中的控制流。RCIIP Software Testing9常见结构的控制流图常见结构的控制流图顺序结构IF选择结构WHILE重复结构UNTIL重复结构CASE多分支结构其中,包含条件的节点被称为判定节点判定节点(也叫谓词节点),由判定节点发出的边必须终止于某一个节点,由边和节点所限定的范围被称为区域区域。RCIIP Software Testing10控制流图样例控制流图样例RCIIP Software Testing11复合条件的分解复合条件的分解对于复合条件,则可将其分
8、解为多个对于复合条件,则可将其分解为多个单个条件,并映射成控制流图。单个条件,并映射成控制流图。RCIIP Software Testing124.2.2 环形复杂度环形复杂度v环形复杂度也称为环形复杂度也称为圈复杂度,圈复杂度,它是一种为它是一种为程序程序逻辑复杂度逻辑复杂度提供定量尺度的软件度量。提供定量尺度的软件度量。v环形复杂度的应用环形复杂度的应用可以将环形复杂度用于可以将环形复杂度用于基本路基本路径方法径方法,它可以提供:程序基本集的,它可以提供:程序基本集的独立路径数量独立路径数量;确保确保所有语句所有语句至少执行一次的测试数量的上界至少执行一次的测试数量的上界。独立路径是指程序
9、中至少引入了一个新的处理语句集合或一个新条件的程序通路。采用流图的术语,即独立路径必须至少包含一条在本次定义路径之前不曾用过的边。v 测试可以被设计为测试可以被设计为基本路径集基本路径集的执行过程,但基本路径集通常的执行过程,但基本路径集通常并不唯一。并不唯一。RCIIP Software Testing13计算环形复杂度的方法计算环形复杂度的方法v环形复杂度以图论为基础,为我们提供了非常有用环形复杂度以图论为基础,为我们提供了非常有用的软件度量。可用以下方法之一来计算环形复杂度:的软件度量。可用以下方法之一来计算环形复杂度:控制流图中区域的数量对应于环形复杂度。给定控制流图G的环形复杂度V(
10、G),定义为 V(G)=E-N+2 其中,E是控制流图中边的数量,N是控制流图中的节点数量。给定控制流图G的环形复杂度V(G),也可定义为 V(G)=P+1 其中,P是控制流图G中判定节点的数量。RCIIP Software Testing144.2.3 图矩阵图矩阵v图矩阵是图矩阵是控制流图控制流图的的矩阵表示形式矩阵表示形式。v图矩阵是一个图矩阵是一个方形矩阵方形矩阵,其,其维数等于维数等于控制流图的控制流图的节节点数点数。矩阵中的每列和每行都对应于标识的节点,。矩阵中的每列和每行都对应于标识的节点,矩阵元素对应于节点间的边。矩阵元素对应于节点间的边。v通常,控制流图中的结点用数字标识,边
11、则用字母通常,控制流图中的结点用数字标识,边则用字母标识。如果在控制流图中从第标识。如果在控制流图中从第 i 个结点到第个结点到第 j 个个结点有一个标识为结点有一个标识为 x 的边相连接,则在对应图矩的边相连接,则在对应图矩阵的第阵的第 i 行第行第 j 列有一个非空的元素列有一个非空的元素 x。RCIIP Software Testing15图矩阵样例图矩阵样例结点结点12341a2b3c4dRCIIP Software Testing164.3 静态白盒测试静态白盒测试4.3.1 相关概念相关概念4.3.2 代码检查法代码检查法4.3.3 审查审查RCIIP Software Testi
12、ng174.3.1 相关概念相关概念是在是在不执行软件不执行软件条件下有条理地仔条件下有条理地仔细细审查审查软件设计、体系结构和代码,从而找出软软件设计、体系结构和代码,从而找出软件缺陷的过程,有时称为件缺陷的过程,有时称为结构化分析结构化分析。v首要原因首要原因是尽早发现软件缺陷,以找出动态黑盒是尽早发现软件缺陷,以找出动态黑盒测试难以发现或隔离的软件缺陷。在测试难以发现或隔离的软件缺陷。在开发过程初开发过程初期期让测试小组集中精力进行软件设计的审查非常让测试小组集中精力进行软件设计的审查非常有价值。有价值。v另一个原因另一个原因,为黑盒测试员在接受软件进行软件,为黑盒测试员在接受软件进行软
13、件测试时设计和应用测试用例测试时设计和应用测试用例提供思路提供思路。他们可能。他们可能不必了解代码的细节,但是通过听不必了解代码的细节,但是通过听审查评论审查评论,可,可以确定以确定有问题或者容易产生有问题或者容易产生软件缺陷的特性范围。软件缺陷的特性范围。静态白盒测试的好处静态白盒测试的好处RCIIP Software Testing184.3.2 代码检查法代码检查法v检查代码和设计的一致性检查代码和设计的一致性v代码对标准的遵循、可读性代码对标准的遵循、可读性v代码逻辑表达的正确性代码逻辑表达的正确性v代码结构的合理性代码结构的合理性v程序编写与编写标准的符合性程序编写与编写标准的符合性
14、v程序中不安全、不明确和模糊的部分程序中不安全、不明确和模糊的部分v编程风格问题等编程风格问题等 通过通过桌面检查桌面检查,代码审查代码审查和和走查走查方式,对以下方式,对以下内容进行检查:内容进行检查:RCIIP Software Testing194.3.2 代码检查法代码检查法1 1词法和语法分析词法和语法分析 2 2静态错误分析静态错误分析基本技术基本技术 用于确定在源程序中是否有某类错误或用于确定在源程序中是否有某类错误或危险危险结构,结构,包括以下几种:包括以下几种:(1)类型和单位分析类型和单位分析对源程序的类型进行检查,分析程序中的类型错误对源程序的类型进行检查,分析程序中的类
15、型错误(2)引用分析引用分析对程序中变量的引用进行检查,发现引用异常错误(如对程序中变量的引用进行检查,发现引用异常错误(如变量在定义前被引用,变量定义后未被引用)。变量在定义前被引用,变量定义后未被引用)。(3)表达式分析表达式分析(4)接口分析接口分析RCIIP Software Testing204.3.3 审审 查查审查方式审查方式1 1正式审查基本要素正式审查基本要素2 2同事审查同事审查3 3走查走查4 4检验检验通用代码审查清单通用代码审查清单RCIIP Software Testing214.3.3 审审 查查1 1正式审查基本要素正式审查基本要素1.1.确定问题确定问题2.2
16、.遵守规则遵守规则3.3.准备准备4.4.编写报告编写报告审查的目的是找出软件的问题审查的目的是找出软件的问题不仅是出不仅是出错的项目,还包括错的项目,还包括遗漏项目遗漏项目。对象为。对象为代码或代码或设计。设计。审查要遵守一套固定的规则,规则可能设定审查要遵守一套固定的规则,规则可能设定要审查的要审查的代码量代码量,花费时间花费时间,哪些内容哪些内容要做要做评价等。评价等。每个参与者都为审查做准备。根据审查的类每个参与者都为审查做准备。根据审查的类型,参与者可能扮演型,参与者可能扮演不同的角色不同的角色,需要了解,需要了解自己的责任和义务。在审查过程中,大部分自己的责任和义务。在审查过程中,
17、大部分的问题是在准备期间发现的。的问题是在准备期间发现的。审查小组必须做出审查结果的审查小组必须做出审查结果的书面总结报告书面总结报告,并使报告便于开发小组的成员使用。并使报告便于开发小组的成员使用。RCIIP Software Testing224.3.3 审审 查查2 2同事审查同事审查u召集小组成员进行召集小组成员进行初次正式审查初次正式审查最简单的方法是通过最简单的方法是通过同事审查的方式。这是要求最低的正式方式,有时称为同事审查的方式。这是要求最低的正式方式,有时称为伙伴审查伙伴审查。这种方法大体类似于。这种方法大体类似于“你看我的,我看你的你看我的,我看你的”类型的讨论。类型的讨论
18、。u同事审查常常同事审查常常仅在编写代码或设计体系结构的程序员,仅在编写代码或设计体系结构的程序员,以及充当审查者的其他一两个程序员和测试员之间进行。以及充当审查者的其他一两个程序员和测试员之间进行。这个小团体只是在一起审查代码,寻找问题和失误。为这个小团体只是在一起审查代码,寻找问题和失误。为了保证审查的高效率,所有的参与者要切实保证正式审了保证审查的高效率,所有的参与者要切实保证正式审查的查的4个关键基本要素:个关键基本要素:u查找问题、遵守规则、审查准备和编写报告。查找问题、遵守规则、审查准备和编写报告。RCIIP Software Testing234.3.3 审审 查查3 3走查(走
19、查(WalkthroughWalkthrough)u 比同事审查更正规化的下一步。走查中比同事审查更正规化的下一步。走查中编写代码的编写代码的程序员程序员向向5人小组或者其它程序员和测试员组成的小组人小组或者其它程序员和测试员组成的小组做做正式陈述正式陈述。审查人员应该在审查之前接到软件拷贝,。审查人员应该在审查之前接到软件拷贝,以便检查并编写备注和问题,在审查过程中提问。审查以便检查并编写备注和问题,在审查过程中提问。审查人员之中至少有一位人员之中至少有一位资深程序员资深程序员是很重要的。是很重要的。u 陈述者陈述者逐行或者逐个功能逐行或者逐个功能地通读代码,解释代码为地通读代码,解释代码为
20、什么且如何工作。什么且如何工作。审查人员聆听叙述,提出有疑义的问审查人员聆听叙述,提出有疑义的问题。由于公开陈述的参与人数要多于同事审查,因此,题。由于公开陈述的参与人数要多于同事审查,因此,为审查做好为审查做好准备和遵守规则准备和遵守规则是非常重要的。同样重要的是非常重要的。同样重要的是审查之后,表述者是审查之后,表述者编写报告编写报告说明发现了哪些问题,计说明发现了哪些问题,计划如何解决发现的软件缺陷。划如何解决发现的软件缺陷。RCIIP Software Testing244.3.3 审审 查查4 4检验(检验(inspectionsinspections)u 最正式最正式的审查类型,具
21、有高度组织化,要求每一个参的审查类型,具有高度组织化,要求每一个参与者都接受训练。与者都接受训练。检验检验与与同事审查同事审查和和走查走查的的不同之处在不同之处在于表述代码的人于表述代码的人表述者(表述者(presenter)或者宣读)或者宣读(reader)不是原来的程序员不是原来的程序员。这就迫使他学习和。这就迫使他学习和了解要表述的材料,从而有可能在检验会议上提出不同了解要表述的材料,从而有可能在检验会议上提出不同的看法和解释。的看法和解释。u 其余的参与者称为检验员(其余的参与者称为检验员(inspector),其职责是从),其职责是从不同的角度审查代码。不同的角度审查代码。u 有些检
22、验员还同时被委任为会议协调员(有些检验员还同时被委任为会议协调员(moderator)和会议记录员(和会议记录员(recorder),以保证检验过程遵守规则),以保证检验过程遵守规则及审查有效进行。及审查有效进行。RCIIP Software Testing254.3.3 审审 查查通用代码审查清单通用代码审查清单1.1.数据引用错误数据引用错误2.2.数据声明错误数据声明错误3.3.计算错误计算错误4.4.比较错误比较错误5.5.控制流程错误控制流程错误6.6.子程序参数错误子程序参数错误7.7.输入输入/输出错误输出错误8.8.其他错误其他错误RCIIP Software Testing2
23、6数据引用错误数据引用错误 A.A.是否引用了未初始化的变量?是否引用了未初始化的变量?B.B.数组和字符串的下标是整数值吗?下标总是在数组和字符串的下标是整数值吗?下标总是在数组和字符串大小范围之内吗?数组和字符串大小范围之内吗?C.C.在检索操作或者应用数组下标时是否包含在检索操作或者应用数组下标时是否包含 丢丢掉一个掉一个 这样的潜在错误?这样的潜在错误?D.D.是否在应该使用常量的地方使用了变量?是否在应该使用常量的地方使用了变量?E.E.变量是否被赋予不同类型的值?变量是否被赋予不同类型的值?F.F.为引用的指针分配内存了吗?为引用的指针分配内存了吗?G.G.一个数据结构是否在多个函
24、数或者子程序中引一个数据结构是否在多个函数或者子程序中引用,在每一个引用中明确定义结构了吗?用,在每一个引用中明确定义结构了吗?RCIIP Software Testing27数据声明错误数据声明错误 A.A.所有变量都赋予正确的长度、类型和存储类所有变量都赋予正确的长度、类型和存储类了吗?了吗?B.B.变量是否在声明的同时进行了初始化?是否变量是否在声明的同时进行了初始化?是否正确初始化并与其类型一致?正确初始化并与其类型一致?C.C.变量有相似的名称吗?变量有相似的名称吗?D.D.存在声明过、但从未引用或者只引用过一次存在声明过、但从未引用或者只引用过一次的变量吗?的变量吗?E.E.在特定
25、模块中所有变量都显式地声明了吗?在特定模块中所有变量都显式地声明了吗?RCIIP Software Testing28计算错误计算错误 A.A.计算中是否使用了不同数据类型的变量,如整数与浮点数相计算中是否使用了不同数据类型的变量,如整数与浮点数相加?加?B.B.计算中是否使用了数据类型相同但字节长度不同的变量?计算中是否使用了数据类型相同但字节长度不同的变量?C.C.计算时是否了解和考虑到编译器对类型或长度不一致的变量计算时是否了解和考虑到编译器对类型或长度不一致的变量的转换规则?的转换规则?D D.赋值的目的变量是否小于赋值表达式的值?赋值的目的变量是否小于赋值表达式的值?E.E.在数值计
26、算过程中是否可能出现溢出?在数值计算过程中是否可能出现溢出?F.F.除数或模是否可能为零?除数或模是否可能为零?G.G.对于整型算术运算或某些计算,特别是除法的代码处理是否对于整型算术运算或某些计算,特别是除法的代码处理是否会丢失精度?会丢失精度?H.H.变量的值是否超过有意义的范围?变量的值是否超过有意义的范围?I.I.对于包含多个操作的表达式,求值次序是否混乱,运算优先对于包含多个操作的表达式,求值次序是否混乱,运算优先级对吗?需要加括号使其清晰吗?级对吗?需要加括号使其清晰吗?RCIIP Software Testing29比较错误比较错误 A.A.比较得正确吗?比较得正确吗?B.B.存
27、在分数或者浮点数之间的比较吗?如果有,精存在分数或者浮点数之间的比较吗?如果有,精度问题会影响比较吗?度问题会影响比较吗?1.000000011.00000001和和1.000000021.00000002极极其接近,它们相等吗?其接近,它们相等吗?C.C.每一个逻辑表达式都正确地表达了吗?逻辑计算每一个逻辑表达式都正确地表达了吗?逻辑计算如期进行了吗?求值次序有疑问吗?如期进行了吗?求值次序有疑问吗?D.D.逻辑表达式的操作数是逻辑值吗?逻辑表达式的操作数是逻辑值吗?RCIIP Software Testing30控制流程错误控制流程错误A.A.程序中的语句组是否对应?程序中的语句组是否对应
28、?B.B.程序、模块、子程序和循环能否终止?如果不能,程序、模块、子程序和循环能否终止?如果不能,可以接受吗?可以接受吗?C.C.可能存在永远不停的循环吗?可能存在永远不停的循环吗?D.D.循环可能从不执行吗?如果是这样,可能接受吗?循环可能从不执行吗?如果是这样,可能接受吗?E.E.对于多分支语句,索引变量能超出可能的分支数目对于多分支语句,索引变量能超出可能的分支数目吗?如果超出,该情况能正确处理吗?吗?如果超出,该情况能正确处理吗?F.F.是否存在是否存在 丢掉一个丢掉一个 错误,导致意外进入循环错误,导致意外进入循环 RCIIP Software Testing31子程序参数错误子程序
29、参数错误 A.A.子程序接收的参数类型和大小与调用代码发送的子程序接收的参数类型和大小与调用代码发送的匹配吗?次序正确吗?匹配吗?次序正确吗?B.B.如果子程序有多个入口点,引用的参数是否与当如果子程序有多个入口点,引用的参数是否与当前入口点没有关系?前入口点没有关系?C.C.常量是否当作形参传递,意外在子程序中改动?常量是否当作形参传递,意外在子程序中改动?D.D.子程序是更改了仅作为输入值的参数?子程序是更改了仅作为输入值的参数?E.E.每一个参数的单位是否与相应的形参匹配?每一个参数的单位是否与相应的形参匹配?F.F.如果存在全局变量,在所有引用子程序中是否有如果存在全局变量,在所有引用
30、子程序中是否有相似的定义和属性?相似的定义和属性?RCIIP Software Testing32输入输入/输出错误输出错误A.A.软件是否严格遵守外设读写数据的专用格式?软件是否严格遵守外设读写数据的专用格式?B.B.软件是否处理外设未连接、不可用、或者读写过软件是否处理外设未连接、不可用、或者读写过程中存储空间占满等情况?程中存储空间占满等情况?C.C.软件以预期的方式处理预计的错误吗?软件以预期的方式处理预计的错误吗?D.D.检查错误提示信息的准确性、正确性、语法和拼检查错误提示信息的准确性、正确性、语法和拼写了吗?写了吗?RCIIP Software Testing33其他错误其他错误
31、 A.A.软件是否使用其他外语?是否处理扩展软件是否使用其他外语?是否处理扩展ASCIIASCII字字符?是否需用统一编码取代符?是否需用统一编码取代ASCIIASCII?B.B.软件是否需要移植到其他编译器?软件是否需要移植到其他编译器?C.C.是否考虑了兼容性,以使软件能够运行于不同数是否考虑了兼容性,以使软件能够运行于不同数量的可用内存、不同的内部硬件、不同的外设等?量的可用内存、不同的内部硬件、不同的外设等?D.D.程序编译是否产生程序编译是否产生 警告警告 或者或者 提示提示 信息?这些信息?这些信息通常指示语句有疑问。信息通常指示语句有疑问。RCIIP Software Testi
32、ng34REVIEW(20110329)v白盒测试白盒测试白盒测试也称白盒测试也称结构测试结构测试或或逻辑驱动测试逻辑驱动测试,是针对被测单元,是针对被测单元是如何进行工作的测试。它根据程序的是如何进行工作的测试。它根据程序的设计设计测试用例,主要用于测试用例,主要用于。v 采用白盒测试方法必须遵循以下采用白盒测试方法必须遵循以下几条原则几条原则,才能,才能达到测试的目的:达到测试的目的:1.保证一个模块中的保证一个模块中的所有独立路径所有独立路径至少被测试一次。至少被测试一次。2.所有逻辑值所有逻辑值均需测试真均需测试真(true)和假和假(false)两种情两种情况。况。3.检查程序的检查
33、程序的内部数据结构内部数据结构,保证其结构的有效性。,保证其结构的有效性。4.在上下边界及可操作范围内运行在上下边界及可操作范围内运行所有循环所有循环。v 白盒测试主要是检查程序的白盒测试主要是检查程序的内部结构、逻辑、循内部结构、逻辑、循环和路径。环和路径。常用测试用例设计方法有:常用测试用例设计方法有:逻辑覆盖法(逻辑驱动测试)逻辑覆盖法(逻辑驱动测试)基本路径测试方法基本路径测试方法RCIIP Software Testing35REVIEW(20110329)v控制流图(控制流图(可简称可简称流图)流图)是对程序流程图进行是对程序流程图进行简化后得到的,它可以更加突出的表示简化后得到的
34、,它可以更加突出的表示程序控程序控制流的结构。制流的结构。顺序结构IF选择结构WHILE重复结构UNTIL重复结构CASE多分支结构其中,包含条件的节点被称为判定节点判定节点(也叫谓词节点),由判定节点发出的边必须终止于某一个节点,由边和节点所限定的范围被称为区域区域。RCIIP Software Testing36控制流图样例控制流图样例REVIEW(20110329)对于复合条件,则可将其分解为多个对于复合条件,则可将其分解为多个单个条件,并映射成控制流图。单个条件,并映射成控制流图。环形复杂度环形复杂度图矩阵图矩阵RCIIP Software Testing37是在是在不执行软件不执行软
35、件条件下有条理地仔条件下有条理地仔细细审查审查软件设计、体系结构和代码,从而找出软软件设计、体系结构和代码,从而找出软件缺陷的过程,有时称为件缺陷的过程,有时称为结构化分析结构化分析。REVIEW(20110329)通过通过桌面检查桌面检查,代码审查代码审查和和走查走查方式,对以下方式,对以下内容进行检查:内容进行检查:v检查代码和设计的一致性检查代码和设计的一致性v代码对标准的遵循、可读性代码对标准的遵循、可读性v代码逻辑表达的正确性代码逻辑表达的正确性v代码结构的合理性代码结构的合理性v程序编写与编写标准的符合性程序编写与编写标准的符合性v程序中不安全、不明确和模糊的部分程序中不安全、不明
36、确和模糊的部分v编程风格问题等编程风格问题等RCIIP Software Testing381 1正式审查基本要素正式审查基本要素1.1.确定问题确定问题2.2.遵守规则遵守规则3.3.准备准备4.4.编写报告编写报告审查的目的是找出软件的问题审查的目的是找出软件的问题不仅是出不仅是出错的项目,还包括错的项目,还包括遗漏项目遗漏项目。对象为。对象为代码或代码或设计。设计。审查要遵守一套固定的规则,规则可能设定审查要遵守一套固定的规则,规则可能设定要审查的要审查的代码量代码量,花费时间花费时间,哪些内容哪些内容要做要做评价等。评价等。每个参与者都为审查做准备。根据审查的类每个参与者都为审查做准备
37、。根据审查的类型,参与者可能扮演型,参与者可能扮演不同的角色不同的角色,需要了解,需要了解自己的责任和义务。在审查过程中,大部分自己的责任和义务。在审查过程中,大部分的问题是在准备期间发现的。的问题是在准备期间发现的。审查小组必须做出审查结果的审查小组必须做出审查结果的书面总结报告书面总结报告,并使报告便于开发小组的成员使用。并使报告便于开发小组的成员使用。REVIEW(20110329)RCIIP Software Testing394.4 动态白盒测试动态白盒测试4.4.1 相关概念相关概念4.4.2 逻辑覆盖技术逻辑覆盖技术4.4.3 路径测试技术路径测试技术RCIIP Software
38、 Testing404.4.1 相关概念相关概念动态白盒测试动态白盒测试 利用利用查看代码功能查看代码功能和和实现方式实现方式得到的信息得到的信息来确定哪些需要测试,哪些不需要测试。如何来确定哪些需要测试,哪些不需要测试。如何开展测试,从而设计和执行测试。开展测试,从而设计和执行测试。测试覆盖率测试覆盖率 用于确定测试所执行到的用于确定测试所执行到的覆盖项的百分比覆盖项的百分比。其中的覆盖项是指作为测试基础的一个入口或其中的覆盖项是指作为测试基础的一个入口或属性,比如语句、分支、条件等。属性,比如语句、分支、条件等。RCIIP Software Testing41测试覆盖率测试覆盖率 测试覆盖
39、率可以表示出测试的测试覆盖率可以表示出测试的充分性充分性,在,在测试分析报告中可以作为测试分析报告中可以作为量化指标量化指标的依据,测的依据,测试覆盖率越高效果越好。但覆盖率不是目标,试覆盖率越高效果越好。但覆盖率不是目标,只是一种只是一种手段手段。测试覆盖率包括测试覆盖率包括功能点覆盖率功能点覆盖率和和结构覆盖率结构覆盖率:1.1.功能点覆盖率功能点覆盖率大致用于表示软件已经实现的功能大致用于表示软件已经实现的功能与软件需要实现的功能之间的比例关系。与软件需要实现的功能之间的比例关系。2.2.结构覆盖率结构覆盖率包括包括语句语句覆盖率、覆盖率、分支分支覆盖率、覆盖率、循环循环覆盖率、覆盖率、
40、路径路径覆盖率等等。覆盖率等等。4.4.1 相关概念相关概念RCIIP Software Testing424.4.2 逻辑覆盖技术逻辑覆盖技术v逻辑覆盖:是以程序内部的逻辑结构为基础的测试用例设计方法。v 根据覆盖目标的不同,逻辑覆盖又可分为根据覆盖目标的不同,逻辑覆盖又可分为语句覆盖语句覆盖、判定判定覆盖覆盖、条件覆盖条件覆盖、判定判定/条件覆盖条件覆盖、组合覆盖组合覆盖和和路径覆盖路径覆盖。语句覆盖:选择足够多的测试用例,使得程序中的每个可执行语句至少执行一次。判定覆盖:通过执行足够的测试用例,使得程序中的每个判定至少都获得一次“真”值和“假”值,也就是使程序中的每个取“真”分支和取“假
41、”分支至少均经历一次,也称为“分支覆盖”。条件覆盖:设计足够多的测试用例,使得程序中每个判定包含的每个条件的可能取值(真/假)都至少满足一次。RCIIP Software Testing43判定/条件覆盖:设计足够多的测试用例,使得程序中每个判定包含的每个条件的所有情况(真/假)至少出现一次,并且每个判定本身的判定结果(真/假)也至少出现一次。满足判定/条件覆盖的测试用例一定同时满足判定覆盖和条件覆盖。组合覆盖:通过执行足够的测试用例,使得程序中每个判定的所有可能的条件取值组合都至少出现一次。满足组合覆盖的测试用例一定满足判定覆盖、条件覆盖和判定/条件覆盖。路径覆盖:设计足够多的测试用例,要求
42、覆盖程序中所有可能的路径。4.4.2 逻辑覆盖技术逻辑覆盖技术RCIIP Software Testing44组合覆盖判断/条件覆盖判断覆盖条件覆盖语句覆盖4.4.2 逻辑覆盖技术逻辑覆盖技术RCIIP Software Testing45void DoWork(int x,int y,int z)int k=0,j=0;if(x3)&(z5)j=x*y+10;/语句块语句块2 j=j%3;/语句块语句块3逻辑运算符有逻辑运算符有4个,它们分别是:!(逻辑非)、(个,它们分别是:!(逻辑非)、(逻辑或)、(逻辑与)(异或)。在位运算里面还有逻辑或)、(逻辑与)(异或)。在位运算里面还有(位与)
43、、(位或)的运算。(位与)、(位或)的运算。4.4.2 逻辑覆盖技术逻辑覆盖技术RCIIP Software Testing46x3&z5执行语句块执行语句块3FFTTabdce4.4.2 逻辑覆盖技术逻辑覆盖技术RCIIP Software Testing47v 要实现要实现DoWork函数的语句覆盖,只需设计一个测试用例就函数的语句覆盖,只需设计一个测试用例就可以覆盖程序中的所有可执行语句。可以覆盖程序中的所有可执行语句。测试用例输入为:x=4、y=5、z=5 程序执行的路径是:abdv 分析:分析:语句覆盖可以保证程序中的语句覆盖可以保证程序中的每个语句每个语句都得到执行,但发现都得到执
44、行,但发现不了不了判定中逻辑运算判定中逻辑运算的错误,即它并不是一种充分的检验的错误,即它并不是一种充分的检验方法。例如在第一个判定方法。例如在第一个判定(x3)&(z5错误写为错误写为y3)&(z3 取真值记为T1,取假值记为-T1 条件z5):条件x=4 取真值记为T3,取假值记为-T3 条件y5 取真值记为T4,取假值记为-T44.4.2 逻辑覆盖技术逻辑覆盖技术3.3.条件覆盖条件覆盖RCIIP Software Testing51条件覆盖(续)条件覆盖(续)v 根据条件覆盖的基本思想,要使上述根据条件覆盖的基本思想,要使上述4个条件可能产生的个条件可能产生的8种情况至少满足一次,设计
45、测试用例如下:种情况至少满足一次,设计测试用例如下:测试用例测试用例 执行路径执行路径 覆盖条件覆盖条件 覆盖分支覆盖分支 x=4、y=6、z=5 abd T1、T2、T3、T4 bd x=2、y=5、z=15 ace-T1、-T2、-T3、-T4 cev 分析:上面这组测试用例不但覆盖了分析:上面这组测试用例不但覆盖了4个条件的全部个条件的全部8种种情况,而且将两个判定的情况,而且将两个判定的4个分支个分支b、c、d、e也同时覆也同时覆盖了,即盖了,即同时达到了条件覆盖和判定覆盖同时达到了条件覆盖和判定覆盖。RCIIP Software Testing52条件覆盖(续)条件覆盖(续)v 说明
46、:虽然前面的一组测试用例说明:虽然前面的一组测试用例同时同时达到了达到了条件覆盖和判条件覆盖和判定覆盖定覆盖,但是,但是,。如果设计了下表中的这组测试用例,则虽然满足了。如果设计了下表中的这组测试用例,则虽然满足了条件覆盖,但只是覆盖了程序中条件覆盖,但只是覆盖了程序中第一个判定的取假第一个判定的取假分支分支c 和和第二个判定的取真第二个判定的取真分支分支d,不满足判定覆盖的要求。,不满足判定覆盖的要求。测试用例测试用例 执行路径执行路径 覆盖条件覆盖条件覆盖分支覆盖分支x=2、y=6、z=5 acd-T1、T2、-T3、T4 cdx=4、y=5、z=15 acdT1、-T2、T3、-T4 c
47、dRCIIP Software Testing53v 判定判定/条件覆盖实际上是将条件覆盖实际上是将判定覆盖和条件覆盖结合起来判定覆盖和条件覆盖结合起来的一种方法,即:设计足够的测试用例,使得判定中的一种方法,即:设计足够的测试用例,使得判定中每个每个条件条件的所有可能取值至少满足一次,同时的所有可能取值至少满足一次,同时每个判定每个判定的可能的可能结果也至少出现一次。结果也至少出现一次。v 根据判定根据判定/条件覆盖的基本思想,只需设计以下两个测试条件覆盖的基本思想,只需设计以下两个测试用例便可以覆盖用例便可以覆盖4个条件个条件的的8种取值种取值以及以及4个判定分支个判定分支。测试用例测试用
48、例 执行路径执行路径 覆盖条件覆盖条件覆盖分支覆盖分支x=4、y=6、z=5 abdT1、T2、T3、T4 bdx=2、y=5、z=15ace-T1、-T2、-T3、-T4 ce4.4.2 逻辑覆盖技术逻辑覆盖技术4.4.判定判定/条件覆盖条件覆盖RCIIP Software Testing54判定判定/条件覆盖(续)条件覆盖(续)v 分析:从表面上看,判定分析:从表面上看,判定/条件覆盖测试了各个判定中的条件覆盖测试了各个判定中的所有条件的取值,但实际上,所有条件的取值,但实际上,在检查含有多个条件在检查含有多个条件的逻辑表达式时,的逻辑表达式时,某些情况下的某些条件某些情况下的某些条件将会
49、被将会被其它条件其它条件所掩盖所掩盖。因此,判定。因此,判定/条件覆盖也条件覆盖也不一定能够完全不一定能够完全检查出检查出逻辑表达式中的错误。逻辑表达式中的错误。例如:对于第一个判定(x3)&(z3和z3为假,则编译器将不再检查z5)来说,若条件x=4满足,就认为该判定为真,这时将不会再检查y5,那么同样也无法发现这个条件中的错误。RCIIP Software Testing55v 组合覆盖的目的是要使设计的测试用例能覆盖组合覆盖的目的是要使设计的测试用例能覆盖每一个判定每一个判定的的所有可能的条件所有可能的条件取值取值。v 对对DoWork函数中的各个判定的条件取值组合加以标记:函数中的各个
50、判定的条件取值组合加以标记:1、x3,z3,z=10 记记T1、-T2,第一个判定的取假分支第一个判定的取假分支 3、x=3,z10 记记-T1、T2,第一个判定的取假分支第一个判定的取假分支 4、x=10 记记-T1、-T2,第一个判定的取假分支第一个判定的取假分支 5、x=4,y5 记记T3、T4,第二个判定的取真分支第二个判定的取真分支 6、x=4,y5 记记-T3、T4,第二个判定的取真分支第二个判定的取真分支 8、x!=4,y3&z=3&z10)按照我们前面设计的测试用例(按照我们前面设计的测试用例(x的值取的值取2或或4)来看,)来看,逻辑覆盖对这样的小问题都无能为力。分析出现这一