1、软件测试的目标与原则软件测试的目标与原则Myers在其软件测试著作中对软件测试的目标提在其软件测试著作中对软件测试的目标提出以下观点:出以下观点:软件测试是为了发现错误而运行程序的过程;软件测试是为了发现错误而运行程序的过程;一个好的测试用例能够发现至今尚未发现的一个好的测试用例能够发现至今尚未发现的 错误;错误;一个成功的测试是发现了至今尚未发现的错一个成功的测试是发现了至今尚未发现的错 误的测试。误的测试。软件测试的步骤软件测试的步骤q 在本书中,从软件工程的角度:在本书中,从软件工程的角度:将单元测试与详细设计对应起来,即在详细设计阶段就应将单元测试与详细设计对应起来,即在详细设计阶段就
2、应制定出单元测试计划;制定出单元测试计划;而集成测试又称为综合测试,可以把概要设计和集成测试而集成测试又称为综合测试,可以把概要设计和集成测试对应起来,在概要设计阶段就可以制定集成测试计划;对应起来,在概要设计阶段就可以制定集成测试计划;将功能测试、性能(行为)测试、验收测试统称为验收测将功能测试、性能(行为)测试、验收测试统称为验收测试(也称确认测试),与软件系统需求分析阶段对应起来,试(也称确认测试),与软件系统需求分析阶段对应起来,在需求分析阶段就应制定出验收准则和验收测试计划,验在需求分析阶段就应制定出验收准则和验收测试计划,验收测试应提交经用户确认的软件产品;收测试应提交经用户确认的
3、软件产品;最后,将软件、硬件等要素构成一个完整的基于计算机的最后,将软件、硬件等要素构成一个完整的基于计算机的系统,再进行系统测试,使系统测试与系统定义相对应,系统,再进行系统测试,使系统测试与系统定义相对应,即在系统定义阶段就应制定系统测试计划。即在系统定义阶段就应制定系统测试计划。软件测试的步骤软件测试的步骤测试步骤测试步骤部件部件代码代码部件部件代码代码单元测试单元测试单元测试单元测试单元测试单元测试部件部件代码代码集成测试集成测试功能测试功能测试性能测试性能测试验收测试验收测试安装测试安装测试设计设计规格说明规格说明系统系统功能需求功能需求其他其他软件需求软件需求用户需求用户需求规格说
4、明规格说明用户用户环境环境集成后集成后的模块的模块功能功能系统系统验证,验证,生效的生效的软件软件被接受被接受的系统的系统在使用中的系统在使用中的系统测试后测试后的模块的模块软件测试的步骤软件测试的步骤软件工程的开发与测试的关系软件工程的开发与测试的关系系统工程系统工程需求分析需求分析概要设计概要设计设计、编码设计、编码单元测试单元测试集成测试集成测试验收测试验收测试系统测试系统测试测试阶段的信息流测试阶段的信息流测试阶段的信息流测试阶段的信息流测试测试评价评价排错排错可靠性可靠性模型模型软件配置软件配置测试配置测试配置测试结果测试结果错误错误错误统计错误统计预期结果预期结果正确的程序正确的程
5、序可靠性预测可靠性预测14.1.3 测试阶段的信息流测试阶段的信息流q测试的输入流有软件配置和测试配置。测试的输入流有软件配置和测试配置。软件配置由需求规格说明、设计说明、源软件配置由需求规格说明、设计说明、源代码等组成;代码等组成;测试配置包括测试计划、测试用例(其中测试配置包括测试计划、测试用例(其中包括预期的结果)、测试工具等组成。包括预期的结果)、测试工具等组成。测试结果评价测试结果评价经常发现严重的错误并需要修改软件,经常发现严重的错误并需要修改软件,则软件的质量和可靠性一定不高,需要则软件的质量和可靠性一定不高,需要进一步测试;进一步测试;如果测试所发现的错误不多且易于改正,如果测
6、试所发现的错误不多且易于改正,软件功能看起来也较完善,则需考虑两软件功能看起来也较完善,则需考虑两种可能:种可能:1)软件质量和可靠性确实令人满意;)软件质量和可靠性确实令人满意;2)测试不全面,很可能还潜伏着严重错误;)测试不全面,很可能还潜伏着严重错误;如果测试过程没有发现任何错误,则很如果测试过程没有发现任何错误,则很有可能是测试配置不合理。有可能是测试配置不合理。软件测试中常见的错误类型软件测试中常见的错误类型按照错误的影响和造成的后果进行分类,按照错误的影响和造成的后果进行分类,可分为:较小错误,中等错误,较严重可分为:较小错误,中等错误,较严重错误,严重错误,非常严重的错误,最错误
7、,严重错误,非常严重的错误,最严重的错误。严重的错误。按照软件生存周期各个阶段分类,可分按照软件生存周期各个阶段分类,可分为:问题定义错误、需求分析规格说明为:问题定义错误、需求分析规格说明错误、设计错误、编码错误等等。错误、设计错误、编码错误等等。这里重点介绍一种按照错误的性质和范这里重点介绍一种按照错误的性质和范围进行分类的方法,可以将错误分为如围进行分类的方法,可以将错误分为如下几类:下几类:按照错误的性质和范围进行分类按照错误的性质和范围进行分类1功能错误功能错误 需求规格说明错误。主要是指其中有需求规格说明错误。主要是指其中有错误、多余或遗漏的功能,有二义性错误、多余或遗漏的功能,有
8、二义性或自相矛盾。或自相矛盾。设计实现错误。设计或实现的功能不设计实现错误。设计或实现的功能不是规格说明或用户所要求的功能。是规格说明或用户所要求的功能。按照错误的性质和范围进行分类按照错误的性质和范围进行分类2系统错误系统错误 外部接口错误。如与打印机的接口错误。外部接口错误。如与打印机的接口错误。内部接口错误。指各程序模块间的联系存在错内部接口错误。指各程序模块间的联系存在错误。如输入误。如输入/输出、数据保护、子程序访问等。输出、数据保护、子程序访问等。硬件结构错误。如错误地理解硬件结构错误。如错误地理解I/O指令、中断指令、中断处理、设备启动和初始化等而引起的错误。处理、设备启动和初始
9、化等而引起的错误。软件结构错误。由于软件结构不合理或不清晰软件结构错误。由于软件结构不合理或不清晰所引起的错误。往往在系统满载时才能发现。所引起的错误。往往在系统满载时才能发现。操作系统错误。该类错误是由于不了解操作系操作系统错误。该类错误是由于不了解操作系统而引起的,操作系统本身也有错误。统而引起的,操作系统本身也有错误。控制与顺序错误。包括事件的时间顺序不正确、控制与顺序错误。包括事件的时间顺序不正确、等待一个不可能发生的事件等等。等待一个不可能发生的事件等等。资源管理错误。既资源使用不当。资源死锁等。资源管理错误。既资源使用不当。资源死锁等。按照错误的性质和范围进行分类按照错误的性质和范
10、围进行分类3加工错误(算法错误)加工错误(算法错误)计算与操作错误。指计算、函数求值和一般计算与操作错误。指计算、函数求值和一般操作过程中的错误。操作过程中的错误。初始化错误。如忘记了初始化工作区、数据初始化错误。如忘记了初始化工作区、数据区,错误地对循环变量赋初值,不正确的初区,错误地对循环变量赋初值,不正确的初始化等等。始化等等。局部控制和次序错误。如遗漏路径、不可达局部控制和次序错误。如遗漏路径、不可达到的代码段、循环嵌套或终止条件不正确、到的代码段、循环嵌套或终止条件不正确、死循环等等。死循环等等。逻辑错误。如多分支、判断条件不正确等。逻辑错误。如多分支、判断条件不正确等。按照错误的性
11、质和范围进行分类按照错误的性质和范围进行分类4数据错误数据错误 动态数据错误。动态数据错误。静态数据错误。静态数据指直接或间接地出现静态数据错误。静态数据指直接或间接地出现在程序或数据库中的数据,其内容和格式都是在程序或数据库中的数据,其内容和格式都是固定的。因此在内容或格式上都可能存在错误。固定的。因此在内容或格式上都可能存在错误。数据内容错误。是指由于内容被破坏或被错误数据内容错误。是指由于内容被破坏或被错误地解释而造成的错误。地解释而造成的错误。数据结构错误。包括数据结构说明错误和数据数据结构错误。包括数据结构说明错误和数据结构使用错误。结构使用错误。数据属性错误。数据属性是指数据内容的
12、含义数据属性错误。数据属性是指数据内容的含义或语义,如整数、字符等。数据属性错误是指或语义,如整数、字符等。数据属性错误是指对数据属性的错误解释和错误使用而导致的错对数据属性的错误解释和错误使用而导致的错误。误。按照错误的性质和范围进行分类按照错误的性质和范围进行分类5代码错误代码错误 代码错误主要包括语法错误、键入错误、代码错误主要包括语法错误、键入错误、对语句的理解错误等。对语句的理解错误等。例如,例如,Myers(1976)指出,美国第一个)指出,美国第一个去金星的太空任务的失败是由于在一个去金星的太空任务的失败是由于在一个Fortran do循环中缺少一个逗号。循环中缺少一个逗号。软件
13、测试的常用方法软件测试的常用方法1静态测试静态测试静态测试是采用人工检测和计算机辅助静态分静态测试是采用人工检测和计算机辅助静态分析的方法对程序进行检测。析的方法对程序进行检测。人工检测是指靠人工走查程序或评审软件。这人工检测是指靠人工走查程序或评审软件。这种走查与评审主要针对编码的质量和软件开发种走查与评审主要针对编码的质量和软件开发各个阶段的文档,特别是总体设计和详细设计各个阶段的文档,特别是总体设计和详细设计阶段的错误。能发现阶段的错误。能发现30%70%的逻辑设计和的逻辑设计和编码错误。编码错误。计算机辅助静态分析是指利用静态分析软件工计算机辅助静态分析是指利用静态分析软件工具对程序进
14、行静态分析,主要检测变量是否用具对程序进行静态分析,主要检测变量是否用错、参数是否匹配、循环嵌套是否有错、是否错、参数是否匹配、循环嵌套是否有错、是否有死循环和永远执行不到的死代码等等。同时,有死循环和永远执行不到的死代码等等。同时,它还可对程序的特性进行分析。它还可对程序的特性进行分析。软件测试的常用方法软件测试的常用方法2动态测试动态测试 动态测试是指事先设计好一组测试用例,动态测试是指事先设计好一组测试用例,然后通过运行程序来发现错误。然后通过运行程序来发现错误。动态测试有两种测试方法:动态测试有两种测试方法:黑盒测试;黑盒测试;白盒测试。白盒测试。用黑盒法测试时,必须在所有可能的输入条
15、件和输出条件中确定测试数据。是否要对每个数据都进行穷举测试呢?例如测试一个程序,需输入 3 个整数值。微机上,每个整数可能取值有216个,3个整数值的排列组合数为216216216=24831014。假设此程序执行一次为1毫秒,用这些所有的数据去测试要用1万年!但这还不能算穷举测试,还要输入一切不合法的数据。可见,穷举地输入测试数据进行黑盒测试是不可能的。白盒测试又称为结构测试或逻辑驱动测试,此方法是将测试对象比作一个打开的盒子,它允许测试人员利用程序内部的逻辑结构和相关信息来设计或选择测试用例,对穿过软件的逻辑路径进行测试,可以在不同点检查程序的状态,以确定实际状态与预期状态是否一致。表面看
16、来,白盒测试是可以进行完全的测试的,从理论上讲也应该如此。只要能确定测试模块的所有逻辑路径,并为每一条逻辑路径设计测试用例,并评价所得到的结果,就可得到100%正确的程序。但实际测试中,这种穷举法是无法实现的,因为即使是很小的程序,也可能会出现数目惊人的逻辑路径。如图所示是一个小程序的流程图。循环小于等于20次 图中,一个圆圈代表一行源程序代码(或一个语句块)。其中有五条通路,左边曲线箭头表示执行次数不超过20次循环。这样的执行路径就有520个,近似为1014个可能的路径。如果1 ms完成一个测试,由此测试程序需3170年。由此看出,即使精确地实现了白盒测试,也不能断言测试过的程序全正确,因为
17、实行穷举测试,由于工作量过大,需用时间过长,实施起来是不现实的。这就是程序测试的经济学问题。既然在测试阶段穷举法测试是不可行的,那么为了节省时间和资源,提高测试效率,就必须精心设计测试用例。需从大量的可用测试用例中精选出少量的测试数据,使得采用这些测试数据能够达到最佳的测试效果,即能高效地、尽可能多地发现隐藏的错误。测试只能发现错误,并不能保证程序没有错误。测试用例测试用例为了进行有效的测试而设计的输入为了进行有效的测试而设计的输入数据和预期的输出结果数据。数据和预期的输出结果数据。测试用例设计的基本目的是确定一组最有可能发现某个错误或某类错误的测试数据。无论是黑盒测试(下节内容介绍),还是白
18、盒测试都不可能进行穷举测试,所以测试用例的设计只能在周期和经费允许的条件下,使用最少数目的测试用例,发现最大数目可能的错误。6种覆盖标准的对比语句覆盖 每条语句至少执行一次 判定覆盖 每个判定的每个分支至少执行一次 条件覆盖 每个判定的每个条件应取到各种可能的值 判定/条件覆盖 同时满足判定覆盖和条件覆盖 条件组合覆盖 每个判定中各条件的每一种组合至少出现一次 弱 发 现 错 误 能 力 强 路径覆盖 使程序中每一条可能的路径至少执行一次 语句覆盖发现错误能力最弱。判定覆盖包含了语句覆盖,但它可能会使一些条件得不到测试。条件覆盖对每一条件进行单独检查,一般情况下它的检错能力较判定覆盖强,但有时
19、达不到判定覆盖的要求。判定/条件覆盖包含了判定覆盖和条件覆盖的要求,但由于计算机系统软件实现方式的限制,实际上不一定达到条件覆盖的标准。条件组合覆盖发现错误能力较强,凡满足其标准的测试用例,也必然满足前4种覆盖标准。前5种覆盖标准把注意力集中在单个判定或判定的各个条件上,可能会使程序某些路径没有执行到。路径测试根据各判定表达式取值的组合,使程序沿着不同的路径执行,查错能力强。但由于它是从各判定的整体组合出发设计测试用例的,可能使测试用例达不到条件组合覆盖的要求。在实际的逻辑覆盖测试中,一般以条件组合覆盖为主设计测试用例,然后再补充部分用例,以达到路径覆盖测试标准。判定结构分析判定结构分析 当程
20、序中判定多于一个时,形成的分支结当程序中判定多于一个时,形成的分支结构可以分为两类:构可以分为两类:嵌套型分支结构嵌套型分支结构和和连锁连锁型分支结构型分支结构。对于嵌套型分支结构,若有对于嵌套型分支结构,若有 n 个判定语句,个判定语句,则存在则存在 n+1 条路径,需要条路径,需要 n+1 个测试用例;个测试用例;对于连锁型分支结构,对于连锁型分支结构,若有若有 n 个判定语句,个判定语句,则存在则存在2n 条路径,需要有条路径,需要有 2n 个测试用例,个测试用例,覆盖所有的路径。覆盖所有的路径。s1s2s3s4p1p2p3s1s2s3s4s5s6p1p2p3 对于连锁型分支结构,当对于
21、连锁型分支结构,当 n 较大时将无法较大时将无法测试。测试。为减少测试用例的数目,可采用试验设计为减少测试用例的数目,可采用试验设计法,抽取部分路径进行测试。法,抽取部分路径进行测试。由于抽样服从均匀分布,因此,在假定各由于抽样服从均匀分布,因此,在假定各条路径的重要性相同,或暂不明确各条路条路径的重要性相同,或暂不明确各条路径的重要性的情况下可以做到均匀抽样。径的重要性的情况下可以做到均匀抽样。如果明确了各条路径的重要性,还可以采如果明确了各条路径的重要性,还可以采取加权的办法,筛选掉部分路径,再用如取加权的办法,筛选掉部分路径,再用如下的措施进行抽样。下的措施进行抽样。设连锁型分支结构中有
22、设连锁型分支结构中有 n 个判定个判定,计算满,计算满足关系式足关系式 n+12m 的最小自然数的最小自然数m;设设t=2m,取正交表,取正交表Lt,并利用它设计测试,并利用它设计测试数据。数据。例如,一个连锁型分支结构中有三个判定例如,一个连锁型分支结构中有三个判定语句语句p1,p2,p3。全部路径是。全部路径是238 条。条。先计算先计算3+12m=t 的的 t,得,得 t=4。取正交。取正交表表L4,把每一列当做一个判定,每一行当,把每一列当做一个判定,每一行当做可取的测试用例,可得做可取的测试用例,可得4个测试用例。个测试用例。用各个判定的用各个判定的取假分支取假分支取代正交表取代正交
23、表L4中的中的“0”,用,用取真分支取真分支取代正交表中的取代正交表中的“1”,就建立起一个测试路径矩阵。这样,测试就建立起一个测试路径矩阵。这样,测试路径数目从路径数目从238条减少到条减少到314条。条。L40 0 01 0 10 1 11 1 01 2 31234用例用例s1 s3 s5s2 s3 s6s1 s4 s6s2 s4 s5p1 p2 p31234s1 s3 s5s2 s3 s6s1 s4 s6s2 s4 s5s1s3s5p1p2p3s2s3s6p1p2p3s1s4s6p1p2p3s2s4s5p1p2p3L201112L40 0 01 0 10 1 11 1 01 2 3123
24、4L80 0 0 0 0 0 01 0 1 0 1 0 10 1 1 0 0 1 11 1 0 0 1 1 00 0 0 1 1 1 11 0 1 1 0 1 00 1 1 1 1 0 01 1 0 1 0 0 11 2 3 4 5 6 712345678L22L4LL4循环覆盖在逻辑覆盖的测试技术中,以上只讨论了程序内部有判定存在的逻辑结构的测试用例设计技术。而循环也是程序的主要逻辑结构,要覆盖含有循环结构的所有路径是不可能的,但可通过限制循环次数来测试。fdcabe循环循环 i n Ai Ai+1 Ai+2 k 路路 径径 0 1 2 1 1 i a c 1 2 1 2 i a b e f
25、 c 2 1 i+1 a b d f c 1 3 1 2 3 i a b e f e f c 2 3 1 i+2 a b e f d f c 3 2 1 i+2 a b d f d f c 3 1 2 i+1 a b d f e f c d 改改改改 k k 的的的的值值值值,e e 不不不不改改改改 k k 的的的的值值值值 某工厂公开招工,规定报名者年龄应在某工厂公开招工,规定报名者年龄应在1635 周周岁之间(到岁之间(到1995年年6月月30日为止),即出生年月不早于日为止),即出生年月不早于1960年年7月,不晚于月,不晚于1979年年6月。月。报名程序具有自动检报名程序具有自动检验
26、输入数据的功能。如出生年月不在上述范围内,验输入数据的功能。如出生年月不在上述范围内,将将拒绝接受,并显示拒绝接受,并显示“年龄不合格年龄不合格”等出错信息。等出错信息。请试用等价分类法,请试用等价分类法,设计出生年月的等价分类表设计出生年月的等价分类表。二、请利用等价分类法为以下提供的内容设计测试用例二、请利用等价分类法为以下提供的内容设计测试用例 假定已知出生年月是由假定已知出生年月是由 6 位数字字符表示,前位数字字符表示,前4 位位代表年,后代表年,后2 位代表月,则可以划分为位代表月,则可以划分为 3 个有效等价类个有效等价类和和 7 个无效等价类。个无效等价类。1、划分出生年月等价
27、分类表、划分出生年月等价分类表输入数据输入数据有效等价类有效等价类无效等价类无效等价类出生年月出生年月 6位有效数字字符位有效数字字符 有非数字字符有非数字字符 少于少于6个数字字符个数字字符 多于多于6个数字字符个数字字符 对应数值对应数值 196007-197906 197906月份对应数值月份对应数值 在在1-12之间之间 等于等于“0”122、设计有效等价类需要的测试用例、设计有效等价类需要的测试用例输入数据输入数据有效等价类有效等价类无效等价类无效等价类出生年月出生年月 6位有效数字字位有效数字字符符 有非数字字符有非数字字符 少于少于6个数字字个数字字符符 多于多于6个数字个数字字
28、符字符 对应数值对应数值 196007-197906 197906月份对应数值月份对应数值 在在1-12之间之间 等于等于“0”12测试数据测试数据期望结果期望结果测试范围测试范围 197011输入有效、输入数据有效等价类无效等价类出生年月 6位有效数字字符 有非数字字符 少于6个数字字符多于6个数字字符 对应数值 月份对应数值 在1-12之间 等于“0”12测试数据测试数据期望结果期望结果测试范围测试范围 MAY,70输入无效输入无效 有非数字字符有非数字字符19705输入无效输入无效输入无效输入无效 少于少于6个数字字符个数字字符196801119600819551219620019722
29、2年龄不合格年龄不合格年龄不合格年龄不合格输入无效输入无效输入无效输入无效 多于多于6个数字字符个数字字符 197906 等于等于“0”123、为每一个无效等价类至少设计一个测试用例、为每一个无效等价类至少设计一个测试用例二、边界值分析法二、边界值分析法 采用边界值分析法来选择测试用例,可使采用边界值分析法来选择测试用例,可使 得被测程序能在边界值及其附近运行,从而更得被测程序能在边界值及其附近运行,从而更 有效地暴露程序中潜藏的错误。有效地暴露程序中潜藏的错误。人们从长期的测试工作经验得知,人们从长期的测试工作经验得知,大量的大量的错误是发生在输入或输出范围的边界上,错误是发生在输入或输出范
30、围的边界上,而不是在输入范围的内部而不是在输入范围的内部。因此针对各种因此针对各种边界情况设计测试用例,边界情况设计测试用例,可以查出更多的可以查出更多的错误错误。例如,有一段用例如,有一段用C编写的小程序:编写的小程序:int A20;int i;for(i=1;i=10;i+)Ai=-1;因为因为C语言中数组下标语言中数组下标从从 0 开始开始,而本程,而本程序中序中从从 1 开始开始赋值,如果以后用户不了赋值,如果以后用户不了解,可能从解,可能从 0 开始使用,就会出错。所开始使用,就会出错。所以边界值可能查出更多的问题来。以边界值可能查出更多的问题来。如何确定边界?通常的边界检查原则:
31、如何确定边界?通常的边界检查原则:a)类型:类型:数字、字符、位置、质量、大小、速度、数字、字符、位置、质量、大小、速度、方位、尺寸、空间等。方位、尺寸、空间等。b)边界值:边界值:最大最小、首位末位、上下、最大最小、首位末位、上下、最大最小、最快最慢、最高最低、最短最大最小、最快最慢、最高最低、最短最长、空满等。最长、空满等。使用边界值分析,最重要的是确定正确的使用边界值分析,最重要的是确定正确的边界值域。对于输入输出等价类,选取边界值域。对于输入输出等价类,选取正好等于正好等于、刚刚大于刚刚大于和和刚刚小于刚刚小于边界值的边界值的数据作为测试数据。数据作为测试数据。选取测试用例的原则:选取
32、测试用例的原则:(1)如果输入条件规定了值的范围,则应取刚如果输入条件规定了值的范围,则应取刚刚到达这个范围边界的值,以及刚刚超过刚到达这个范围边界的值,以及刚刚超过这个范围边界的值作为测试输入数据。这个范围边界的值作为测试输入数据。例如,某数据的取值范围为例如,某数据的取值范围为-1.01.0,测试数据可取测试数据可取-1.0、1.0,以及,以及-1.1、1.1。(2)如果输入条件规定了值的个数,则应取最大个如果输入条件规定了值的个数,则应取最大个数、最小个数、比最大个数多数、最小个数、比最大个数多1,比最小个数,比最小个数少少1的数作为测试输入数据。的数作为测试输入数据。例如,某文件有例如
33、,某文件有255个记录,测试数据可取个记录,测试数据可取1、255,以及,以及0、256。(3)根据规格说明和每个输出条件,使用原则根据规格说明和每个输出条件,使用原则(1)。例如,研究生录取分数范围例如,研究生录取分数范围84150,测试数,测试数据可取据可取84、150,以及,以及83、151。(4)根据规格说明和每个输出条件,使用原则根据规格说明和每个输出条件,使用原则(2)。例如,研究生录取人数例如,研究生录取人数34人,测试数据可取人,测试数据可取1、34、以及、以及0、35。(5)如果程序的规格说明给出的输入域或输出域是如果程序的规格说明给出的输入域或输出域是有序集合(如有序表),
34、则选取集合的第一个有序集合(如有序表),则选取集合的第一个元素和最后一个元素作为测试用例。元素和最后一个元素作为测试用例。例如,学生文件的学生记录按学号存放,班上例如,学生文件的学生记录按学号存放,班上总共总共30人,测试数据可取第人,测试数据可取第1、第、第30个学生。个学生。(6)如果程序中使用了一个内部数据结构,则应选如果程序中使用了一个内部数据结构,则应选择此数据结构的边界上的值作为测试用例。择此数据结构的边界上的值作为测试用例。(7)分析规格说明,找出其他可能的边界条件。分析规格说明,找出其他可能的边界条件。If(196007=value(birthdate)35 周岁周岁 16周岁
35、周岁196006197907不合格年龄不合格年龄月份月份对应数值对应数值月份值为月份值为 1 月月月份值为月份值为 12 月月 196701 197412输入有效输入有效月份值月份值 12 196700 197413 输入无效输入无效1 1、等价分类法的测试数据是在各个等价类允许的值域内、等价分类法的测试数据是在各个等价类允许的值域内 任意选取的,而边界值分析法的测试数据必须在边界任意选取的,而边界值分析法的测试数据必须在边界 值附近选取。值附近选取。2 2、在公开招工的例子中,采用等价分类法设计了、在公开招工的例子中,采用等价分类法设计了 个测试个测试 用例而边界值分析法则设计了用例而边界值
36、分析法则设计了个,个,所以,一般来说所以,一般来说 ,用边界值分析法设计的测试用例要比等价分类法的代,用边界值分析法设计的测试用例要比等价分类法的代 表性更广,发现错误的能力也更强。但是对边界的分析表性更广,发现错误的能力也更强。但是对边界的分析 与确定比较复杂,它要求测试人员具有更多的经验和长与确定比较复杂,它要求测试人员具有更多的经验和长 找性。找性。等价分类法与边界值分析法的比较等价分类法与边界值分析法的比较错误推测在测试程序时,人们根据经验或直觉推测程序中可能存在的各种错误,从而有针对性地编写检查这些错误的测试用例,这就是错误推测法。错误推测法没有确定的步骤,凭经验进行。它的基本思想是
37、列出程序中可能发生错误的情况,根据这些情况选择测试用例。如输入、输出数据为零是容易发生错误的情况;又如,输入表格为空或输入表格只有一行是容易出错的情况等。例如对于一个排序程序,列出以下几项需特别测试的情况:(1)输入表为空。(2)输入表只含一个元素。(3)输入表中所有元素均相同。(4)输入表中已排好序。又如,测试一个采用二分法的检索程序,考虑以下情况:(1)表中只有一个元素。(2)表长是2的幂。(3)表长为2的幂减1或2的幂加1因此,要根据具体情况具体分析。(1)在任何情况下都应使用边界值分析法,用这种方法设计的用例暴露程序错误能力强。设计用例时,应该既包括输入数据的边界情况又包括输出数据的边
38、界情况。(2)必要时用等价类划分方法补充一些测试用例。(3)再用错误推测法补充测试用例。(4)检查上述测试用例的逻辑覆盖程度,如未满足所要求的覆盖标准,再增加例子。(5)如果需求说明中含有输入条件的组合情况,则一开始就可使用因果图法。功能图测试功能图测试 功能图测试是一种黑盒测试方法,它是基功能图测试是一种黑盒测试方法,它是基于状态迁移图和判定表来设计测试用例的。于状态迁移图和判定表来设计测试用例的。状态迁移图状态迁移图是一种动态说明,它由是一种动态说明,它由输入条输入条件件和和当前状态当前状态决定决定输出数据输出数据和和后续状态后续状态。判定表判定表则是一种静态说明,它用于表示在则是一种静态
39、说明,它用于表示在状态中状态中输入与输出输入与输出的对应关系。的对应关系。在这种环境下,在这种环境下,测试用例是由测试中经过测试用例是由测试中经过的一系列状态和在每个状态中必须依靠输的一系列状态和在每个状态中必须依靠输入入输出数据满足的一对条件组成输出数据满足的一对条件组成。下面是简化的自动取款机下面是简化的自动取款机ATM的状态图。的状态图。a)初始时初始时ATM显示显示“请插入卡片请插入卡片”。b)当插入卡片后当插入卡片后 ATM 显示显示“请输入密码请输入密码”。c)ATM 检查输入的密码与文件中保存的密码。检查输入的密码与文件中保存的密码。若相同,则若相同,则ATM显示显示“请输入金额
40、请输入金额”;若;若不同,不同,ATM检查是否三次都打错了:如是,检查是否三次都打错了:如是,则则ATM显示显示“停止处理停止处理”,消去这个记录,消去这个记录,重新显示重新显示“请插入卡片请插入卡片”;若未达到三次,;若未达到三次,则则ATM显示显示“请输入密码请输入密码”。d)打入一个钱数后打入一个钱数后ATM检查它是否小于等于检查它是否小于等于余额,若大于余额,余额,若大于余额,ATM显示显示“请输入金请输入金额额”,等待再次输入金额;否则,等待再次输入金额;否则ATM付给付给要求的现金,报告余额,显示要求的现金,报告余额,显示“请插入卡请插入卡片片”。判定表判定表 TS0S1S2S3T
41、“请插入卡片请插入卡片”“请输入密码请输入密码”“请输入金额请输入金额”给付钱款给付钱款显示余额显示余额M1:插入卡片插入卡片M2M3M4M5M6M7密码密码=记录记录YN N错输错输=三次三次NYNM2 M3 M4 S0S1S2输输出出输输入入状状态态输入金额后判断输入金额后判断 if(金额金额 余额余额)M5 else M6M1:插入卡片插入卡片 M2:输入密码输入密码 M3:密码匹配密码匹配 M4:错输三次错输三次M5:输入金额输入金额 M6:金额不多于余额金额不多于余额 M7:回归初始状态回归初始状态从状态图生成测试用例从状态图生成测试用例 若用结点表示状态,用弧表示迁移,则状态迁移若
42、用结点表示状态,用弧表示迁移,则状态迁移图就可以转换为一个程序的控制流图,问题就转图就可以转换为一个程序的控制流图,问题就转化为程序的路径测试问题。化为程序的路径测试问题。状态图的覆盖准则有覆盖所有状态状态图的覆盖准则有覆盖所有状态(C0覆盖覆盖)和覆和覆盖所有迁移盖所有迁移(C1覆盖覆盖)。通常采用基本路径覆盖方法设计测试用例。对于通常采用基本路径覆盖方法设计测试用例。对于循环,应包含循环,应包含 0 次循环(先判断循环情形)和次循环(先判断循环情形)和 1 次循环的情形。次循环的情形。在计算路径时要注意状态图本身已经构成强连通在计算路径时要注意状态图本身已经构成强连通图,区域外的部分不计入
43、环路复杂性。图,区域外的部分不计入环路复杂性。测试路径测试路径S0S1S2S3S0S0S1S0S0S0S1S1S2S3S0S0S1S2S2S3S0S1S2S3TM3M4M5M6M7M2基于图的测试方法基于图的测试方法 黑盒测试的一个重要思想是首先创建描述黑盒测试的一个重要思想是首先创建描述重要的程序对象(模块或语句集)及其相重要的程序对象(模块或语句集)及其相互关系的图,然后导出测试序列以检查对互关系的图,然后导出测试序列以检查对象及其关系并发现错误。象及其关系并发现错误。图中用结点表示对象,用边(或连接)表图中用结点表示对象,用边(或连接)表示对象间的关系,用结点权值表示结点的示对象间的关系
44、,用结点权值表示结点的属性,用边上的权值表示连接的特征。属性,用边上的权值表示连接的特征。在基本路径测试方法就有这样的图。在基本路径测试方法就有这样的图。使用图进行行为测试的方法有:使用图进行行为测试的方法有:1)事务流建模事务流建模 结点是事务的每一步骤,边是结点是事务的每一步骤,边是步骤之间的逻辑连接。步骤之间的逻辑连接。2)有限状态建模有限状态建模 结点是用户可见的软件的不结点是用户可见的软件的不同状态,边是状态之间的转换。(可利用状同状态,边是状态之间的转换。(可利用状态迁移图辅助建立这种图)态迁移图辅助建立这种图)3)数据流建模数据流建模 结点是数据对象,边是将数据结点是数据对象,边
45、是将数据对象转换为其他数据对象时发生的变换。对象转换为其他数据对象时发生的变换。4)时序建模时序建模 结点是程序对象,边是对象间的结点是程序对象,边是对象间的顺序连接。边上权值用于表示执行时间。顺序连接。边上权值用于表示执行时间。基于图的测试可以仿照基本路径测试的方法基于图的测试可以仿照基本路径测试的方法设计测试用例。但图中可能有环,可能要考设计测试用例。但图中可能有环,可能要考虑循环测试。虑循环测试。对于图中的传递关系、对称(双向的有向边)对于图中的传递关系、对称(双向的有向边)关系、自反关系也需要进行检查。关系、自反关系也需要进行检查。在设计测试用例时,第一个目标是结点的覆在设计测试用例时
46、,第一个目标是结点的覆盖度。必须确保不遗漏某个结点,而且结点盖度。必须确保不遗漏某个结点,而且结点的权值(对象属性)是正确的。第二个目标的权值(对象属性)是正确的。第二个目标是边的覆盖度。要设计测试以证实权值是否是边的覆盖度。要设计测试以证实权值是否有效,最后加入循环测试。有效,最后加入循环测试。接口测试接口测试当模块或子系统集成为更大的系统时就需当模块或子系统集成为更大的系统时就需要进行接口测试。要进行接口测试。接口测试的目的是检测那些由于接口有误接口测试的目的是检测那些由于接口有误或对接口做出了无效假设而造成的系统缺或对接口做出了无效假设而造成的系统缺陷。陷。程序构件的接口类型有:程序构件
47、的接口类型有:1)参数接口参数接口2)共享内存接口共享内存接口3)程序接口程序接口4)消息传递接口消息传递接口接口错误是常见的系统错误,有接口错误是常见的系统错误,有3种接口错误种接口错误:1)接口误用接口误用:构件调用时接口使用不当造成的错构件调用时接口使用不当造成的错误。误。例如,在参数接口情形,使用的参数类型、例如,在参数接口情形,使用的参数类型、排列顺序或参数个数不匹配。排列顺序或参数个数不匹配。2)接口误解接口误解:调用者构件误解了被调用构件的接调用者构件误解了被调用构件的接口描述,或对被调用者的行为作了错误的假设口描述,或对被调用者的行为作了错误的假设而造成的错误。而造成的错误。例
48、如,调用折半搜索例程时使例如,调用折半搜索例程时使用了未排序的数组导致搜索失败。用了未排序的数组导致搜索失败。3)计时错误计时错误:在实时系统中,系统使用了共享内在实时系统中,系统使用了共享内存接口或消息传递接口可能产生的错误存接口或消息传递接口可能产生的错误。原因原因在于数据的生产和消费的速度可能不同。在于数据的生产和消费的速度可能不同。接口测试的一般准则接口测试的一般准则1)检查接口并明确地列出对外部构件的调用。检查接口并明确地列出对外部构件的调用。设计一组测试用例,为传送给其他构件的设计一组测试用例,为传送给其他构件的参数选择参数选择紧靠取值范围边界的值紧靠取值范围边界的值,以暴露,以暴
49、露接口的不一致错误。接口的不一致错误。2)当有指针通过接口传递时,可当有指针通过接口传递时,可用空指针参用空指针参数数来测试。来测试。3)当通过程序接口来调用一个构件时,设计当通过程序接口来调用一个构件时,设计一些一些容易引起构件执行失效的假设容易引起构件执行失效的假设进行测进行测试,以检查接口误解的错误。试,以检查接口误解的错误。4)在有消息传递的系统中进行强度测试,即在有消息传递的系统中进行强度测试,即加大消息传递的量,增加系统的负荷。因加大消息传递的量,增加系统的负荷。因此,设计测试用例,产生比平时多得多的此,设计测试用例,产生比平时多得多的消息,以暴露计时错误。消息,以暴露计时错误。5
50、)当构件之间通过共享内存交互时,可以设当构件之间通过共享内存交互时,可以设计一种测试,改变正常的激活构件的顺序。计一种测试,改变正常的激活构件的顺序。通过这些测试用以暴露程序员暗自对共享通过这些测试用以暴露程序员暗自对共享数据的生产和消费顺序所做的假设。数据的生产和消费顺序所做的假设。在接口测试方面,利用程序静态分析的方在接口测试方面,利用程序静态分析的方法比动态测试更有效。法比动态测试更有效。基本路径测试基本路径测试【例例】试用基本路径测试法对如下的试用基本路径测试法对如下的PDL描述或如图所示的程序流程图设描述或如图所示的程序流程图设计测试用例。该例子描述了最多输入计测试用例。该例子描述了