
《测试技术基础》PPT课件.ppt
259页软件测试基础软件测试基础第三章第三章 测试技术基础测试技术基础本章学习内容本章学习内容ØØ 黑盒测试黑盒测试黑盒测试黑盒测试ØØ 等价类划分法等价类划分法等价类划分法等价类划分法ØØ 边界值分析法边界值分析法边界值分析法边界值分析法ØØ 因果图法因果图法因果图法因果图法ØØ 决策表法决策表法决策表法决策表法ØØ白盒测试白盒测试白盒测试白盒测试ØØ逻辑覆盖测试逻辑覆盖测试逻辑覆盖测试逻辑覆盖测试ØØ基本路径测试基本路径测试基本路径测试基本路径测试ØØ 测试测试测试测试用例设计用例设计用例设计用例设计 无法对程序进行完全测试无法对程序进行完全测试 (1) (1) (1) (1) 输入量太大,不可能测试程序对所有可能输入量太大,不可能测试程序对所有可能输入量太大,不可能测试程序对所有可能输入量太大,不可能测试程序对所有可能输入的响应输入的响应输入的响应输入的响应 (2) (2) (2) (2) 输出结果太多输出结果太多输出结果太多输出结果太多 (3) (3) (3) (3) 软件实现途径太多,不可能测试到程序每软件实现途径太多,不可能测试到程序每软件实现途径太多,不可能测试到程序每软件实现途径太多,不可能测试到程序每一条可能的执行路径一条可能的执行路径一条可能的执行路径一条可能的执行路径 (4) (4) (4) (4) 软件规格说明没有客观标准软件规格说明没有客观标准软件规格说明没有客观标准软件规格说明没有客观标准 (5) (5) (5) (5) 不能采用逻辑来证明程序的正确性不能采用逻辑来证明程序的正确性不能采用逻辑来证明程序的正确性不能采用逻辑来证明程序的正确性 假设一个程序假设一个程序假设一个程序假设一个程序P P P P有输入量有输入量有输入量有输入量X X X X和和和和Y Y Y Y及输出量及输出量及输出量及输出量Z Z Z Z。
在字在字长为长为长为长为32323232位的计算机上运行若位的计算机上运行若位的计算机上运行若位的计算机上运行若X X X X、、、、Y Y Y Y取整数,若进行取整数,若进行取整数,若进行取整数,若进行穷举测试:穷举测试:穷举测试:穷举测试: 可能采用的测试数据组:可能采用的测试数据组:可能采用的测试数据组:可能采用的测试数据组:2 2 2 232323232×2×2×2×232323232====2 2 2 264646464 如果测试一组数据需要如果测试一组数据需要如果测试一组数据需要如果测试一组数据需要1 1 1 1毫秒,一年工作毫秒,一年工作毫秒,一年工作毫秒,一年工作365×24365×24365×24365×24小时,完成所有测试需要小时,完成所有测试需要小时,完成所有测试需要小时,完成所有测试需要5 5 5 5亿年 给出一个小程序的流程图,它包括了给出一个小程序的流程图,它包括了一个执行一个执行2020次的循环次的循环 包含的不同执行路径数达包含的不同执行路径数达5 52020条,对每条,对每一条路径进行测试需要一条路径进行测试需要1 1毫秒,假定一年工毫秒,假定一年工作作365×24365×24小时,要想把所有路径测试完,小时,要想把所有路径测试完,需需31703170年。
年所以,无法对程序进行完全的测试所以,无法对程序进行完全的测试n分类分类q按照是否需要执行被测软件的角度按照是否需要执行被测软件的角度n静态测试和动态测试静态测试和动态测试q按照测试是否针对软件内部结构和具体算法按照测试是否针对软件内部结构和具体算法n白盒测试和黑盒测试白盒测试和黑盒测试软件测试方法软件测试方法q按照开发阶段按照开发阶段n单元测试单元测试n集成测试集成测试n确认测试确认测试n系统测试系统测试n验收测试验收测试q按照测试实施组织计划按照测试实施组织计划n开发方测试开发方测试n用户测试(用户测试(β测试)测试)n第三方测试第三方测试n静态测试与动态测试静态测试与动态测试q静态测试静态测试n定义定义q不运行被测程序不运行被测程序q通过其他手段达到检测目的通过其他手段达到检测目的q对被测程序进行特性分析方法的总称对被测程序进行特性分析方法的总称q静态的检查程序代码、界面或文档中可能存在的错误静态的检查程序代码、界面或文档中可能存在的错误的过程的过程n测试活动测试活动q需求评审需求评审q设计评审设计评审q代码检查代码检查n1、代码检查、代码检查 代码检查包括代码会审和走查。
主要检查代代码检查包括代码会审和走查主要检查代码和设计的一致性,代码对标准的遵循、可读性,码和设计的一致性,代码对标准的遵循、可读性,代码逻辑表达的正确性,代码结构的合理性等方代码逻辑表达的正确性,代码结构的合理性等方面 在实际使用中,代码检查比动态测试更为有在实际使用中,代码检查比动态测试更为有效,可以发现效,可以发现30%~70%的逻辑设计和编码缺陷%的逻辑设计和编码缺陷n代码会审是由一组人通过阅读、讨论和争代码会审是由一组人通过阅读、讨论和争议对程序进行静态分析的过程议对程序进行静态分析的过程n代码审查小组成员:代码审查小组成员:Ø组长组长——能力较强的程序员能力较强的程序员Ø待审程序的设计者或程序员待审程序的设计者或程序员Ø测试专家测试专家n代码审查时应注意问题:代码审查时应注意问题:Ø提出的建议应针对程序本身,而不应针对程提出的建议应针对程序本身,而不应针对程序员Ø程序员对整个审查过程采取积极和建设性的程序员对整个审查过程采取积极和建设性的态度n走查走查 走查是以小组为单元进行代码阅读的,同样走查是以小组为单元进行代码阅读的,同样也是一系列规程和错误检查技术的集合也是一系列规程和错误检查技术的集合。
n人员组成人员组成Ø一位经验丰富的程序员一位经验丰富的程序员Ø一位程序设计语言专家一位程序设计语言专家Ø一位程序员新手一位程序员新手Ø一位其他不同项目的人员一位其他不同项目的人员Ø一位该软件编程小组的成员一位该软件编程小组的成员n必须修改的问题(必须修改的问题(3))q程序没有注释程序没有注释n程序程序=代码代码+注释注释n注释语句注释语句/总代码行数总代码行数=1/5~1/4q子函数子函数max没有返回值类型没有返回值类型q精度丢失问题精度丢失问题n建议修改的问题(建议修改的问题(3))qmain函数没有返回值类型和参函数没有返回值类型和参数表数表(默认为(默认为void main ((void))))q1行代码只定义行代码只定义1个变量q程序适当加一些空行程序适当加一些空行q程序中存在未使用的变量程序中存在未使用的变量#include
但是代码的逻辑设计和编码错误但是代码中仍会有隐藏的故障无法通过静态测试发中仍会有隐藏的故障无法通过静态测试发现,因此除了静态测试方法外,还必须通现,因此除了静态测试方法外,还必须通过动态测试进行详细地分析过动态测试进行详细地分析q动态测试动态测试n定义定义q运行被测程序运行被测程序q输入测试用例输入测试用例q对运行情况(输入与输出对应关系)分析对运行情况(输入与输出对应关系)分析n测试活动测试活动q单元测试单元测试q集成测试集成测试q系统测试系统测试q用户验收测试用户验收测试上例中,动态测试过程为:上例中,动态测试过程为:测试阶段执行人静态校验动态校验可行性评审可行性评审开发人员,用户开发人员,用户√需求评审需求评审开发人员,用户开发人员,用户√设计评审设计评审开发人员开发人员√单元测试单元测试开发人员开发人员√集成测试集成测试开发人员,用户开发人员,用户√系统测试系统测试开发人员在用户开发人员在用户的协助下完成的协助下完成√验收测试验收测试用户用户√q静态测试和动态测试主要执行阶段静态测试和动态测试主要执行阶段n黑盒测试与白盒测试黑盒测试与白盒测试X=2y=4黑盒黑盒白盒白盒X=2y=4n检查程序各功能是否能实现检查程序各功能是否能实现n检查功能错误检查功能错误n又称为又称为功能测试、数据驱动测试或基于规格说明的功能测试、数据驱动测试或基于规格说明的测试测试q黑盒测试黑盒测试需求说明需求说明需求说明需求说明被测程序被测程序被测程序被测程序测试结果测试结果测试结果测试结果产生产生产生产生测试用例测试用例测试用例测试用例输出输出输出输出黑盒测试示意图黑盒测试示意图黑盒测试示意图黑盒测试示意图q黑盒测试活动黑盒测试活动n功能测试功能测试n性能测试性能测试n攻击测试攻击测试q特点特点n黑盒测试与软件的具体实现过程无关黑盒测试与软件的具体实现过程无关n黑盒测试用例的设计可以和软件实现同时进行黑盒测试用例的设计可以和软件实现同时进行n能够找到大多数测试方法无法发现的错误,对于能够找到大多数测试方法无法发现的错误,对于无法得到源代码的软件可以完成一定的测试无法得到源代码的软件可以完成一定的测试n检查内部操作是否按规定执行检查内部操作是否按规定执行n各功能是否得到充分使用各功能是否得到充分使用n又称为结构测试、又称为结构测试、逻辑驱动测试或基于程序逻辑驱动测试或基于程序本身的测试本身的测试q白盒测试白盒测试应用程序源程序源程序源程序源程序测试用例测试用例测试用例测试用例被测程序被测程序被测程序被测程序执行路径执行路径执行路径执行路径覆盖情况分析覆盖情况分析覆盖情况分析覆盖情况分析分析分析分析分析白盒测试过程示意图白盒测试过程示意图白盒测试过程示意图白盒测试过程示意图q白盒测试活动白盒测试活动n语句覆盖语句覆盖n分支覆盖分支覆盖q判断覆盖判断覆盖q条件覆盖条件覆盖q判断判断/条件覆盖条件覆盖n路径覆盖路径覆盖n两种测试方法从不同的角度出发两种测试方法从不同的角度出发n反映了软件的不同侧面反映了软件的不同侧面n适用于不同的开发环境适用于不同的开发环境q黑盒测试与白盒测试比较黑盒测试与白盒测试比较项目黑盒测试白盒测试规划规划功能测试功能测试结构测试结构测试优点优点从用户角度出发测试从用户角度出发测试对程序内部特定部位进行覆对程序内部特定部位进行覆盖测试盖测试缺点缺点无法测试程序内部特定部位无法测试程序内部特定部位若规格说明有误,无法发现若规格说明有误,无法发现问题问题无法检查程序的外部特征无法检查程序的外部特征无法对未实现规格说明的程无法对未实现规格说明的程序内部欠缺部分进行测试序内部欠缺部分进行测试应用范围应用范围边界分析法边界分析法等价类划分法等价类划分法决策表测试决策表测试语句覆盖语句覆盖分支覆盖分支覆盖路径覆盖路径覆盖循环覆盖循环覆盖模块结构测试模块结构测试n黑盒、白盒、动态、静态测试之间关系黑盒、白盒、动态、静态测试之间关系q只是从测试的不同角度分类只是从测试的不同角度分类q同一个测试,都有可能属于这几种测试,他们之间同一个测试,都有可能属于这几种测试,他们之间还有包含交叉的关系还有包含交叉的关系 q黑盒测试有可能是动态测试(运行程序,只看输入黑盒测试有可能是动态测试(运行程序,只看输入和输出),也可能是静态测试(不运行程序,只看和输出),也可能是静态测试(不运行程序,只看界面)界面)q白盒测试有可能是动态测试(运行程序,分析代码白盒测试有可能是动态测试(运行程序,分析代码结构),也可能是静态测试(不运行程序,只是静结构),也可能是静态测试(不运行程序,只是静态查看代码)态查看代码)q动态测试有可能是黑盒测试(运行程序,只动态测试有可能是黑盒测试(运行程序,只看输入和输出),也可能是白盒测试(运行看输入和输出),也可能是白盒测试(运行程序,分析代码结构)程序,分析代码结构)q静态测试有可能是黑盒测试(不运行程序,静态测试有可能是黑盒测试(不运行程序,只是查看界面),也可能是白盒测试(不运只是查看界面),也可能是白盒测试(不运行程序,只是静态查看代码)行程序,只是静态查看代码)n总体关系图总体关系图测试总体关系图测试总体关系图问题:问题:1 1 1 1、如果程序员为了确保是否能够满足功能需求而、如果程序员为了确保是否能够满足功能需求而、如果程序员为了确保是否能够满足功能需求而、如果程序员为了确保是否能够满足功能需求而测试一个类,这属于黑盒测试还是白盒测试?测试一个类,这属于黑盒测试还是白盒测试?测试一个类,这属于黑盒测试还是白盒测试?测试一个类,这属于黑盒测试还是白盒测试?2 2 2 2、如果非开发人员使用能够跟踪代码的测试工具、如果非开发人员使用能够跟踪代码的测试工具、如果非开发人员使用能够跟踪代码的测试工具、如果非开发人员使用能够跟踪代码的测试工具来产生测试,以确保大部分代码都被执行到。
只来产生测试,以确保大部分代码都被执行到只来产生测试,以确保大部分代码都被执行到只来产生测试,以确保大部分代码都被执行到只要软件没有被挂起或崩溃就认为测试通过了,这要软件没有被挂起或崩溃就认为测试通过了,这要软件没有被挂起或崩溃就认为测试通过了,这要软件没有被挂起或崩溃就认为测试通过了,这属于黑盒测试还是白盒测试?属于黑盒测试还是白盒测试?属于黑盒测试还是白盒测试?属于黑盒测试还是白盒测试?3 3 3 3、灰盒测试属于黑盒测试还是白盒测试?、灰盒测试属于黑盒测试还是白盒测试?、灰盒测试属于黑盒测试还是白盒测试?、灰盒测试属于黑盒测试还是白盒测试?黑盒测试黑盒测试n黑盒测试方法黑盒测试方法q等价类划分等价类划分q边界值分析边界值分析q因果图因果图q错误推测错误推测q功能图法功能图法等等主要用于软件确认测试主要用于软件确认测试经典问题经典问题:三角形问题与三角形问题与NextDate函数函数n n三角形问题三角形问题输入整数输入整数a、、b、、c,分别作为三角形的三条,分别作为三角形的三条边边通过程序判断由三条边构成的三角形的类型通过程序判断由三条边构成的三角形的类型为:等边三角形、等腰三角形、一般三角形,为:等边三角形、等腰三角形、一般三角形,以及构不成三角形以及构不成三角形必须满足的条件???必须满足的条件???输出情况是什么???输出情况是什么??? 结论:三角形问题的复杂之处在于输结论:三角形问题的复杂之处在于输入与输出之间的关系比较复杂。
入与输出之间的关系比较复杂 n nNextDate函数函数是有三个变量是有三个变量month、、day和和year的函数的函数输出为输入日期后一天的日期输出为输入日期后一天的日期例如:输入为例如:输入为1986年年6月月9日,则该函数的输日,则该函数的输出应为出应为1986年年6月月10日必须满足的条件???必须满足的条件???输出情况是什么???输出情况是什么??? 结论:在结论:在NextDateNextDate函数中有两种函数中有两种复杂性的输入来源,一是输入域的复复杂性的输入来源,一是输入域的复杂性,二是确定闰年的规则并要增加杂性,二是确定闰年的规则并要增加““额外天额外天”” 等价类划分法等价类划分法n n等价类划分法作为一种最为典型的黑盒测等价类划分法作为一种最为典型的黑盒测试方法,完全不考虑程序的内部结构,只试方法,完全不考虑程序的内部结构,只根据程序要求和说明来进行测试用例的设根据程序要求和说明来进行测试用例的设计n n是黑盒程序测试员必须掌握的一种测试方是黑盒程序测试员必须掌握的一种测试方法法 等价类划分法是把程序的等价类划分法是把程序的输入域输入域划分为划分为若干部分,然后从每个部分中若干部分,然后从每个部分中选取少数代表选取少数代表性数据性数据当作测试用例,这些数据将能代表这当作测试用例,这些数据将能代表这一部分的全部数据。
一部分的全部数据 采用等价类划分方法进行测试用例的设采用等价类划分方法进行测试用例的设计时,必须首先在分析需求规格说明的基础计时,必须首先在分析需求规格说明的基础上划分等价类,列出等价表,从而确定出测上划分等价类,列出等价表,从而确定出测试用例试用例1 1、等价类的划分、等价类的划分定义:定义: 在进行等价类划分之前,需要先从程序在进行等价类划分之前,需要先从程序的功能说明书中找出各个输入条件,然后为的功能说明书中找出各个输入条件,然后为每个输入条件划分两个或多个等价类,形成每个输入条件划分两个或多个等价类,形成若干个互不相交的子集,称之为等价类若干个互不相交的子集,称之为等价类n n等价类对于测试有两个重要的意义等价类对于测试有两个重要的意义完备性--整个输入域提供完备性完备性--整个输入域提供完备性无冗余性--若互不相交则可保证无冗余性无冗余性--若互不相交则可保证无冗余性n n传统的等价类划分测试的实现分为两步进行传统的等价类划分测试的实现分为两步进行一是确定等价类一是确定等价类二是确定测试用例二是确定测试用例划分等价类可分为两种情况:划分等价类可分为两种情况:((1 1)有效等价类)有效等价类 —— ——是指对软件规格说明而言,是是指对软件规格说明而言,是有意义的、合理的输入数据所组成的集合。
有意义的、合理的输入数据所组成的集合利用有效等价类,能够检验程序是否实现了利用有效等价类,能够检验程序是否实现了规格说明中预先规定的功能和性能规格说明中预先规定的功能和性能((2 2)无效等价类)无效等价类 —— ——是指对软件规格说明而言,是指对软件规格说明而言,是无意义的、不合理的输入数据所构成的集是无意义的、不合理的输入数据所构成的集合利用无效等价类,可以鉴别程序异常处合利用无效等价类,可以鉴别程序异常处理的情况,检查被测对象的功能和性能的实理的情况,检查被测对象的功能和性能的实现是否有不符合规格说明要求的地方现是否有不符合规格说明要求的地方 划分等价类等价类的原则划分等价类等价类的原则: :(1) (1) 如果输入条件规定了取值范围,或值如果输入条件规定了取值范围,或值的个数,则可以确立一个有效等价类和两的个数,则可以确立一个有效等价类和两个无效等价类个无效等价类 例如,在程序的规格说明中,对输入例如,在程序的规格说明中,对输入条件有一句话:条件有一句话:“…… “…… 项数可以从项数可以从1 1到到999 999 ……”……” 则有效等价类是则有效等价类是““1≤1≤项数项数≤999≤999””两个无效等价类是两个无效等价类是““项数<项数<1 1””或或““项项数>数>999999””。
在数轴上表示成在数轴上表示成: :(2) (2) 如果输入条件规定了输入值的集合,或如果输入条件规定了输入值的集合,或者是规定了者是规定了““必须如何必须如何””的条件,这时可确的条件,这时可确立一个有效等价类和一个无效等价类立一个有效等价类和一个无效等价类 例如,在例如,在C C语言中对变量标识符规定为语言中对变量标识符规定为““以字母或下划线打头的以字母或下划线打头的…………串串””那么所有以字母或下划线打头的构成有效等价类,有以字母或下划线打头的构成有效等价类,而不在此集合内(不以字母打头)的归于无而不在此集合内(不以字母打头)的归于无效等价类效等价类3) (3) 如果输入条件是一个布尔量,则可以确如果输入条件是一个布尔量,则可以确定一个有效等价类和一个无效等价类定一个有效等价类和一个无效等价类(4)(4)如果规定了输入数据的一组值,而且程如果规定了输入数据的一组值,而且程序要对每个输入值分别进行处理序要对每个输入值分别进行处理 这时可为每一个输入值确立一个有效等这时可为每一个输入值确立一个有效等价类,并针对这组值确立一个无效等价类,价类,并针对这组值确立一个无效等价类,它是所有不允许的输入值的集合。
它是所有不允许的输入值的集合 例如,在教师上岗方案中规定对教授、例如,在教师上岗方案中规定对教授、副教授、讲师和助教分别计算分数,做相应副教授、讲师和助教分别计算分数,做相应的处理因此可以确定的处理因此可以确定4 4个有效等价类为教个有效等价类为教授、副教授、讲师和助教,一个无效等价类,授、副教授、讲师和助教,一个无效等价类,它是所有不符合以上身分的人员的输入值的它是所有不符合以上身分的人员的输入值的集合(5) (5) 如果规定了输入数据必须遵守的规则,如果规定了输入数据必须遵守的规则,则可以确立一个有效等价类(符合规则)则可以确立一个有效等价类(符合规则)和若干个无效等价类(从不同角度违反规和若干个无效等价类(从不同角度违反规则) 例如,例如,C语言规定语言规定 “一个语句必须以分一个语句必须以分号号‘;;’结束结束”这时,可以确定一个有效等这时,可以确定一个有效等价类价类 “以以‘;;’结束结束”,若干个无效等价类,若干个无效等价类 “以以‘::’结束结束”、、“以以‘,,’结束结束”、、“以以‘ ’结束结束”等((6)) 如果规定了输入数据为整型,则可如果规定了输入数据为整型,则可以划分出正整数、零和负整数等三个有以划分出正整数、零和负整数等三个有效类。
效类7)) 如果程序的处理对象是表格,则应如果程序的处理对象是表格,则应该使用空表,以及含一项或多项的表该使用空表,以及含一项或多项的表n在在确确立立了了等等价价类类之之后后,,建建立立等等价价类类表表,,列列出所有划分出的等价类,如下表所示:出所有划分出的等价类,如下表所示:2 2、设计测试用例、设计测试用例 在设计测试用例时,应同时考虑有效等在设计测试用例时,应同时考虑有效等价类和无效等价类测试用例的设计价类和无效等价类测试用例的设计 根据已列出的等价类表可确定测试用例,根据已列出的等价类表可确定测试用例,具体过程如下:具体过程如下: ((1 1)首先为等价类表中的每一个等价类)首先为等价类表中的每一个等价类分别规定一个唯一的编号分别规定一个唯一的编号 ((2 2)设计一个新的测试用例,使它能够)设计一个新的测试用例,使它能够尽量覆盖尚未覆盖的有效等价类重复这个尽量覆盖尚未覆盖的有效等价类重复这个步骤,直到所有的有效等价类均被测试用例步骤,直到所有的有效等价类均被测试用例所覆盖 ((3 3)设计一个新的测试用例,使它仅覆)设计一个新的测试用例,使它仅覆盖一个尚未覆盖的无效等价类。
重复这一步盖一个尚未覆盖的无效等价类重复这一步骤,直到所有的无效等价类均被测试用例所骤,直到所有的无效等价类均被测试用例所覆盖3、常见等价类划分测试形式、常见等价类划分测试形式n n针对是否对无效数据进行测试,可以将等针对是否对无效数据进行测试,可以将等价类测试分为价类测试分为标准等价类测试标准等价类测试健壮等价类测试健壮等价类测试n n标准等价类测试:标准等价类测试:不考虑无效数据值不考虑无效数据值测试用例使用每个等价类中的一个值测试用例使用每个等价类中的一个值n n健壮等价类测试:健壮等价类测试:主要的出发点是考虑了无效等价类主要的出发点是考虑了无效等价类对有效输入,测试用例从每个有效等价类中对有效输入,测试用例从每个有效等价类中取一个值取一个值对无效输入,一个测试用例有一个无效值,对无效输入,一个测试用例有一个无效值,其他值均取有效值其他值均取有效值健壮等价类测试存在两个问题:健壮等价类测试存在两个问题:n n需要花费精力定义无效测试用例的期需要花费精力定义无效测试用例的期望输出望输出n n对强类型的语言没有必要考虑无效的对强类型的语言没有必要考虑无效的输入输入 例如:例如:现定义,输入变量现定义,输入变量x1和和x2在下列范围内取值:在下列范围内取值:a≤x1 ≤d,区间,区间[a,b],(b,c),[c,d]e≤x2 ≤g,区间,区间[e,f],[f,g] 变量变量x1,,x2的无效等价类分别为:的无效等价类分别为:x1d和和x2
图图3--1 标准等价类测试用例标准等价类测试用例图图3--2 健壮等价类测试用例健壮等价类测试用例4、等价类划分测试的实例、等价类划分测试的实例n n实例实例1 三角形问题三角形问题 分析:在多数情况下,是从输入域划分分析:在多数情况下,是从输入域划分等价类的,但并非不能从被测程序的输出等价类的,但并非不能从被测程序的输出域反过来定义等价类,事实上,这对于三域反过来定义等价类,事实上,这对于三角形问题却是最简单的划分方法角形问题却是最简单的划分方法 在三角在三角形问题中,有四种可能的输出:等边三角形问题中,有四种可能的输出:等边三角形、等腰三角形、一般三角形和非三角形形、等腰三角形、一般三角形和非三角形利用这些信息能够确定下列输出(值域)利用这些信息能够确定下列输出(值域)等价类R1 = { : 边为边为a,b,c的等边三角形的等边三角形}R2 = { : 边为边为a,b,c的等腰三角形的等腰三角形}R3 = { : 边为边为a,b,c的一般三角形的一般三角形}R4 = { : 边为边为a,b,c不能组成三角形不能组成三角形 } 输入条件输入条件有效等价类有效等价类无效等价类无效等价类年年1900≤1900≤年年≤3000≤3000((1 1))年年<1900<1900((4 4))年年>3000>3000((5 5))月月1≤1≤月月≤12≤12((2 2))月月<1<1((6 6))月月>12>12((7 7))日日 1≤1≤日日≤31≤31((3 3))日日<1<1((8 8))日日>31>31((9 9))NextDate问题等价类表:问题等价类表:实例实例2 2:: 在某一在某一PascalPascal语言版本中规定:语言版本中规定:““标识标识符是由字母开头,后跟字母或数字的任意组符是由字母开头,后跟字母或数字的任意组合构成。
有效字符数为合构成有效字符数为8 8个,最大字符数为个,最大字符数为8080个并且规定:,并且规定:““标识符必须先说明,标识符必须先说明,再使用在同一说明语句中,标识符至少必再使用在同一说明语句中,标识符至少必须有一个须有一个用等价类划分的方法,建立输入等价类表用等价类划分的方法,建立输入等价类表 下面选取了下面选取了9 9个测试用例,它们覆盖了所个测试用例,它们覆盖了所有的等价类:有的等价类:①VAR x①VAR x,,T1234567T1234567::REALREAL;; BEGIN x:=3.414; BEGIN x:=3.414; T1234567:=2.732; T1234567:=2.732; … … … … … … … … (1),(2),(4),(8),(9),(12),(14) (1),(2),(4),(8),(9),(12),(14)②VAR ②VAR ::REALREAL;; (3) (3)③VAR x③VAR x,, ::REALREAL;; (5) (5)④ VAR T12345678: REAL; (6)④ VAR T12345678: REAL; (6)⑤ VAR T12345…… : REAL; (7)⑤ VAR T12345…… : REAL; (7)多于多于8080个字符个字符⑥ VAR T$⑥ VAR T$::CHARCHAR;; (10) (10)⑦ VAR GOTO: INTEGER;(11)⑦ VAR GOTO: INTEGER;(11)⑧ VAR 2T: REAL; (13)⑧ VAR 2T: REAL; (13)⑨ VAR PAR: REAL;(15)⑨ VAR PAR: REAL;(15) BEGIN …… BEGIN …… PAR:=SIN(3.14*0.8)/6; PAR:=SIN(3.14*0.8)/6;练习:用等价类划分方法找出有效等价类和练习:用等价类划分方法找出有效等价类和无效等价类,并作出测试用例。
无效等价类,并作出测试用例 某城市号码由三部分组成,内容如某城市号码由三部分组成,内容如下:第一部分是地区码,地区码可以是空白下:第一部分是地区码,地区码可以是空白或三位数字;第二部分是前缀为非零和非一或三位数字;第二部分是前缀为非零和非一开头的三位数;第三部分是后缀为四位数开头的三位数;第三部分是后缀为四位数输入条件输入条件输入条件输入条件 有效等价类有效等价类有效等价类有效等价类无效等价类无效等价类无效等价类无效等价类地区码地区码地区码地区码空白(空白(空白(空白(1 1))))三位数字(三位数字(三位数字(三位数字(2 2))))一位数字(一位数字(一位数字(一位数字(5 5))))二位数字(二位数字(二位数字(二位数字(6 6))))多于三位数字多于三位数字多于三位数字多于三位数字(7)(7)非数字(非数字(非数字(非数字(8 8))))第二部分第二部分第二部分第二部分 非零开头的三位数和非零开头的三位数和非零开头的三位数和非零开头的三位数和非非非非1 1开头的三位数开头的三位数开头的三位数开头的三位数(3)(3)以零开头的三位数以零开头的三位数以零开头的三位数以零开头的三位数(9)(9)以以以以1 1开头的三位数开头的三位数开头的三位数开头的三位数(10)(10)非三位数(非三位数(非三位数(非三位数(1111))))非数字(非数字(非数字(非数字(1212))))第三部分第三部分第三部分第三部分 后缀为四位数(后缀为四位数(后缀为四位数(后缀为四位数(4 4))))非四位数字(非四位数字(非四位数字(非四位数字(1313))))非数字(非数字(非数字(非数字(1414))))边界值分析法边界值分析法 ((BVA Boundary Value Analysis))n n边界值分析法边界值分析法“错误隐含在角落错误隐含在角落”((errors hide in the corner))白盒测试中也应用到了边界值的测试思想,白盒测试中也应用到了边界值的测试思想,它不是黑盒测试的专利它不是黑盒测试的专利边界值分析法就是对输入或输出的边界值进边界值分析法就是对输入或输出的边界值进行测试的一种黑盒测试方法行测试的一种黑盒测试方法通常边界值分析法是作为对等价类划分法的通常边界值分析法是作为对等价类划分法的补充,这种情况下,其测试用例来自等价类补充,这种情况下,其测试用例来自等价类的边界的边界为什么使用边界值分析法?为什么使用边界值分析法? 无数的测试实践表明,大量的故障往往无数的测试实践表明,大量的故障往往发生在输入定义域或输出值域的边界上,而发生在输入定义域或输出值域的边界上,而不是在其内部。
因此,针对各种边界情况设不是在其内部因此,针对各种边界情况设计测试用例,通常会取得很好的测试效果计测试用例,通常会取得很好的测试效果 比如,在做三角形计算时,要输入三比如,在做三角形计算时,要输入三角形的三个边长:角形的三个边长: A、、B和和C我们应注我们应注意到这三个数值应当满足意到这三个数值应当满足A>0、、B>0、、C>0、、A+B>C、、A+C>B、、B+C>A,才能,才能构成三角形但如果把六个不等式中的任构成三角形但如果把六个不等式中的任何一个大于号何一个大于号“>”错写成大于等于号错写成大于等于号“≥”,,那就不能构成三角形那就不能构成三角形怎样用边界值分析法设计测试用例?怎样用边界值分析法设计测试用例?((1)首先确定边界情况通常输入或输)首先确定边界情况通常输入或输出等价类的边界就是应该着重测试的边界出等价类的边界就是应该着重测试的边界情况2)选取正好等于、刚刚大于或刚刚小)选取正好等于、刚刚大于或刚刚小于边界的值作为测试数据,而不是选取等于边界的值作为测试数据,而不是选取等价类中的典型值或任意值价类中的典型值或任意值 举例举例 —— 常见的边界值常见的边界值Ø对对16-bit 的整数而言的整数而言 32767 和和 -32768 是边界是边界Ø屏幕上光标在最左上、最右下位置屏幕上光标在最左上、最右下位置Ø报表的第一行和最后一行报表的第一行和最后一行Ø数组元素的第一个和最后一个数组元素的第一个和最后一个Ø循环的第循环的第 0 次、第次、第 1 次和倒数第次和倒数第 2 次、次、最后一次最后一次 边界值分析假定错误更多地存在于边界值分析假定错误更多地存在于划分的边界上,因此在等价类的边界上划分的边界上,因此在等价类的边界上以及两侧的情况设计测试用例。
以及两侧的情况设计测试用例 例:测试计算平方根的函数例:测试计算平方根的函数 —— ——输入:实数输入:实数输入:实数输入:实数 —— ——输出:实数输出:实数输出:实数输出:实数 —— ——规格说明:规格说明:规格说明:规格说明: 当输入一个当输入一个当输入一个当输入一个0 0或比或比或比或比0 0大的数的时候,返回其大的数的时候,返回其大的数的时候,返回其大的数的时候,返回其正平方根;正平方根;正平方根;正平方根; 当输入一个小于当输入一个小于当输入一个小于当输入一个小于0 0的数时,显示错误信息的数时,显示错误信息的数时,显示错误信息的数时,显示错误信息“ “平方根非法平方根非法平方根非法平方根非法- -输入值小于输入值小于输入值小于输入值小于0”0”并返回并返回并返回并返回0 0;;;; 库函数库函数库函数库函数Print-LinePrint-Line可以用来输出错误信息可以用来输出错误信息。
可以用来输出错误信息可以用来输出错误信息 等价类划分:等价类划分:可以考虑作出如下划分:可以考虑作出如下划分:输入输入 (i)<0 和和 (ii)>=0输出输出 (a)>=0 和和 (b) Error 测试用例有两个:测试用例有两个:输入输入4,输出,输出2对应于(ii)和和(a)输入输入-10,输出错误提示对应于,输出错误提示对应于(i)和和(b) 边界值分析:边界值分析:划分划分(ii)的边界为的边界为0和最大正实数;和最大正实数;划分划分(i)的边界为最小负实数和的边界为最小负实数和0由此得到以下测试用例:由此得到以下测试用例:ü 输入输入输入输入 { {最小负实数最小负实数最小负实数最小负实数} }ü 输入输入输入输入 { {绝对值很小的负数绝对值很小的负数绝对值很小的负数绝对值很小的负数} }ü 输入输入输入输入 0 0ü 输入输入输入输入 { {绝对值很小的正数绝对值很小的正数绝对值很小的正数绝对值很小的正数} }ü 输入输入输入输入 { {最大正实数最大正实数最大正实数最大正实数} } 通常情况下,软件测试所包含的边通常情况下,软件测试所包含的边界检验有几种类型:界检验有几种类型: 数字、字符、位置、质量、大小、数字、字符、位置、质量、大小、速度、方位、尺寸、空间等速度、方位、尺寸、空间等 相应地,以上类型的边界值应该在:相应地,以上类型的边界值应该在: 最大最大/最小、首位最小、首位/末位、上末位、上/下、最下、最快快/最慢、最高最慢、最高/最低、最短最低、最短/最长、空最长、空/满满等情况下。
等情况下 在多数情况下,边界值条件是基于应用在多数情况下,边界值条件是基于应用程序的功能设计而需要考虑的因素,可以从程序的功能设计而需要考虑的因素,可以从软件的规格说明或常识中得到,也是最终用软件的规格说明或常识中得到,也是最终用户可以很容易发现问题的户可以很容易发现问题的 然而,在测试用例设计过程中,某些边界然而,在测试用例设计过程中,某些边界值条件是不需要呈现给用户的,或者说用户值条件是不需要呈现给用户的,或者说用户是很难注意到的,但同时确实属于检验范畴是很难注意到的,但同时确实属于检验范畴内的边界条件,称为内部边界值条件或子边内的边界条件,称为内部边界值条件或子边界值条件界值条件 内部边界值条件主要有下面几种:内部边界值条件主要有下面几种:Ø数值的边界值检验数值的边界值检验Ø字符的边界值检验字符的边界值检验Ø其它边界值检验其它边界值检验 计算机是基于二进制进行工作的,因计算机是基于二进制进行工作的,因此,软件的任何数值运算都有一定的范围此,软件的任何数值运算都有一定的范围限制 用边界值分析设计测试用例应遵循的原则:用边界值分析设计测试用例应遵循的原则:1、如果输入条件规定了取值范围,则应对、如果输入条件规定了取值范围,则应对该范围的边界内附近,恰好在边界和在边界该范围的边界内附近,恰好在边界和在边界外附近(无效等价类中)设计测试用例。
外附近(无效等价类中)设计测试用例 如:规定如:规定1~~5千克邮件收费千克邮件收费2元,应对元,应对0.9,,1,,1.1,,4.9,,5,,5.1千克设计测试用千克设计测试用例2、如果输入条件规定了数据的个数,则应、如果输入条件规定了数据的个数,则应对最少个数,最多个数,比最少个数少对最少个数,最多个数,比最少个数少1,,比最大个数多比最大个数多1等情况设计测试用例等情况设计测试用例 如:输入文件有如:输入文件有1~~255个记录,则应分个记录,则应分别设计别设计0,,1,,255,,256个记录的输入文件个记录的输入文件的测试用例的测试用例3、针对规格说明中的每个输出条件使用前、针对规格说明中的每个输出条件使用前面的面的1和和2原则 如:计算折扣量,最低折扣为如:计算折扣量,最低折扣为0元,最元,最高为高为1000元,则要设计使它们恰好产生元,则要设计使它们恰好产生0元或元或1000元的结果以及负值或稍大于元的结果以及负值或稍大于1000元的结果(如果可能的话)元的结果(如果可能的话)4、如果程序规格说明中提到的输入或、如果程序规格说明中提到的输入或输出域是个有序的集合(如顺序文件,输出域是个有序的集合(如顺序文件,线性表等)。
应选有序集的第一个和线性表等)应选有序集的第一个和最后一个元素作为测试用例最后一个元素作为测试用例等价类和边界值方法的区别:等价类和边界值方法的区别:((1 1)边界值不是从等价类中随便取一个数)边界值不是从等价类中随便取一个数据作为代表,而是选一个或几个特定值,据作为代表,而是选一个或几个特定值,使这个等价类的每个边界都作为测试的目使这个等价类的每个边界都作为测试的目标2 2)边界值分析不仅要考虑输入条件,而)边界值分析不仅要考虑输入条件,而且要考虑输出条件(输出等价类)且要考虑输出条件(输出等价类) 一般联合使用等价类划分和边界值分一般联合使用等价类划分和边界值分析两种方法析两种方法2、边界值分析测试、边界值分析测试 采用边界值分析测试的基本思想是:故采用边界值分析测试的基本思想是:故障往往出现在输入变量的边界值附近障往往出现在输入变量的边界值附近 ——因此,边界值分析法利用输入变量因此,边界值分析法利用输入变量的最小值的最小值(min)、略大于最小值、略大于最小值(min+)、输、输入值域内的任意值入值域内的任意值(nom)、略小于最大值、略小于最大值(max-)和最大值和最大值(max)来设计测试用例。
来设计测试用例 边界值分析法是基于可靠性理论中称边界值分析法是基于可靠性理论中称为为“单故障单故障”的假设,即有两个或两个以上的假设,即有两个或两个以上故障同时出现而导致软件失效的情况很少,故障同时出现而导致软件失效的情况很少,也就是说,软件失效基本上是由单故障引也就是说,软件失效基本上是由单故障引起的 因此,在边界值分析法中获取测试用例的因此,在边界值分析法中获取测试用例的方法是:方法是: (1) 每次保留程序中一个变量,让其余的变每次保留程序中一个变量,让其余的变量取正常值,被保留的变量依次取量取正常值,被保留的变量依次取min、、min+、、nom、、max-和和max (2) 对程序中的每个变量重复对程序中的每个变量重复 (1) 例例1 1:有两个输入变量:有两个输入变量x1(a≤x1≤b)x1(a≤x1≤b)和和x2(c≤x2≤d)x2(c≤x2≤d)的程序的程序F F的边界值分析的边界值分析测试用例如下:测试用例如下:测试用例如下:测试用例如下: {
则采用边界值分析法设计的测试用例是:则采用边界值分析法设计的测试用例是: { <1,15>, <2,15>, <11,15>, <12,15>, <6,15>, <6,1>, <6,2>, <6,30>, <6,31> } 推论:对于一个含有推论:对于一个含有n个变量的程序,采个变量的程序,采用边界值分析法测试程序会产生用边界值分析法测试程序会产生4n+1个测个测试用例 练习:有函数练习:有函数f(x,y,z),其中,其中x∈ ∈[1900,2100],,y∈ ∈[1,12],,z∈ ∈[1,31]的 请写出该函数采用边界值分析法设计的测请写出该函数采用边界值分析法设计的测试用例 答案:答案:{<2000,6,1>, <2000,6,2>, <2000,6,30>, <2000,6,31>;<2000,1,15>, <2000,2,15>, <2000,11,15>, <2000,12,15>, <1900,6,15>, <1901,6,15>, <2099,6,15>, <2100,6,15>, <2000,6,15> } 3、健壮性测试、健壮性测试 健壮性测试是作为边界值分析的一个健壮性测试是作为边界值分析的一个简单的扩充,它除了对变量的简单的扩充,它除了对变量的5个边界值分个边界值分析取值外,还需要增加一个略大于最大值析取值外,还需要增加一个略大于最大值(max+)以及略小于最小值以及略小于最小值(min-)的取值,的取值,检查超过极限值时系统的情况。
检查超过极限值时系统的情况 因此,对于有因此,对于有n个变量的函数采用健壮性个变量的函数采用健壮性测试需要测试需要6n+1个测试用例个测试用例 4、边界值分析举例、边界值分析举例q((1)三角形问题的边界值分析测试用例设)三角形问题的边界值分析测试用例设计计n边长时整数,下界边长时整数,下界1,上界,上界100q((2))NextDate函数的边界值分析测试用例函数的边界值分析测试用例n1≤month≤12,1 ≤ day≤31,1912 ≤year ≤2050n健壮性测试用例健壮性测试用例nATM提款功能:提款功能: 钱的面额只有钱的面额只有100元,一天最多取元,一天最多取3次,一次最多取次,一次最多取2000元,一天最多取元,一天最多取5000元因果图法因果图法1、因果法(、因果法(Cause/Effect Graphing)简介)简介n n因果图法产生的背景:因果图法产生的背景: 等价类划分法和边界值分析方法都是着等价类划分法和边界值分析方法都是着重考虑输入条件,但没有考虑输入条件的重考虑输入条件,但没有考虑输入条件的各种各种组合组合、输入条件之间的相互、输入条件之间的相互制约制约关系。
关系 这样虽然各种输入条件可能出错的情况这样虽然各种输入条件可能出错的情况已经测试到了,但多个输入条件组合起来已经测试到了,但多个输入条件组合起来可能出错的情况却被忽视了可能出错的情况却被忽视了n n如果在测试时必须考虑输入条件的各种组如果在测试时必须考虑输入条件的各种组合,则可能的组合数目将是合,则可能的组合数目将是天文数字天文数字n n因此必须考虑采用一种适合于描述多种条因此必须考虑采用一种适合于描述多种条件的组合、相应产生多个动作的形式来进件的组合、相应产生多个动作的形式来进行测试用例的设计,这就需要利用行测试用例的设计,这就需要利用因果图因果图(逻辑模型)逻辑模型) 因果图法是基于这样的一种思想:一些因果图法是基于这样的一种思想:一些程序的功能可以用判定表(或称决策表)的程序的功能可以用判定表(或称决策表)的形式来表示,并根据输入条件的组合情况规形式来表示,并根据输入条件的组合情况规定相应的操作定相应的操作 因果图法的定义:是一种利用图解法分因果图法的定义:是一种利用图解法分析输入的各种组合情况,从而设计测试用例析输入的各种组合情况,从而设计测试用例的方法,它适合于检查程序输入条件的各种的方法,它适合于检查程序输入条件的各种组合情况。
组合情况 n因果图法也是一种黑盒测试技术,但是不因果图法也是一种黑盒测试技术,但是不如等价类、边界值那样常用如等价类、边界值那样常用n“因因”——输入输入n“果果”——输出输出n因果图法比较适合输入条件较多的情况,因果图法比较适合输入条件较多的情况,测试所有的输入条件的排列组合测试所有的输入条件的排列组合使用因果图法的优点:使用因果图法的优点:((1 1)考虑到了输入情况的各种组合以及各)考虑到了输入情况的各种组合以及各个输入情况之间的相互制约关系个输入情况之间的相互制约关系2 2)能够帮助测试人员按照一定的步骤,)能够帮助测试人员按照一定的步骤,高效率的开发测试用例高效率的开发测试用例3 3)因果图法是将自然语言规格说明转化)因果图法是将自然语言规格说明转化成形式语言规格说明的一种严格的方法,可成形式语言规格说明的一种严格的方法,可以指出规格说明存在的不完整性和二义性以指出规格说明存在的不完整性和二义性 因果图的基本符号:因果图的基本符号: 通常情况下,左部的圆中写原因,右通常情况下,左部的圆中写原因,右部的圆中写结果两个圆中间以直线连接,部的圆中写结果两个圆中间以直线连接,连接线上再加符号表示因与果的不同关系。
连接线上再加符号表示因与果的不同关系c1,c2,c3c1,c2,c3表示原因;表示原因;e1e1表示结果各结点表示结果各结点表示状态,可取值表示状态,可取值“0”“0”或或“1”“1”0”“0”表表示某状态不出现,示某状态不出现,“1”“1”表示某状态出现,表示某状态出现,有以下四种逻辑关系有以下四种逻辑关系因果图的逻辑关系因果图的逻辑关系因果图的逻辑关系因果图的逻辑关系 为了表示原因与原因之间,结果与结为了表示原因与原因之间,结果与结果之间可能存在的果之间可能存在的约束约束条件,在因果图中条件,在因果图中可以附加一些表示约束条件的符号可以附加一些表示约束条件的符号 因果图法最终生成的是决策表利用因因果图法最终生成的是决策表利用因果图生成测试用例的基本步骤如下:果图生成测试用例的基本步骤如下:((1 1)分析软件规格说明中哪些是原因(即)分析软件规格说明中哪些是原因(即输入条件或输入条件的等价类),哪些是结输入条件或输入条件的等价类),哪些是结果(即输出条件),并给每个原因和结果赋果(即输出条件),并给每个原因和结果赋予一个标识符予一个标识符 ((2 2)分析软件规格说明中的语义,找出原)分析软件规格说明中的语义,找出原因与结果之间、原因与原因之间对应的关系,因与结果之间、原因与原因之间对应的关系, 根据这些关系画出因果图。
根据这些关系画出因果图 ((3 3)由于语法或环境的限制,有些原因)由于语法或环境的限制,有些原因与原因之间、原因与结果之间的组合情况与原因之间、原因与结果之间的组合情况不可能出现为表明这些特殊情况,在因不可能出现为表明这些特殊情况,在因果图上用一些记号表明约束或限制条件果图上用一些记号表明约束或限制条件4 4)把因果图转换为决策表把因果图转换为决策表5 5)根据决策表中的每一列设计测试用)根据决策表中的每一列设计测试用例 2 2、因果图法应用、因果图法应用例子:例子: 某软件规格说明要求:第一个字符必须某软件规格说明要求:第一个字符必须是是# #或或* *,第二个字符必须是一个数字,在此,第二个字符必须是一个数字,在此情况下进行文件的修改如果第一个字符不情况下进行文件的修改如果第一个字符不是是# #或或* *,则给出信息,则给出信息N N,如果第二个字符不,如果第二个字符不是数字,则给出信息是数字,则给出信息M M例题分析:例题分析:原因:原因:C1—C1—第一个字符是第一个字符是# #C2—C2—第一个字符是第一个字符是* *C3—C3—第二个字符是一个数字第二个字符是一个数字结果:结果:e1—e1—给出信息给出信息N Ne2—e2—修改文件修改文件e3—e3—给出信息给出信息M M因果图表示因果图表示因果图表示因果图表示具有具有具有具有E E约束的因果图表示约束的因果图表示约束的因果图表示约束的因果图表示根据因果图建立的决策表根据因果图建立的决策表根据因果图建立的决策表根据因果图建立的决策表练习:用因果图法设计测试用例:练习:用因果图法设计测试用例: 某规格说明规定:输入的第一列字符某规格说明规定:输入的第一列字符必须是必须是A A或或B B,第二列字符必须是一个数字。
第二列字符必须是一个数字第一、二列都满足条件时执行操作第一、二列都满足条件时执行操作H H;如;如果第一列字符不正确,则给出信息果第一列字符不正确,则给出信息L L;如;如果第二列字符不正确,则给出信息果第二列字符不正确,则给出信息R R 根据上述要求画出因果图,并设计测根据上述要求画出因果图,并设计测试用例分析:分析:原因:原因:1—1—第一列字符是第一列字符是A A2—2—第一列字符是第一列字符是B B3—3—第二列字符是一数字第二列字符是一数字结果:结果:21—21—执行操作执行操作H H22—22—给出信息给出信息L L23—23—给出信息给出信息R R案例案例n奖金计算软件奖金计算软件q该软件可以计算某公司的年终奖,该公司员该软件可以计算某公司的年终奖,该公司员工分为工分为普通员工普通员工和和管理人员管理人员;;q员工表现分为员工表现分为普通普通、、优秀优秀和和特殊贡献特殊贡献(普通、(普通、优秀员工都可以有特殊贡献,不同组合所得优秀员工都可以有特殊贡献,不同组合所得工资是不同的)工资是不同的)q根据员工的分类和表现,将奖金分为根据员工的分类和表现,将奖金分为1类奖类奖金金,,2类奖金类奖金,,......n使用该软件时,输入员工的种类和表现,使用该软件时,输入员工的种类和表现,就会输出相应的奖金类别。
就会输出相应的奖金类别n请为该软件设计测试用例请为该软件设计测试用例n提示:提示:q这道题概括比较笼统,不涉及具体细节,只这道题概括比较笼统,不涉及具体细节,只是一个总体的框架是一个总体的框架n解题思路:解题思路: (1)找到所有的输入条件(原因)和输出条找到所有的输入条件(原因)和输出条件(结果),并为其编号件(结果),并为其编号q输入条件输入条件n员工类别:普通员工员工类别:普通员工A1、管理人员、管理人员A2n员工表现:普通员工表现:普通B1、优秀、优秀B2、特殊贡献、特殊贡献B3q输出条件输出条件n奖金类别:奖金类别:1类奖金类奖金C1、、2类奖金类奖金C2......n((2)分析输入条件之间的关系,根据需求)分析输入条件之间的关系,根据需求我们知道,我们知道,A1和和A2是互斥的(一个人不可是互斥的(一个人不可能既是普通员工又是管理人员),能既是普通员工又是管理人员),B1和和B2是互斥的(一个人不可能既表现普通又表是互斥的(一个人不可能既表现普通又表现优秀),现优秀),B1和和B3,,B2和和B3可以同时满可以同时满足由此分析,我们可以列出所有的输入足由此分析,我们可以列出所有的输入条件排列组合:条件排列组合:q普通员工普通员工nA1+B1C1nA1+B2 C2nA1+B1+B3 C3nA1+B2+B3 C4q管理人员管理人员nA2+B1C5nA2+B2 C6nA2+B1+B3 C7nA2+B2+B3 C8n((3)根据对输入输出条件的分析,画)根据对输入输出条件的分析,画出因果图出因果图n((4)根据对输入输出条件的分析,编写)根据对输入输出条件的分析,编写测试用例测试用例用例编号用例编号输输 入入输输 出出1 1普通员工,表现普通普通员工,表现普通1 1类奖金类奖金2 2普通员工,表现优秀普通员工,表现优秀2 2类奖金类奖金 3 3普通员工,表现普通,且有特殊贡献普通员工,表现普通,且有特殊贡献3 3类奖金类奖金 4 4普通员工,表现优秀,且有特殊贡献普通员工,表现优秀,且有特殊贡献4 4类奖金类奖金 5 5管理人员,表现普通管理人员,表现普通5 5类奖金类奖金 6 6管理人员,表现优秀管理人员,表现优秀6 6类奖金类奖金 7 7管理人员,表现普通,且有特殊贡献管理人员,表现普通,且有特殊贡献7 7类奖金类奖金 8 8管理人员,表现优秀,且有特殊贡献管理人员,表现优秀,且有特殊贡献8 8类奖金类奖金 决策表测试法决策表测试法1 1、决策表、决策表 在所有的黑盒测试方法中,基于决策在所有的黑盒测试方法中,基于决策表(也称判定表)的测试是最为严格、最表(也称判定表)的测试是最为严格、最具有逻辑性的测试方法。
具有逻辑性的测试方法 决策表的概念:决策表是分析和表达决策表的概念:决策表是分析和表达多逻辑条件下执行不同操作的情况的工具多逻辑条件下执行不同操作的情况的工具 决策表的优点:能够将复杂的问题按决策表的优点:能够将复杂的问题按照各种可能的情况全部列举出来,简明并照各种可能的情况全部列举出来,简明并避免遗漏因此,利用决策表能够设计出避免遗漏因此,利用决策表能够设计出完整的测试用例集合完整的测试用例集合 在一些数据处理问题当中,某些操作在一些数据处理问题当中,某些操作的实施依赖于多个逻辑条件的组合,即:的实施依赖于多个逻辑条件的组合,即:针对不同逻辑条件的组合值,分别执行不针对不同逻辑条件的组合值,分别执行不同的操作决策表很适合于处理这类问题同的操作决策表很适合于处理这类问题 决策表通常由以下决策表通常由以下4 4部分组成:部分组成:Ø 条件桩条件桩——列出问题的所有条件列出问题的所有条件Ø 条件项条件项——针对条件桩给出的条件列出针对条件桩给出的条件列出所有可能的取值所有可能的取值Ø动作桩动作桩——列出问题规定的可能采取的列出问题规定的可能采取的操作操作Ø动作项动作项——指出在条件项的各组取值情指出在条件项的各组取值情况下应采取的动作况下应采取的动作 构造决策表的构造决策表的5 5个步骤:个步骤:((1 1)) 确定规则的个数。
确定规则的个数有有n n个条件的决策表有个条件的决策表有2 2n n个规则(每个条件个规则(每个条件取真、假值)取真、假值)2 2)) 列出所有的条件桩和动作桩列出所有的条件桩和动作桩3 3)) 填入条件项填入条件项4 4)) 填入动作项,得到初始决策表填入动作项,得到初始决策表5 5)) 简化决策表,合并相似规则简化决策表,合并相似规则 若表中有两条以上规则具有相同的若表中有两条以上规则具有相同的动作,并且在条件项之间存在极为相似动作,并且在条件项之间存在极为相似的关系,便可以合并的关系,便可以合并 合并后的条件项用符号合并后的条件项用符号“-”“-”表示,表示,说明执行的动作与该条件的取值无关,说明执行的动作与该条件的取值无关,称为无关条件称为无关条件 下表是一张下表是一张下表是一张下表是一张“ “阅读指南阅读指南阅读指南阅读指南” ”的表单,读者对表的表单,读者对表的表单,读者对表的表单,读者对表中的问题,若回答肯定,标注中的问题,若回答肯定,标注中的问题,若回答肯定,标注中的问题,若回答肯定,标注“Y”“Y”,若回答否,若回答否,若回答否,若回答否定,标注定,标注定,标注定,标注“N”“N” 实际使用决策表时,需要简化,简化实际使用决策表时,需要简化,简化是以合并相似规则为目标,所以,若表中是以合并相似规则为目标,所以,若表中有两条以上规则具有相同的动作,并且在有两条以上规则具有相同的动作,并且在条件项之间存在极为相似的关系,便可以条件项之间存在极为相似的关系,便可以合并。
合并2 2、决策表应用实例、决策表应用实例NextDate函数的决策表测试用例设计:函数的决策表测试用例设计:问题分析:问题分析:NextDateNextDate函数的三个变量之间在输入函数的三个变量之间在输入函数的三个变量之间在输入函数的三个变量之间在输入定义域中存在一定的逻辑依赖关系,由于等价类划定义域中存在一定的逻辑依赖关系,由于等价类划定义域中存在一定的逻辑依赖关系,由于等价类划定义域中存在一定的逻辑依赖关系,由于等价类划分和边界值分析测试都假设了变量是独立的,如果分和边界值分析测试都假设了变量是独立的,如果分和边界值分析测试都假设了变量是独立的,如果分和边界值分析测试都假设了变量是独立的,如果采用上述两种方法设计测试用例,那么这些依赖关采用上述两种方法设计测试用例,那么这些依赖关采用上述两种方法设计测试用例,那么这些依赖关采用上述两种方法设计测试用例,那么这些依赖关系在机械的选取输入值时可能会丢失而采用决策系在机械的选取输入值时可能会丢失而采用决策系在机械的选取输入值时可能会丢失而采用决策系在机械的选取输入值时可能会丢失而采用决策表法则可以通过使用表法则可以通过使用表法则可以通过使用表法则可以通过使用“ “不可能动作不可能动作不可能动作不可能动作” ”的概念表示条件的概念表示条件的概念表示条件的概念表示条件的不可能组合,来强调这种依赖关系。
的不可能组合,来强调这种依赖关系的不可能组合,来强调这种依赖关系的不可能组合,来强调这种依赖关系 说明:当决策表规模(指规则的数说明:当决策表规模(指规则的数目,目,n n个条件的决策表有个条件的决策表有2 2n n个规则)较大个规则)较大时,可以通过扩展条目决策表(条件使时,可以通过扩展条目决策表(条件使用等价类)、代数简化表、将大表用等价类)、代数简化表、将大表““分分解解””为小表等方法为小表等方法 为了获得下一个日期,为了获得下一个日期,为了获得下一个日期,为了获得下一个日期,NextDateNextDateNextDateNextDate函数执行函数执行函数执行函数执行如下操作如下操作如下操作如下操作: : : : 如果输入日期不是当月最后一天,则把如果输入日期不是当月最后一天,则把如果输入日期不是当月最后一天,则把如果输入日期不是当月最后一天,则把daydaydayday变量的值加变量的值加变量的值加变量的值加1 1 1 1;;;; 如果输入日期是如果输入日期是如果输入日期是如果输入日期是1~111~111~111~11月份中某月的最后一月份中某月的最后一月份中某月的最后一月份中某月的最后一天,则把天,则把天,则把天,则把daydaydayday变量的值复位为变量的值复位为变量的值复位为变量的值复位为1 1 1 1,,,,monthmonthmonthmonth变量的值变量的值变量的值变量的值加加加加1 1 1 1;;;; 如果输入日期是如果输入日期是如果输入日期是如果输入日期是12121212月的最后一天,则月的最后一天,则月的最后一天,则月的最后一天,则daydaydayday变变变变量和量和量和量和monthmonthmonthmonth变量的值都复位为变量的值都复位为变量的值都复位为变量的值都复位为1 1 1 1,,,,yearyearyearyear变量的值变量的值变量的值变量的值加加加加1 1 1 1。
关于最后一天的判断:关于最后一天的判断:关于最后一天的判断:关于最后一天的判断: 如果是有如果是有如果是有如果是有31313131天的月份天的月份天的月份天的月份(1,3,5,7,8,10,12)(1,3,5,7,8,10,12)(1,3,5,7,8,10,12)(1,3,5,7,8,10,12),,,,daydaydayday变量值为变量值为变量值为变量值为31313131;;;; 如果是有如果是有如果是有如果是有30303030天的月份天的月份天的月份天的月份(4,6,9,11)(4,6,9,11)(4,6,9,11)(4,6,9,11),,,, day day day day变量变量变量变量值为值为值为值为30303030;;;; 如果是有如果是有如果是有如果是有29292929天的月份天的月份天的月份天的月份( ( ( (闰年的闰年的闰年的闰年的2 2 2 2月月月月) ) ) ),,,,daydaydayday变量变量变量变量值为值为值为值为29292929;;;; 如果是有如果是有如果是有如果是有28282828天的月份天的月份天的月份天的月份( ( ( (非闰年非闰年非闰年非闰年2 2 2 2月月月月) ) ) ),,,,daydaydayday变量变量变量变量值为值为值为值为28282828。
NextDateNextDate函数的动作桩和条件桩:函数的动作桩和条件桩: 根据所执行的操作,可列出根据所执行的操作,可列出NextDateNextDate函数的动作桩:函数的动作桩:a1: a1: 不可能;不可能;a2: daya2: day加加1 1;;a3: daya3: day复位;复位;a4: montha4: month加加1 1;;a5: montha5: month复位;复位;a6: yeara6: year加加1 1 考虑到决策表的规模,条件使用考虑到决策表的规模,条件使用monthmonth、、dayday、、yearyear变量的等价类,在以下变量的等价类,在以下等价类集合上建立决策表:等价类集合上建立决策表:对于对于monthmonth变量的取值:变量的取值:M1: {month: monthM1: {month: month有有3030天天} };;M2: {month:monthM2: {month:month有有3131天,天,1212月除外月除外} };;M3: {month:monthM3: {month:month是是1212月月} };; M4: {month:monthM4: {month:month是是2 2月月} };; 对于对于dayday变量的取值:变量的取值:D1:{day:1≤day≤27}D1:{day:1≤day≤27};;D2: {day:day=28}D2: {day:day=28};;D3: {day:day=29}D3: {day:day=29};; D4: {day:day=30}D4: {day:day=30};; D5: {day:day=31}D5: {day:day=31};;对于对于yearyear变量的取值:变量的取值:Y1:{year:yearY1:{year:year是闰年是闰年} };;Y2: {year:yearY2: {year:year不是闰年不是闰年} } 3 3、决策表的适用范围、决策表的适用范围 决策表测试法适用于具有以下特征的决策表测试法适用于具有以下特征的应用程序:应用程序:Ø if-then-elseif-then-else逻辑突出;逻辑突出;Ø 输入变量之间存在逻辑关系;输入变量之间存在逻辑关系;Ø 涉及输入变量子集的计算;涉及输入变量子集的计算;Ø 输入与输出之间存在因果关系。
输入与输出之间存在因果关系 适用于使用决策表设计测试用例的条件:适用于使用决策表设计测试用例的条件:ü 规格说明以决策表形式给出,或较容易转换为规格说明以决策表形式给出,或较容易转换为规格说明以决策表形式给出,或较容易转换为规格说明以决策表形式给出,或较容易转换为决策表ü 条件的排列顺序不会也不应影响执行的操作条件的排列顺序不会也不应影响执行的操作条件的排列顺序不会也不应影响执行的操作条件的排列顺序不会也不应影响执行的操作ü 规则的排列顺序不会也不应影响执行的操作规则的排列顺序不会也不应影响执行的操作规则的排列顺序不会也不应影响执行的操作规则的排列顺序不会也不应影响执行的操作ü 当某一规则的条件已经满足,并确定要执行的当某一规则的条件已经满足,并确定要执行的当某一规则的条件已经满足,并确定要执行的当某一规则的条件已经满足,并确定要执行的操作后,不必检验别的规则操作后,不必检验别的规则操作后,不必检验别的规则操作后,不必检验别的规则ü 如果某一规则的条件要执行多个操作,这些操如果某一规则的条件要执行多个操作,这些操如果某一规则的条件要执行多个操作,这些操如果某一规则的条件要执行多个操作,这些操作的执行顺序无关紧要。
作的执行顺序无关紧要作的执行顺序无关紧要作的执行顺序无关紧要 用决策表测试法测试以下程序:用决策表测试法测试以下程序: 该程序有三个输入变量该程序有三个输入变量monthmonth、、dayday、、yearyear((monthmonth、、dayday和和yearyear均为整数值,均为整数值,并且满足:并且满足:1≤month≤121≤month≤12和和1≤day≤311≤day≤31),),分别作为输入日期的月份、日、年份,通分别作为输入日期的月份、日、年份,通过程序可以输出该输入日期在日历上隔一过程序可以输出该输入日期在日历上隔一天的日期天的日期 例如,输入为例如,输入为2004年年11月月29日,则该日,则该程序的输出为程序的输出为2004年年12月月1日 ((1 1)分析各种输入情况,列出为输入变)分析各种输入情况,列出为输入变量量monthmonth、、dayday、、yearyear划分的有效等价类划分的有效等价类2 2)分析程序规格说明,结合以上等价)分析程序规格说明,结合以上等价类划分的情况给出问题规定的可能采取的类划分的情况给出问题规定的可能采取的操作(即列出所有的动作桩)。
操作(即列出所有的动作桩)3 3)根据)根据(1)(1)和和(2)(2),画出简化后的决策,画出简化后的决策表 案例分析:案例分析:monthmonth变量的有效等价类:变量的有效等价类:M1: {month=4,6,9,11} M1: {month=4,6,9,11} M2: {month=1,3,5,7,8,10}M2: {month=1,3,5,7,8,10}M3: {month=12}M3: {month=12}M4: {month=2} M4: {month=2} dayday变量的有效等价类:变量的有效等价类:D1: {1≤day≤26}D1: {1≤day≤26}D2: {day=27}D2: {day=27}D3: {day=28}D3: {day=28}D4: {day=29}D4: {day=29}D5: {day=30}D5: {day=30}D6: {day=31} D6: {day=31} yearyear变量的有效等价类:变量的有效等价类:Y1: {yearY1: {year是闰年是闰年} }Y2: {yearY2: {year不是闰年不是闰年} } 考虑各种有效的输入情况,程序中可考虑各种有效的输入情况,程序中可能采取的操作有以下六种:能采取的操作有以下六种:a1: day+2 a2: day=2a1: day+2 a2: day=2a3: day=1 a4: month+1a3: day=1 a4: month+1a5: month=1 a6: a5: month=1 a6: year+1 year+1 例子:在一款招生管理系统中,有例子:在一款招生管理系统中,有一个计算加分的小功能。
加分的政策是:一个计算加分的小功能加分的政策是:““如果考生属于少数民族,加如果考生属于少数民族,加5 5分;如分;如果考生是体育特长生,加果考生是体育特长生,加5 5分;如果考分;如果考生具备了前两项加分条件,为了保持公生具备了前两项加分条件,为了保持公正,加正,加8 8分(而不是加分(而不是加1010分)需要测试需要测试需要测试需要测试的情况的情况的情况的情况情况情况情况情况1 1 1 1情况情况情况情况2 2 2 2情况情况情况情况3 3 3 3情况情况情况情况4 4 4 4少数民族少数民族少数民族少数民族是是是是是是是是不是不是不是不是不是不是不是不是体育特长体育特长体育特长体育特长是是是是不是不是不是不是是是是是不是不是不是不是加加加加5 5 5 5分分分分√ √√ √加加加加8 8 8 8分分分分√ √不加分不加分不加分不加分√ √白盒测试白盒测试n白盒测试方法白盒测试方法q程序结构分析测试程序结构分析测试q逻辑覆盖测试逻辑覆盖测试q基本路径测试基本路径测试 白盒测试也称结构测试或逻辑驱动测试,是白盒测试也称结构测试或逻辑驱动测试,是针对被测单元内部是如何进行工作的测试。
它根针对被测单元内部是如何进行工作的测试它根据程序的控制结构设计测试用例,主要用于软件据程序的控制结构设计测试用例,主要用于软件或程序验证或程序验证n白盒测试法检查程序白盒测试法检查程序内部逻辑结构内部逻辑结构,对所有逻辑,对所有逻辑路径进行测试,是一种路径进行测试,是一种穷举路径穷举路径的测试方法的测试方法n但即使每条独立路径都测试过了,仍然可能存在但即使每条独立路径都测试过了,仍然可能存在错误,因为:错误,因为:q((1)穷举路径测试无法检查出程序本身是否违反)穷举路径测试无法检查出程序本身是否违反了设计规范,即程序是否是一个错误的程序了设计规范,即程序是否是一个错误的程序q((2)穷举路径测试不可能查出程序因为遗漏路径)穷举路径测试不可能查出程序因为遗漏路径而出的错误而出的错误q((3)穷举路径测试发现不了一些与数据相关的错)穷举路径测试发现不了一些与数据相关的错误误n采用白盒测试方法必须遵循以下几条原则,采用白盒测试方法必须遵循以下几条原则,才能达到测试的目的:才能达到测试的目的:((1)保证一个模块中的所有独立路径至少)保证一个模块中的所有独立路径至少被测试一次被测试一次。
2)所有逻辑值均需测试真)所有逻辑值均需测试真(true)和假和假(false) 两种情况两种情况3)检查程序的内部数据结构,保证其结)检查程序的内部数据结构,保证其结构的有效性构的有效性4)在取值上下边界,即可操作范围内运)在取值上下边界,即可操作范围内运行所有循环行所有循环白盒测试的基本概念白盒测试的基本概念 1、控制流图、控制流图 控制流图(可简称流图)是对程序流程控制流图(可简称流图)是对程序流程图进行简化后得到的,它可以更加突出的图进行简化后得到的,它可以更加突出的表示过程控制流的结构表示过程控制流的结构 控制流图中包括两种图形符号:节点和控制流图中包括两种图形符号:节点和控制流线控制流线 节点由带标号的圆圈表示,可代表一个节点由带标号的圆圈表示,可代表一个或多个语句、一个处理框序列和一个条件判或多个语句、一个处理框序列和一个条件判定框(假设不包含复合条件)定框(假设不包含复合条件) 控制流线由带箭头的弧或线表示,可称控制流线由带箭头的弧或线表示,可称为边它代表程序中的控制流它代表程序中的控制流 包含条件的节点被称为判断节点,由判包含条件的节点被称为判断节点,由判断节点发出的边必须终止于某一个节点,由断节点发出的边必须终止于某一个节点,由边和节点所限定的范围被称为区域。
边和节点所限定的范围被称为区域n n常见结构的控制流图:常见结构的控制流图: 对于复合条件,则可将其分解为多个对于复合条件,则可将其分解为多个单个条件,并映射成控制流图,如下图所单个条件,并映射成控制流图,如下图所示:示:n n流程图转化为控制流图例子流程图转化为控制流图例子((a)是一个含有两个出口判断和循环的程)是一个含有两个出口判断和循环的程序流程图,我们把它化简成(序流程图,我们把它化简成(b)的形式)的形式n n流程图转化为控制流图例子:流程图转化为控制流图例子:2、、环形复杂度环形复杂度n n环形复杂度(也称为圈复杂度)环形复杂度(也称为圈复杂度)是一种为程序逻辑复杂度提供定量尺度的软是一种为程序逻辑复杂度提供定量尺度的软件度量n n环形复杂度的应用环形复杂度的应用可以将环形复杂度用于基本路径方法,它可可以将环形复杂度用于基本路径方法,它可以提供:程序基本集的独立路径数量;确保以提供:程序基本集的独立路径数量;确保所有语句至少执行一次的测试数量的上界所有语句至少执行一次的测试数量的上界独立路径独立路径n n是指程序中至少引入了一个新的处理与集合是指程序中至少引入了一个新的处理与集合是指程序中至少引入了一个新的处理与集合是指程序中至少引入了一个新的处理与集合或一个新条件的程序通路或一个新条件的程序通路或一个新条件的程序通路或一个新条件的程序通路n n独立路径必须至少包含一条在本次定义路径独立路径必须至少包含一条在本次定义路径独立路径必须至少包含一条在本次定义路径独立路径必须至少包含一条在本次定义路径之前不曾用过的边之前不曾用过的边之前不曾用过的边之前不曾用过的边注意:注意:n n测试可以被设计为基本路径集的执行过程,测试可以被设计为基本路径集的执行过程,测试可以被设计为基本路径集的执行过程,测试可以被设计为基本路径集的执行过程,但基本路径集通常并不唯一但基本路径集通常并不唯一但基本路径集通常并不唯一但基本路径集通常并不唯一 环形复杂度以图论为基础,为我们提环形复杂度以图论为基础,为我们提供了非常有用的软件度量。
可用如下三种供了非常有用的软件度量可用如下三种方法之一来计算环形复杂度方法之一来计算环形复杂度::((1 1)控制流图中区域的数量对应于环形)控制流图中区域的数量对应于环形复杂度((2 2)给定控制流图)给定控制流图G G的环形复杂度的环形复杂度—V(G)—V(G),定义为,定义为 V(G) = E-N+2 V(G) = E-N+2 其中,其中,E E是控制流图中边的数量,是控制流图中边的数量,N N是控是控制流图中的节点数量制流图中的节点数量((3 3)给定控制流图)给定控制流图G G的环形复杂度的环形复杂度——V(G)V(G),也可定义为,也可定义为 V(G) = P+1 V(G) = P+1 其中,其中,P P是控制流图是控制流图G G中判定节点中判定节点的数量3、矩阵图、矩阵图n n矩阵图矩阵图为便于在机器上表示和处理控制流图,我们为便于在机器上表示和处理控制流图,我们可以把它表示成矩阵的形式,称为控制流矩可以把它表示成矩阵的形式,称为控制流矩阵图阵图控制流图的矩阵表示形式控制流图的矩阵表示形式其维数等于控制流图的节点数其维数等于控制流图的节点数矩阵中的每列和每行都对应于标识的节点,矩阵中的每列和每行都对应于标识的节点,矩阵元素对应于节点间的边矩阵元素对应于节点间的边如果在如果在控制流图控制流图中从第中从第 i i 个结点到第个结点到第 j j 个结点有一个标识为个结点有一个标识为 x x 的边相连接,的边相连接,则在对应则在对应矩阵图矩阵图的第的第 i i 行第行第 j j 列有一列有一个非空的元素个非空的元素 x x 。
例:例:节点节点节点节点1 12 23 34 41 1a a2 2b b3 3c c4 4d d控制流图控制流图控制流图控制流图流图对应的矩阵图流图对应的矩阵图流图对应的矩阵图流图对应的矩阵图1 12 23 34 45 51 12 23 34 45 5 白盒测试作为结构测试方法,是按照白盒测试作为结构测试方法,是按照程序内部的结构测试程序,检验程序中的程序内部的结构测试程序,检验程序中的每条通路是否都能按预定要求正确工作,每条通路是否都能按预定要求正确工作,因此需要采用适当的逻辑覆盖测试方法来因此需要采用适当的逻辑覆盖测试方法来完成逻辑覆盖测试方法逻辑覆盖测试方法 测试覆盖率:用于确定测试所执行到测试覆盖率:用于确定测试所执行到的覆盖项的百分比其中的覆盖项是指作的覆盖项的百分比其中的覆盖项是指作为测试基础的一个入口或属性,比如语句、为测试基础的一个入口或属性,比如语句、分支、条件等分支、条件等 测试覆盖率可以表示出测试的充分性,测试覆盖率可以表示出测试的充分性,在测试分析报告中可以作为量化指标的依在测试分析报告中可以作为量化指标的依据,测试覆盖率越高效果越好。
但覆盖率据,测试覆盖率越高效果越好但覆盖率不是目标,只是一种手段不是目标,只是一种手段 测试覆盖率包括功能点覆盖率和结构覆盖率:测试覆盖率包括功能点覆盖率和结构覆盖率: 功能点覆盖率大致用于表示软件已经实现功能点覆盖率大致用于表示软件已经实现的功能与软件需要实现的功能之间的比例关系的功能与软件需要实现的功能之间的比例关系 结构覆盖率包括语句覆盖率、分支覆盖率、结构覆盖率包括语句覆盖率、分支覆盖率、循环覆盖率、路径覆盖率等等循环覆盖率、路径覆盖率等等 1 1、逻辑覆盖测试方法介绍、逻辑覆盖测试方法介绍 根据覆盖目标的不同,逻辑覆盖又可分为根据覆盖目标的不同,逻辑覆盖又可分为语句覆盖、判定覆盖、条件覆盖、判定语句覆盖、判定覆盖、条件覆盖、判定/ /条件覆条件覆盖、组合覆盖和路径覆盖盖、组合覆盖和路径覆盖 例如:程序例如:程序If(A>1&&B=0)If(A>1&&B=0) X=X/A; X=X/A;If(A=2||X>1)If(A=2||X>1) X=X+1; X=X+1;L1 ( a c e )= {(A>1) and (B=0)} and {(A=2) or (X/A>1)}= (A>1) and (B=0) and (A=2) or (A>1) and (B=0) and (X/A>1)= (A=2) and (B=0) or (A>1) and (B=0) and (X/A>1)L2 ( a b d )= not{(A>1) and (B=0)} and not{(A=2) or (X>1)}= { not (A>1) or not (B=0) } and { not (A=2) and not (X>1) }= not (A>1) and not (A=2) and not (X>1) or not (B=0) and not (A=2) and not (X>1)= not (A>1) and not (X>1) or not (B=0) and not (A=2) and not (X>1)L3 ( a b e)= not {(A>1) and (B=0)} and {(A=2) or (X>1)}= { not (A>1) or not (B=0)} and {(A=2) or (X>1)}= not (A>1) and (A=2) or not (A>1) and (X>1) or not (B=0) and (A=2) or not (B=0) and (X>1)L4 ( a c d )= {(A>1) and (B=0)} and not {(A=2) or (X/A>1)}= (A>1) and (B=0) and not (A=2) and not (X/A>1)((1 1)语句覆盖)语句覆盖n n语句覆盖就是设计足够多个测试用例,运行语句覆盖就是设计足够多个测试用例,运行被测程序,使得每一可执行语句至少执行一被测程序,使得每一可执行语句至少执行一次。
次n n在图例中,正好所有的可执行语句都在路径在图例中,正好所有的可执行语句都在路径L1L1上,所以选择路径上,所以选择路径L1L1设计测试用例,就可设计测试用例,就可以覆盖所有的可执行语句以覆盖所有的可执行语句测试用例如下:测试用例测试用例测试用例测试用例A,B,XA,B,XA,B,XA,B,X (A >1)AND (A >1)AND (A >1)AND (A >1)AND (B (B (B (B====0)0)0)0)(A(A(A(A====2)OR2)OR2)OR2)OR(X>1)(X>1)(X>1)(X>1)执行路径执行路径执行路径执行路径测试用例测试用例测试用例测试用例1 1 1 1 2,0,42,0,42,0,42,0,4真(真(真(真(T T T T))))真(真(真(真(T T T T)))) aceaceaceace((((BCEBCEBCEBCEF F F F))))图图图图 被测试模块的流程图被测试模块的流程图被测试模块的流程图被测试模块的流程图A=2B=0X=4((2 2)判定覆盖)判定覆盖n n判定覆盖就是设计若干个测试用例,运行判定覆盖就是设计若干个测试用例,运行被测程序,使得程序中每个判断的取真分被测程序,使得程序中每个判断的取真分支和取假分支至少经历一次。
支和取假分支至少经历一次n n判定覆盖又称为判定覆盖又称为分支覆盖分支覆盖n n每个语句每个语句+ +每个判定的每个分支每个判定的每个分支ØØ对于图例,如果选择路径对于图例,如果选择路径对于图例,如果选择路径对于图例,如果选择路径L1L1L1L1和和和和L2L2L2L2,就可得满足,就可得满足,就可得满足,就可得满足要求的测试用例要求的测试用例要求的测试用例要求的测试用例: : : : 【【【【(2, 0, 4)(2, 0, 4)(2, 0, 4)(2, 0, 4),,,,(2, 0, 3)(2, 0, 3)(2, 0, 3)(2, 0, 3)】】】】覆盖覆盖覆盖覆盖 aceaceaceace【【【【L1L1L1L1】】】】【【【【(1, 1, 1)(1, 1, 1)(1, 1, 1)(1, 1, 1),,,,(1, 1, 1)(1, 1, 1)(1, 1, 1)(1, 1, 1)】】】】覆盖覆盖覆盖覆盖 abdabdabdabd【【【【L2L2L2L2】】】】ØØ如果选择路径如果选择路径如果选择路径如果选择路径L3L3L3L3和和和和L4L4L4L4,,,,还可得另一组可用的测还可得另一组可用的测还可得另一组可用的测还可得另一组可用的测试用例试用例试用例试用例: : : :【【【【(2, 1, 1)(2, 1, 1)(2, 1, 1)(2, 1, 1),,,,(2, 1, 2)(2, 1, 2)(2, 1, 2)(2, 1, 2)】覆盖】覆盖】覆盖】覆盖 abe abe abe abe【【【【L3L3L3L3】】】】【【【【(3, 0, 3)(3, 0, 3)(3, 0, 3)(3, 0, 3),,,,(3, 0, 1)(3, 0, 1)(3, 0, 1)(3, 0, 1)】覆盖】覆盖】覆盖】覆盖 acd acd acd acd【【【【L4L4L4L4】】】】图图图图 被测试模块的流程图被测试模块的流程图被测试模块的流程图被测试模块的流程图A=3,B=0,X=3A=3,B=0,X=3A=2,B=1,X=1A=2,B=1,X=1((3 3)条件覆盖)条件覆盖 条件覆盖就是设计若干个测试用例,运条件覆盖就是设计若干个测试用例,运行被测程序,使得程序中每个判断的每个条行被测程序,使得程序中每个判断的每个条件的可能取值至少执行一次。
件的可能取值至少执行一次 在图例中,我们事先可对所有条件的取在图例中,我们事先可对所有条件的取值加以标记例如,值加以标记例如,对于第一个判断:对于第一个判断: 条件条件 A A>>1 1 取真为取真为 ,取假为,取假为 条件条件 B B==0 0 取真为取真为 ,取假为,取假为对于第二个判断:对于第二个判断: 条件条件 A A==2 2 取真为取真为 ,取假为,取假为 条件条件 X X>>1 1 取真为取真为 ,取假为,取假为T T4 4测试用例测试用例 覆盖分支覆盖分支 条件取值条件取值【【(2, 0, 4),(2, 0, 3)】】 L1(c, e) 【【(1, 0, 1),(1, 0, 1)】】 L2(b, d) 【【(2, 1, 1),(2, 1, 2)】】 L3(b, e)或或 测试用例测试用例 覆盖分支覆盖分支 条件取值条件取值【【(1, 0, 3),(1, 0, 4)】】 L3(b, e) 【【(2, 1, 1),(2, 1, 2)】】 L3(b, e) ((4 4)判定)判定/ /条件覆盖条件覆盖 设计足够多的测试用例,使得程序中每设计足够多的测试用例,使得程序中每个判定包含的每个条件的所有情况(真个判定包含的每个条件的所有情况(真/ /假)假)至少出现一次,并且每个判定本身的判定结至少出现一次,并且每个判定本身的判定结果(真果(真/ /假)也至少出现一次。
假)也至少出现一次 —— ——满足判定满足判定/ /条件覆盖的测试用例一条件覆盖的测试用例一定同时满足判定覆盖和条件覆盖定同时满足判定覆盖和条件覆盖 测测 试试 用用 例例 覆盖分支覆盖分支 条件取值条件取值【【(2, 0, 4),(2, 0, 3)】】 L1(c, e)【【(1, 1, 1),(1, 1, 1)】】 L2(b, d) ((5 5)组合覆盖)组合覆盖 通过执行足够的测试用例,使得程序中通过执行足够的测试用例,使得程序中每个判定的所有可能的条件取值组合都至少每个判定的所有可能的条件取值组合都至少出现一次出现一次 ——满足组合覆盖的测试用例一定满足满足组合覆盖的测试用例一定满足判定覆盖、条件覆盖和判定判定覆盖、条件覆盖和判定/条件覆盖条件覆盖 ① A① A>>1, B1, B==0 0 作作 ② A② A>>1, B≠0 1, B≠0 作作 ③ A≯1, B③ A≯1, B==0 0 作作 ④ A≯1, B≠0 ④ A≯1, B≠0 作作⑤ A⑤ A==2, X2, X>>1 1 作作 ⑥ A⑥ A==2, X≯1 2, X≯1 作作 ⑦ A≠2, X⑦ A≠2, X>>1 1 作作 ⑧ A≠2, X≯1 ⑧ A≠2, X≯1 作作测试用例测试用例 覆盖条件覆盖条件 覆盖组合覆盖组合【【(2, 0, 4), (2, 0, 3)】】 (L1) ①①, ⑤⑤【【(2, 1, 1), (2, 1, 2)】】 (L3) ②②, ⑥⑥【【(1, 0, 3), (1, 0, 4)】】 (L3) ③③, ⑦⑦【【(1, 1, 1), (1, 1, 1)】】 (L2) ④④, ⑧⑧((6 6)路径覆盖)路径覆盖 设计足够多的测试用例,要求覆盖程设计足够多的测试用例,要求覆盖程序中所有可能的路径。
序中所有可能的路径 从流程图和控制流从流程图和控制流图上可以看出,其中有图上可以看出,其中有4条可能的路径,分条可能的路径,分别是别是L1、、L2、、L3和和L4现实问题:现实问题:n前面介绍的逻辑覆盖其出发点似乎是合理前面介绍的逻辑覆盖其出发点似乎是合理的所谓“覆盖覆盖”,就是想要做到全面,无,就是想要做到全面,无遗漏但事实表明,它并不能真的做到无遗漏但事实表明,它并不能真的做到无遗漏如下简单程序段:遗漏如下简单程序段:n错写成:错写成:n这样的小问题都无能为力这样的小问题都无能为力n原因在于,错误区域仅仅在原因在于,错误区域仅仅在I=0这个点上,这个点上,只有当我们取只有当我们取I=0时,才会发现错误时,才会发现错误n 从我们精心设计的力图全面覆盖来查从我们精心设计的力图全面覆盖来查找错误的测试找错误的测试“网网”上钻了出去,而且是恰上钻了出去,而且是恰恰在容易发生问题的条件判断处出现了问恰在容易发生问题的条件判断处出现了问题n n对这类情况,我们应从中吸取经验教训对这类情况,我们应从中吸取经验教训——测试工作要有测试工作要有重点重点,要多针对容易发生,要多针对容易发生问题的地方设计测试用例。
问题的地方设计测试用例n n感兴趣的同学可以看一下感兴趣的同学可以看一下感兴趣的同学可以看一下感兴趣的同学可以看一下ESTCAESTCA覆盖准则和层次覆盖准则和层次覆盖准则和层次覆盖准则和层次LCSAJLCSAJ覆盖准则覆盖准则覆盖准则覆盖准则习题:习题:A>4||B<3A=A-2B=B+1A<5&&B>6开始开始A=A+1结束结束YNYNabcd路径测试方法路径测试方法n n从广义的角度讲,任何有关路径分析的测从广义的角度讲,任何有关路径分析的测试都可以被称为路径测试试都可以被称为路径测试n n路径测试路径测试就是从一个程序的入口开始,执就是从一个程序的入口开始,执行所经历的各个语句的完整过程行所经历的各个语句的完整过程n n路径测试是白盒测试最为典型的问题,完路径测试是白盒测试最为典型的问题,完成路径测试的理想情况是做到路径覆盖成路径测试的理想情况是做到路径覆盖 实际上我们能做到的就是程序中主要路实际上我们能做到的就是程序中主要路径的测试径的测试 为了满足路径覆盖,必须首先确定具为了满足路径覆盖,必须首先确定具体的体的路径路径以及以及路径的个数路径的个数。
进行路径分析,首先要解决的是路径进行路径分析,首先要解决的是路径如何表示的问题如何表示的问题n我们已经介绍了程序控制流图有了控制我们已经介绍了程序控制流图有了控制流图,给出路径的标识就容易多了流图,给出路径的标识就容易多了 如果如果1节点为程序入口,节点为程序入口, 5节点为程序出口,节点为程序出口, 在此列举在此列举4条路径,条路径, 分别以弧序列表示及节点分别以弧序列表示及节点 序列表示序列表示 n n1、路径表达式、路径表达式上述弧序列表示和节点序列表示均指某一路上述弧序列表示和节点序列表示均指某一路径而言。
我们希望能找到一种能够给出程序径而言我们希望能找到一种能够给出程序中所有路径的、更加概括的表示方法中所有路径的、更加概括的表示方法路径表达式路径表达式作为一种表达式,其运算对象指作为一种表达式,其运算对象指的是控制流图中的的是控制流图中的弧弧,此外引入两个运算:,此外引入两个运算:乘乘和和加加n n((1)弧)弧a和弧和弧b相乘,表示为相乘,表示为ab,它表明路,它表明路径是先经历弧径是先经历弧a,接着再经历弧,接着再经历弧b,弧,弧a和弧和弧b是先后相接的是先后相接的2)弧)弧a和弧和弧b相加,表示为相加,表示为a+b,它表明,它表明两条弧是两条弧是“或或”的关系,是并行的路段的关系,是并行的路段n图图a表示的控制流图,表示的控制流图,共有共有4条路径:条路径:abdf,,abef,,acdf,,acefn这这4条路径是并行的条路径是并行的,或的或的关系,我们可用加法运算连关系,我们可用加法运算连接它们,从而得到完整的路接它们,从而得到完整的路径表达式:径表达式:abdf+abde+acdf+acefn图图b给出的是具有循环的控制流图,它的路给出的是具有循环的控制流图,它的路径随着执行不同次数循环体而有所不同,径随着执行不同次数循环体而有所不同,如如abd,,abcbd,,abcbcbd,,......分别是执分别是执行一次、两次、三次循环体的路径。
行一次、两次、三次循环体的路径n其路径表达式:其路径表达式:qabd+abcbd+abcbcbd+......n n路径数的计算:路径数的计算:假定所讨论的程序已经得到了它的路径表达假定所讨论的程序已经得到了它的路径表达式,则可把其中的所有弧均代以数值式,则可把其中的所有弧均代以数值“1”,,然后依表达式的乘法和加法运算,所得数值然后依表达式的乘法和加法运算,所得数值即为该程序的路径数即为该程序的路径数n n2、基本路径测试方法、基本路径测试方法对于复杂性大的程序要做到所有路径覆盖对于复杂性大的程序要做到所有路径覆盖(测试所有可执行路径)是不可能的测试所有可执行路径)是不可能的在不能做到所有路径覆盖的前提下,如果某在不能做到所有路径覆盖的前提下,如果某一程序的每一个一程序的每一个独立路径独立路径都被测试过,那么都被测试过,那么可以认为程序中的每个语句都已经检验过了,可以认为程序中的每个语句都已经检验过了,即达到了语句覆盖这种测试方法就是通常即达到了语句覆盖这种测试方法就是通常所说的所说的基本路径测试方法基本路径测试方法n n基本路径测试方法是在控制流图的基础上,基本路径测试方法是在控制流图的基础上,通过分析控制结构的环形复杂度,导出执通过分析控制结构的环形复杂度,导出执行路径的基本集,再从该基本集设计测试行路径的基本集,再从该基本集设计测试用例。
用例测试方法包括以下测试方法包括以下4 4个步骤:个步骤:((((1 1 1 1)画出程序的控制流图画出程序的控制流图画出程序的控制流图画出程序的控制流图2 2 2 2)计算程序的环形复杂度,导出程序基本)计算程序的环形复杂度,导出程序基本)计算程序的环形复杂度,导出程序基本)计算程序的环形复杂度,导出程序基本路径集中的独立路径条数,这是确定程序中每路径集中的独立路径条数,这是确定程序中每路径集中的独立路径条数,这是确定程序中每路径集中的独立路径条数,这是确定程序中每个可执行语句至少执行一次所必须的测试用例个可执行语句至少执行一次所必须的测试用例个可执行语句至少执行一次所必须的测试用例个可执行语句至少执行一次所必须的测试用例数目的上界数目的上界数目的上界数目的上界3 3 3 3)导出基本路径集,确定程序的独立路径导出基本路径集,确定程序的独立路径导出基本路径集,确定程序的独立路径导出基本路径集,确定程序的独立路径4 4 4 4)根据()根据()根据()根据(3 3 3 3)中的独立路径,设计测试用例)中的独立路径,设计测试用例)中的独立路径,设计测试用例)中的独立路径,设计测试用例的输入数据和预期输出。
的输入数据和预期输出的输入数据和预期输出的输入数据和预期输出 计算流图的环形复杂度:计算流图的环形复杂度:计算流图的环形复杂度:计算流图的环形复杂度: 有了描绘程序控制流的流图之后,可以用下有了描绘程序控制流的流图之后,可以用下有了描绘程序控制流的流图之后,可以用下有了描绘程序控制流的流图之后,可以用下述三种方法之一来计算环形复杂度述三种方法之一来计算环形复杂度述三种方法之一来计算环形复杂度述三种方法之一来计算环形复杂度 ((((1 1 1 1)流图中的区域数等于环形复杂度流图中的区域数等于环形复杂度流图中的区域数等于环形复杂度流图中的区域数等于环形复杂度 ((((2 2 2 2)流图)流图)流图)流图G G G G的环形复杂度的环形复杂度的环形复杂度的环形复杂度V(G)V(G)V(G)V(G)====E-N+2E-N+2E-N+2E-N+2,其,其,其,其中中中中E E E E是流图中边的条数,是流图中边的条数,是流图中边的条数,是流图中边的条数,N N N N是流图中节点数是流图中节点数是流图中节点数。
是流图中节点数 ((((3 3 3 3)流图)流图)流图)流图G G G G的环形复杂度的环形复杂度的环形复杂度的环形复杂度V(G)V(G)V(G)V(G)====P+1P+1P+1P+1,,,,其中其中其中其中P P P P是流图中判定节点的数目是流图中判定节点的数目是流图中判定节点的数目是流图中判定节点的数目10101111121213131 12 23 34 45 56 67 78 89 9void Sort ( int a, int b )void Sort ( int a, int b )void Sort ( int a, int b )void Sort ( int a, int b ) { { { { int x=0; int x=0; int x=0; int x=0; int y=0; int y=0; int y=0; int y=0; while ( a-1> 0 ) while ( a-1> 0 ) while ( a-1> 0 ) while ( a-1> 0 ) { { { { if ( b==0 ) if ( b==0 ) if ( b==0 ) if ( b==0 ) x=y+2; x=y+2; x=y+2; x=y+2; else if ( b==1 ) else if ( b==1 ) else if ( b==1 ) else if ( b==1 ) x=y+10; x=y+10; x=y+10; x=y+10; else else else else x=y+20; x=y+20; x=y+20; x=y+20; } } } } } } } } a-1>0a-1>0b=0b=0x=y+2x=y+2b=1b=1x=y+10x=y+10x=y+20x=y+20函数结束函数结束函数结束函数结束画出控制流图:画出控制流图: 1 17 76 65 54 43 32 28计算环形复杂度:计算环形复杂度: 10 10(条边)(条边)- 8- 8(个节点)(个节点)+ 2 = 4+ 2 = 4 3( 3(判定节点数判定节点数) + 1 = 4 ) + 1 = 4 导出独立路径:导出独立路径: 路径路径1 1::1→81→8 路径路径2 2::1→2→3→11→2→3→1 路径路径3 3::1→2→4→5→7→11→2→4→5→7→1 路径路径4 4::1→2→4→6→7→11→2→4→6→7→1习题习题1 1、使用基本路径测试方法,为以下程序段设、使用基本路径测试方法,为以下程序段设计测试用例。
计测试用例 void Do (int X,int A,int B) void Do (int X,int A,int B) { { if ( (A>1)&&(B=0) ) if ( (A>1)&&(B=0) ) X = X/A; X = X/A; if ( (A=2)||(X>1) ) if ( (A=2)||(X>1) ) X = X+1; X = X+1; } } n n3、、循环测试方法循环测试方法((1)循环测试的基本方法)循环测试的基本方法n n从本质上说,循环测试的目的就是检查循环从本质上说,循环测试的目的就是检查循环从本质上说,循环测试的目的就是检查循环从本质上说,循环测试的目的就是检查循环结构的有效性结构的有效性结构的有效性结构的有效性n n通常,循环可以划分为通常,循环可以划分为通常,循环可以划分为通常,循环可以划分为简单循环简单循环简单循环简单循环、、、、嵌套循环嵌套循环嵌套循环嵌套循环、、、、串接循环串接循环串接循环串接循环和和和和 非结构循环非结构循环非结构循环非结构循环4 4类。
类简单循环简单循环简单循环简单循环 嵌套循环嵌套循环嵌套循环嵌套循环 串接循环串接循环串接循环串接循环 非结构循环非结构循环非结构循环非结构循环①① 测试简单循环测试简单循环 设其循环的最大次数为设其循环的最大次数为设其循环的最大次数为设其循环的最大次数为n n,可采用以下测,可采用以下测,可采用以下测,可采用以下测试集:试集:试集:试集:Ø 跳过整个循环;跳过整个循环;跳过整个循环;跳过整个循环;Ø 只循环一次;只循环一次;只循环一次;只循环一次;Ø 只循环两次;只循环两次;只循环两次;只循环两次;Ø 循环循环循环循环 m m 次,其中次,其中次,其中次,其中m 的测试次数会随嵌套层数成几何级数增加的测试次数会随嵌套层数成几何级数增加的测试次数会随嵌套层数成几何级数增加 此时可此时可此时可此时可采用以下办法减少测试次数:采用以下办法减少测试次数:采用以下办法减少测试次数:采用以下办法减少测试次数:Ø 测试从最内层循环开始,所有外层循环次数测试从最内层循环开始,所有外层循环次数测试从最内层循环开始,所有外层循环次数测试从最内层循环开始,所有外层循环次数 设置为最小值;设置为最小值;设置为最小值;设置为最小值;ØØ 对最内层循环按照简单循环的测试方法进行;对最内层循环按照简单循环的测试方法进行;对最内层循环按照简单循环的测试方法进行;对最内层循环按照简单循环的测试方法进行;ØØ 由内向外进行下一个循环的测试,本层循环由内向外进行下一个循环的测试,本层循环由内向外进行下一个循环的测试,本层循环由内向外进行下一个循环的测试,本层循环 嵌套的循环取某些嵌套的循环取某些嵌套的循环取某些嵌套的循环取某些“ “典型典型典型典型” ”值;值;值;值;ØØ 重复上一步的过程,直到测试完所有循环重复上一步的过程,直到测试完所有循环。 重复上一步的过程,直到测试完所有循环重复上一步的过程,直到测试完所有循环 ③③ 测试串接循环测试串接循环 若串接的各个循环相互独立,则可分别采用简若串接的各个循环相互独立,则可分别采用简若串接的各个循环相互独立,则可分别采用简若串接的各个循环相互独立,则可分别采用简单循环的测试方法;否则采用嵌套循环的测试方单循环的测试方法;否则采用嵌套循环的测试方单循环的测试方法;否则采用嵌套循环的测试方单循环的测试方法;否则采用嵌套循环的测试方法 ④④ 非结构循环非结构循环 对于非结构循环这种情况,无法进行测试,对于非结构循环这种情况,无法进行测试,对于非结构循环这种情况,无法进行测试,对于非结构循环这种情况,无法进行测试,需要按结构化程序设计的思想将程序结构化后,需要按结构化程序设计的思想将程序结构化后,需要按结构化程序设计的思想将程序结构化后,需要按结构化程序设计的思想将程序结构化后,再进行测试再进行测试再进行测试再进行测试 ((2))Z路径覆盖下的循环测试策略路径覆盖下的循环测试策略n nZ Z路径覆盖路径覆盖路径覆盖路径覆盖是路径覆盖的一种变体,它是将程是路径覆盖的一种变体,它是将程是路径覆盖的一种变体,它是将程是路径覆盖的一种变体,它是将程序中的循环结构简化为选择结构的一种路径序中的循环结构简化为选择结构的一种路径序中的循环结构简化为选择结构的一种路径序中的循环结构简化为选择结构的一种路径覆盖。 覆盖n n循环简化的目的是限制循环的次数,无论循循环简化的目的是限制循环的次数,无论循循环简化的目的是限制循环的次数,无论循循环简化的目的是限制循环的次数,无论循环的形式和循环体实际执行的次数,简化后环的形式和循环体实际执行的次数,简化后环的形式和循环体实际执行的次数,简化后环的形式和循环体实际执行的次数,简化后的循环测试只考虑执行循环体一次和零次的循环测试只考虑执行循环体一次和零次的循环测试只考虑执行循环体一次和零次的循环测试只考虑执行循环体一次和零次(不执行)两种情况,即考虑执行时进入循(不执行)两种情况,即考虑执行时进入循(不执行)两种情况,即考虑执行时进入循(不执行)两种情况,即考虑执行时进入循环体一次和跳过循环体这两种情况环体一次和跳过循环体这两种情况环体一次和跳过循环体这两种情况环体一次和跳过循环体这两种情况n n4、产生测试用例、产生测试用例在实践中,除了前面给出的各种方法外,通在实践中,除了前面给出的各种方法外,通常还可以采用以下三种方法来补充设计测试常还可以采用以下三种方法来补充设计测试用例:用例: n n((((1 1)通过非路经分析得到测试用例)通过非路经分析得到测试用例)通过非路经分析得到测试用例)通过非路经分析得到测试用例 n n((((2 2)寻找尚未测试过的路径并生成相应的测)寻找尚未测试过的路径并生成相应的测)寻找尚未测试过的路径并生成相应的测)寻找尚未测试过的路径并生成相应的测试用例试用例试用例试用例 n n((((3 3)通过指定特定路径并生成相应的测试用)通过指定特定路径并生成相应的测试用)通过指定特定路径并生成相应的测试用)通过指定特定路径并生成相应的测试用例例例例测试用例设计测试用例设计n测试用例概念测试用例概念对一项特定的软件产品进行测试任务的描述,对一项特定的软件产品进行测试任务的描述,体现测试方案、方法、技术和策略。 体现测试方案、方法、技术和策略包括测试环境、测试步骤、测试数据和预期包括测试环境、测试步骤、测试数据和预期结果结果n n简单测试用例几个重要的组成部分简单测试用例几个重要的组成部分简单测试用例几个重要的组成部分简单测试用例几个重要的组成部分简明扼要的标题简明扼要的标题简明扼要的标题简明扼要的标题详细的步骤详细的步骤详细的步骤详细的步骤正确的预期结果正确的预期结果正确的预期结果正确的预期结果测试用例例子:测试用例例子:测试记事本能否编辑中英文混合输入的内容测试记事本能否编辑中英文混合输入的内容测试用例:测试用例:测试用例:测试用例:验证记事本程序可以编辑中英文混合验证记事本程序可以编辑中英文混合验证记事本程序可以编辑中英文混合验证记事本程序可以编辑中英文混合的内容的内容的内容的内容测试步骤:测试步骤:测试步骤:测试步骤:1 1、运行记事本程序、运行记事本程序、运行记事本程序、运行记事本程序2 2、切换到中文输入法,输入中文、切换到中文输入法,输入中文、切换到中文输入法,输入中文、切换到中文输入法,输入中文“ “学习编写学习编写学习编写学习编写” ”3 3、切换到英文输入法,输入英文、切换到英文输入法,输入英文、切换到英文输入法,输入英文、切换到英文输入法,输入英文TestCaseTestCase4 4、保存文件,文件名为、保存文件,文件名为、保存文件,文件名为、保存文件,文件名为testcase.txttestcase.txt5 5、关闭记事本程序、关闭记事本程序、关闭记事本程序、关闭记事本程序6 6、双击、双击、双击、双击testcase.txttestcase.txt以打开文件以打开文件以打开文件以打开文件预期结果:预期结果:预期结果:预期结果:文件的内容是文件的内容是文件的内容是文件的内容是“ “学习编写学习编写学习编写学习编写TestCase”TestCase”编写测试用例容易出现的问题:编写测试用例容易出现的问题:((1)含混不清或者与内容不相符的标题)含混不清或者与内容不相符的标题((2)过于简单的步骤)过于简单的步骤((3)没有写明预期结果)没有写明预期结果((4)多个用例混在一个用例中)多个用例混在一个用例中练习:练习: 给出一个完整的测试用例来测试给出一个完整的测试用例来测试聊天软件聊天软件的聊天模块。 主要测试的聊天模块主要测试能够发送中文消息能够发送中文消息!!测试用例:测试用例:测试用例:测试用例:验证验证验证验证能够发送中文消息能够发送中文消息能够发送中文消息能够发送中文消息测试步骤:测试步骤:测试步骤:测试步骤:1 1、在两台已安装、在两台已安装、在两台已安装、在两台已安装软件的计算机上分别登陆软件的计算机上分别登陆软件的计算机上分别登陆软件的计算机上分别登陆 号号号号A A和和和和B B2 2、、、、A A和和和和B B互相加为好友互相加为好友互相加为好友互相加为好友3 3、、、、A A打开一个对打开一个对打开一个对打开一个对B B的聊天窗口的聊天窗口的聊天窗口的聊天窗口4 4、、、、A A输入一句中文:输入一句中文:输入一句中文:输入一句中文:“ “你好,现在忙吗?你好,现在忙吗?你好,现在忙吗?你好,现在忙吗?” ”5 5、、、、A A点击发送点击发送点击发送点击发送预期结果:预期结果:预期结果:预期结果:B B接收到接收到接收到接收到A A发送过来的消息:发送过来的消息:发送过来的消息:发送过来的消息:“ “你好,现在忙吗?你好,现在忙吗?你好,现在忙吗?你好,现在忙吗?” ”,消息显示正确,消息显示正确,消息显示正确,消息显示正确应从哪些方面进行测试?应从哪些方面进行测试?q测试环境测试环境n软件运行平台软件运行平台n测试环境测试环境=软件软件+硬件硬件+网络网络q硬件:各种终端硬件:各种终端q软件:操作系统软件:操作系统q网络:针对网络:针对C/S和和B/S结构软件结构软件注意:搭建测试环境要真实、干净、无毒、独立注意:搭建测试环境要真实、干净、无毒、独立q测试需要支撑平台测试需要支撑平台q为安全、系统考虑,测试用例应标明测试环境为安全、系统考虑,测试用例应标明测试环境n测试用例模板测试用例模板q常用的测试模板常用的测试模板nExcel模板模板nWord模板模板qExcel模板模板项目项目/软件:需要填写项目或软件的名称软件:需要填写项目或软件的名称程序版本:该软件目前的版本号程序版本:该软件目前的版本号测试环境:填写测试的硬件、软件和网络环境,如果是测试环境:填写测试的硬件、软件和网络环境,如果是B/S 结构的软件,可以分为浏览器端和服务器端结构的软件,可以分为浏览器端和服务器端编制人:编制人:编制时间:编制时间:功能模块:被测模块的名称功能模块:被测模块的名称功能特性:被测模块的主要功能功能特性:被测模块的主要功能测试目的:测试所期望达到的目标测试目的:测试所期望达到的目标预置条件:在测试该模块之前需要做哪些前期工作。 比如要预置条件:在测试该模块之前需要做哪些前期工作比如要测试登录模块之前,就必须先在后头数据库田间一个登录测试登录模块之前,就必须先在后头数据库田间一个登录用户,用户名:用户,用户名:user,密码:,密码:al参考信息:测试该模块需要参考的需求文档的具体章节,参考信息:测试该模块需要参考的需求文档的具体章节,如需求说明中关于如需求说明中关于“登录登录”的说明的说明特殊规程说明:相当于备注特殊规程说明:相当于备注用例编号:为每条用例唯一编号,一般为拼音缩写用例编号:为每条用例唯一编号,一般为拼音缩写+数字,数字,如如DL001表示登录模块的第一条用例表示登录模块的第一条用例测试步骤:操作描述测试步骤:操作描述输入数据:测试数据输入数据:测试数据期望结果:程序应该输出的结果期望结果:程序应该输出的结果测试结果:程序实际输出的结果测试结果:程序实际输出的结果注意:模板只是一个参考,根据实际工作可灵活更改注意:模板只是一个参考,根据实际工作可灵活更改4W问题问题n1、为什么要写用例、为什么要写用例n便于团队交流便于团队交流n便于重复测试便于重复测试n便于跟踪统计便于跟踪统计n便于用户自测便于用户自测n2、什么时候写用例、什么时候写用例n没有统一的标准答案,但是应该尽早进行没有统一的标准答案,但是应该尽早进行n3、由谁来写测试用例、由谁来写测试用例n测试设计人员测试设计人员n4、根据什么写用例、根据什么写用例n用户需求用户需求——《系统需求规格说明书》《系统需求规格说明书》如何提交一个如何提交一个bug??????一个规范的一个规范的bug报告应当包括的内容如下:报告应当包括的内容如下: ((((1 1)清晰明确地重现步骤)清晰明确地重现步骤)清晰明确地重现步骤)清晰明确地重现步骤 ((((2 2)要有预期结果和实际结果的对比)要有预期结果和实际结果的对比)要有预期结果和实际结果的对比)要有预期结果和实际结果的对比 ((((3 3)级别定义)级别定义)级别定义)级别定义 ((((4 4)如果有可能,可以做一个可能的原因分析)如果有可能,可以做一个可能的原因分析)如果有可能,可以做一个可能的原因分析)如果有可能,可以做一个可能的原因分析 ((((5 5)如果是界面方面的)如果是界面方面的)如果是界面方面的)如果是界面方面的bugbug,尽量附图,图片,尽量附图,图片,尽量附图,图片,尽量附图,图片 更有说服力更有说服力更有说服力更有说服力 ((((6 6)其他信息,如版本号,测试工程师名字等)其他信息,如版本号,测试工程师名字等)其他信息,如版本号,测试工程师名字等)其他信息,如版本号,测试工程师名字等例子:例子: 假设有这样一个假设有这样一个bug:在一款计算机软:在一款计算机软件中,做了乘法后把结果清零,然后接着件中,做了乘法后把结果清零,然后接着做加法,乘法的积累加到了加法的和中,做加法,乘法的积累加到了加法的和中,清零的功能没有实现。 下面规范的描述一清零的功能没有实现下面规范的描述一下这个下这个bugBugBugBugBug::::虽然已经对乘积做了清零,但是乘法后做虽然已经对乘积做了清零,但是乘法后做虽然已经对乘积做了清零,但是乘法后做虽然已经对乘积做了清零,但是乘法后做的加法出错的加法出错的加法出错的加法出错软件:软件:软件:软件:神算盘计算器神算盘计算器神算盘计算器神算盘计算器版本号:版本号:版本号:版本号:1.0.0.11.0.0.1操作系统操作系统操作系统操作系统::::XPsp2XPsp2级别:级别:级别:级别:1 1(很严重)(很严重)(很严重)(很严重)测试工程师:测试工程师:测试工程师:测试工程师:张三丰张三丰张三丰张三丰重现步骤:重现步骤:重现步骤:重现步骤:1. 1. 运行神算盘计算器软件运行神算盘计算器软件运行神算盘计算器软件运行神算盘计算器软件2. 2. 做一个任意的乘法,例如做一个任意的乘法,例如做一个任意的乘法,例如做一个任意的乘法,例如2 2乘以乘以乘以乘以3 3,计算出,计算出,计算出,计算出积为积为积为积为6 63. 3. 点击点击点击点击“ “清零清零清零清零” ”界面显示为。 界面显示为界面显示为界面显示为0 0,这是正确的,这是正确的,这是正确的,这是正确的4. 4. 做一个任意的加法,例如做一个任意的加法,例如做一个任意的加法,例如做一个任意的加法,例如2 2加上加上加上加上3 3预期结果:预期结果:预期结果:预期结果:1. 1. 和应当为和应当为和应当为和应当为5 5发现的问题(实际结果):发现的问题(实际结果):发现的问题(实际结果):发现的问题(实际结果):1. 1. 和为和为和为和为1111原因分析:原因分析:原因分析:原因分析:1. 1. 可能是因为点击可能是因为点击可能是因为点击可能是因为点击“ “清零清零清零清零” ”后,虽然界面显示后,虽然界面显示后,虽然界面显示后,虽然界面显示为为为为0 0,但程序内部没有做相应的操作,导致乘,但程序内部没有做相应的操作,导致乘,但程序内部没有做相应的操作,导致乘,但程序内部没有做相应的操作,导致乘法的积影响了后面的加法运算法的积影响了后面的加法运算法的积影响了后面的加法运算法的积影响了后面的加法运算n练习练习q有一个软件产品有一个软件产品<学生管理系统学生管理系统>,模块是成模块是成绩统计绩统计q在对学生成绩进行统计时在对学生成绩进行统计时, 输入大于输入大于100分的分的成绩(有的试卷是成绩(有的试卷是120分或分或150分制),弹出分制),弹出系统提示系统提示“成绩只能在成绩只能在0~100分之间,请重新分之间,请重新输入!输入!”q根据上面的描述写一个根据上面的描述写一个Bug提交报告提交报告项目名称:项目名称:学生管理系统模块名称:模块名称:成绩统计标题(概要):标题(概要):无法输入大于100分的成绩优先级:优先级:1严重级别:严重级别:1类别:类别:逻辑错误产品版本:产品版本:1.0里程碑:里程碑:第一阶段(M1)重现步骤:重现步骤:1、进入学生管理系统;2、进入成绩统计界面;3、点击“新增学生成绩”;4、输入“赵建国、英语、110”,因为有的试卷是120分制或150分制;5、点击“确定”问题:问题:1、出现一个系统提示框:“成绩只能在在0~1000~100分之间,请重新输入!分之间,请重新输入!”,这个限制是不正确的。 预期结果:预期结果:添加成功原因分析:原因分析:限制条件设置不正确,没有考虑到一些特殊的考试分数习题:习题:根据下图给出的程序流程图,完成以下根据下图给出的程序流程图,完成以下要求:要求:((1 1)画出相应的控制流图画出相应的控制流图2 2)计算环形复杂度计算环形复杂度3 3)给出相应的矩阵图给出相应的矩阵图4 4)找出程序的独立路径集合找出程序的独立路径集合 开始开始开始开始i i====1 1,,,,j j====0 0,,,,k k====0 0,,,,mm====0 0输入学生人数输入学生人数输入学生人数输入学生人数N Ni≤Ni≤N????输出输出输出输出“ “奖奖奖奖100100元比例元比例元比例元比例:”,:”,j/N*100,“j/N*100,“%%%%” ”输出输出输出输出“ “奖奖奖奖5050元比例元比例元比例元比例:”,:”,k/N*100,“k/N*100,“%%%%” ”输出输出输出输出“ “奖奖奖奖2020元比例元比例元比例元比例:”,:”,m/N*100,“m/N*100,“%%%%” ”输入名单、成绩输入名单、成绩输入名单、成绩输入名单、成绩成绩成绩成绩成绩>90?>90?j++,i++j++,i++输出名单输出名单输出名单输出名单成绩成绩成绩成绩奖励奖励奖励奖励100100元元元元结束结束结束结束成绩成绩成绩成绩>80?>80?k++,i++k++,i++输出名单输出名单输出名单输出名单成绩成绩成绩成绩奖励奖励奖励奖励5050元元元元成绩成绩成绩成绩>60?>60?m++,i++m++,i++输出名单输出名单输出名单输出名单成绩成绩成绩成绩奖励奖励奖励奖励2020元元元元i++i++N NN NY YY YY YY YN NN N习题:习题:根据下图给出的源程序,完成以下要求:根据下图给出的源程序,完成以下要求:((1 1)请给出语句覆盖的测试用例。 请给出语句覆盖的测试用例2 2)请给出判定覆盖的测试用例请给出判定覆盖的测试用例 ((3 3)请给出条件覆盖的测试用例请给出条件覆盖的测试用例 ((4 4)请给出判定)请给出判定/ /条件覆盖的测试用例条件覆盖的测试用例5 5)请给出组合覆盖的测试用例请给出组合覆盖的测试用例6 6)请给出路径覆盖的测试用例请给出路径覆盖的测试用例void DoWork (int x,int y,int z)void DoWork (int x,int y,int z)void DoWork (int x,int y,int z)void DoWork (int x,int y,int z){ { { { int k=0,j=0; int k=0,j=0; int k=0,j=0; int k=0,j=0; if ( (x>3)&&(z<10) ) if ( (x>3)&&(z<10) ) if ( (x>3)&&(z<10) ) if ( (x>3)&&(z<10) ) { { { { k=x*y-1; k=x*y-1; k=x*y-1; k=x*y-1; j=sqrt(k); j=sqrt(k); j=sqrt(k); j=sqrt(k); } } } } // // // //语句块语句块语句块语句块1 1 1 1 if ( (x==4)||(y>5) ) if ( (x==4)||(y>5) ) if ( (x==4)||(y>5) ) if ( (x==4)||(y>5) ) { j=x*y+10; } { j=x*y+10; } { j=x*y+10; } { j=x*y+10; } ////////语句块语句块语句块语句块2 2 2 2 j=j%3; j=j%3; j=j%3; j=j%3; ////////语句块语句块语句块语句块3 3 3 3} } } } 语句覆盖:语句覆盖: 要实现要实现DoWork函数的语句覆盖,只需设函数的语句覆盖,只需设计一个测试用例就可以覆盖程序中的所有可执计一个测试用例就可以覆盖程序中的所有可执行语句。 行语句 测试用例输入为:测试用例输入为:{ x=4、、y=5、、z=5 } 语句覆盖可以保证程序中的每个语句都得语句覆盖可以保证程序中的每个语句都得到执行,但发现不了判定中逻辑运算的错误,到执行,但发现不了判定中逻辑运算的错误,即它并不是一种充分的检验方法例如在第一即它并不是一种充分的检验方法例如在第一个判定个判定((x>3)&&(z<10))((x>3)&&(z<10))中把中把“&&”“&&”错误的写成错误的写成了了“||”“||”,这时仍使用该测试用例,则程序仍,这时仍使用该测试用例,则程序仍会按照流程图上的路径会按照流程图上的路径abdabd执行可以说语句覆执行可以说语句覆盖是最弱的逻辑覆盖准则盖是最弱的逻辑覆盖准则 要实现要实现DoWorkDoWork函数的判定覆盖,需要设计函数的判定覆盖,需要设计两个测试用例两个测试用例 测试用例的输入为:测试用例的输入为:{x=4{x=4、、y=5y=5、、z=5}z=5};;{x=2{x=2、、y=5y=5、、z=5} z=5} 判定覆盖判定覆盖 :: 上述两个测试用例不仅满足了判定覆盖,同上述两个测试用例不仅满足了判定覆盖,同时还做到语句覆盖。 从这点看似乎判定覆盖比语时还做到语句覆盖从这点看似乎判定覆盖比语句覆盖更强一些,但仍然无法确定判定内部条件句覆盖更强一些,但仍然无法确定判定内部条件的错误例如把第二个判定中的条件的错误例如把第二个判定中的条件y>5y>5错误写为错误写为y<5y<5,使用上述测试用例,照样能按原路径执行而,使用上述测试用例,照样能按原路径执行而不影响结果因此,需要有更强的逻辑覆盖准则不影响结果因此,需要有更强的逻辑覆盖准则去检验判定内的条件去检验判定内的条件 条件覆盖:条件覆盖: 对对DoWorkDoWork函数的各个判定的各种条件取值加函数的各个判定的各种条件取值加以标记对于第一个判定对于第一个判定( (x>3)&&(z<10) )( (x>3)&&(z<10) ):: 条件条件x>3 x>3 取真值记为取真值记为T1T1,取假值,取假值记为记为-T1-T1 条件条件z<10 z<10 取真值记为取真值记为T2T2,取假值记为,取假值记为-T2-T2对于第二个判定对于第二个判定( (x==4)||(y>5) )( (x==4)||(y>5) ):: 条件条件x==4 x==4 取真值记为取真值记为T3T3,取假值记为,取假值记为-T3 -T3 条件条件y>5 y>5 取真值记为取真值记为T4T4,取假值,取假值记为记为-T4 -T4 说明:虽然前面的一组测试用例同时达到了条件说明:虽然前面的一组测试用例同时达到了条件覆盖和判定覆盖,但是,并不是说满足条件覆盖覆盖和判定覆盖,但是,并不是说满足条件覆盖就一定能满足判定覆盖。 如果设计了下表中的这就一定能满足判定覆盖如果设计了下表中的这组测试用例,则虽然满足了条件覆盖,但只是覆组测试用例,则虽然满足了条件覆盖,但只是覆盖了程序中第一个判定的取假分支盖了程序中第一个判定的取假分支c c 和第二个判和第二个判定的取真分支定的取真分支d d,不满足判定覆盖的要求不满足判定覆盖的要求 判定判定/ /条件覆盖:条件覆盖: 根据判定根据判定/ /条件覆盖的基本思想,只需设计条件覆盖的基本思想,只需设计两个测试用例便可以覆盖两个测试用例便可以覆盖4 4个条件的个条件的8 8种取值以及种取值以及4 4个判定分支个判定分支 分析:从表面上看,判定分析:从表面上看,判定/ /条件覆盖测试了各个条件覆盖测试了各个判定中的所有条件的取值,但实际上,编译器判定中的所有条件的取值,但实际上,编译器在检查含有多个条件的逻辑表达式时,某些情在检查含有多个条件的逻辑表达式时,某些情况下的某些条件将会被其它条件所掩盖因此,况下的某些条件将会被其它条件所掩盖因此,判定判定/ /条件覆盖也不一定能够完全检查出逻辑表条件覆盖也不一定能够完全检查出逻辑表达式中的错误达式中的错误。 例如:对于第一个判定例如:对于第一个判定(x>3)&&(z<10)(x>3)&&(z<10)来说,必来说,必须须x>3x>3和和z<10z<10这两个条件同时满足才能确定该判这两个条件同时满足才能确定该判定为真如果定为真如果x>3x>3为假,则编译器将不再检查为假,则编译器将不再检查z<10z<10这个条件,那么即使这个条件有错也无法这个条件,那么即使这个条件有错也无法被发现对于第二个判定被发现对于第二个判定(x==4)||(y>5)(x==4)||(y>5)来说,来说,若条件若条件x==4x==4满足,就认为该判定为真,这时将满足,就认为该判定为真,这时将不会再检查不会再检查y>5y>5,那么同样也无法发现这个条件,那么同样也无法发现这个条件中的错误中的错误 组合覆盖:组合覆盖: 对对DoWorkDoWork函数中的各个判定的条件取值组函数中的各个判定的条件取值组合加以标记:合加以标记: 1 1、、x>3, z<10 x>3, z<10 记做记做T1 T2T1 T2,第,第一个判定的取真分支一个判定的取真分支 2 2、、x>3, z>=10 x>3, z>=10 记做记做T1 -T2T1 -T2,第一,第一个判定的取假分支个判定的取假分支 3 3、、x<=3, z<10 x<=3, z<10 记做记做-T1 T2-T1 T2,,第一个判定的取假分支第一个判定的取假分支 4 4、、x<=3, z>=10 x<=3, z>=10 记做记做-T1 -T2-T1 -T2,第一个判,第一个判定的取假分支定的取假分支 5 5、、x==4, y>5 x==4, y>5 记做记做T3 T4T3 T4,第,第二个判定的取真分支二个判定的取真分支 6 6、、x==4, y<=5 x==4, y<=5 记做记做T3 -T4T3 -T4,第二,第二个判定的取真分支个判定的取真分支 7 7、、x!=4, y>5 x!=4, y>5 记做记做-T3 T4-T3 T4,第二个判定的取真分支,第二个判定的取真分支 8 8、、x!=4, y<=5 x!=4, y<=5 记做记做-T3 -T4-T3 -T4,,第二个判定的取假分支第二个判定的取假分支 路径覆盖:路径覆盖: 对于比较简单的小程序,实现路径覆盖是对于比较简单的小程序,实现路径覆盖是可能做到的。 但如果程序中出现较多判断和较可能做到的但如果程序中出现较多判断和较多循环,可能的路径数目将会急剧增长,要在多循环,可能的路径数目将会急剧增长,要在测试中覆盖所有的路径是无法实现的为了解测试中覆盖所有的路径是无法实现的为了解决这个难题,只有把覆盖路径数量压缩到一定决这个难题,只有把覆盖路径数量压缩到一定的限度内,如程序中的循环体只执行一次的限度内,如程序中的循环体只执行一次 在实际测试中,即使对于路径数很有限的在实际测试中,即使对于路径数很有限的程序已经做到路径覆盖,仍然不能保证被测试程序已经做到路径覆盖,仍然不能保证被测试程序的正确性,还需要采用其它测试方法进行程序的正确性,还需要采用其它测试方法进行补充。












