第3章 黑盒测试及其用例的设计 3.1 测试用例设计概述 3.2 黑盒测试法的概念 3.3 三角形问题与NextDate函数 第3章 黑盒测试及其用例的设计 3.1 测试用例设计概述 3.2 黑盒测试法的概念 3.3 三角形问题与NextDate函数 3.4 等价类划分法 3.5 边界值分析法 3.6 因果图法 3.7 决策表法 3.8 错误推测法 3.9 测试方法的选择
本章教学目标 理论环节 实践环节 学习理解黑盒测试方法的基本概念 学习理解黑盒测试的两个典型问题 学习掌握黑盒测试的等价类划分法 学习掌握黑盒测试的边界值分析法 学习掌握黑盒测试的因果图测试法和决策表法 实践环节 通过案例运用学习掌握运用方法解决实际问题的能力 运用等价类划分法与边界值分析法进行实际程序测试 运用因果图测试法与决策表法进行实际程序测试
3.1 测试用例设计概述 Return 3.1.1 测试用例的定义和特征 3.1.2 测试用例的基本准则 3.1.3 设计测试用例的着眼点 3.1 测试用例设计概述 3.1.1 测试用例的定义和特征 3.1.2 测试用例的基本准则 3.1.3 设计测试用例的着眼点 3.1.4 测试用例设计书写标准 Return
3.1.1 测试用例的定义和特征 测试用例的定义: (1)测试用例是为特定的目的而设计的一组测试输入、 执行条件和预期的结果。 3.1.1 测试用例的定义和特征 测试用例的定义: (1)测试用例是为特定的目的而设计的一组测试输入、 执行条件和预期的结果。 (2)测试用例是执行的最小实体。 测试用例的特征: (1)最有可能抓住错误的; (2)不是重复的、多余的; (3)一组相似测试用例中最有效的; (4)既不是太简单,也不是太复杂。
3.1.2 设计测试用例的基本准则 测试用例的代表性 能够代表并覆盖各种合理的和不合理的、合法的和非法的、边界的和越界的以及极限的输入数据、操作和环境设置等。 测试结果的可判定性 即测试执行结果的正确性是可判定的,每一个测试用例都应有相应的期望结果。 测试结果的可再现性 即对同样的测试用例,系统的执行结果应当是相同的。
3.1.3 设计测试用例的着眼点 根据产品规格,测试基本功能; 考虑设计一般用户(非专业人员)的使用方案; 考虑设计稀有或特殊的使用方案; 3.1.3 设计测试用例的着眼点 根据产品规格,测试基本功能; 考虑设计一般用户(非专业人员)的使用方案; 考虑设计稀有或特殊的使用方案; 与系统其他组成部分的配合(如FAX和上网可能要用到MODEM,测试中考虑对设备的共享); 考虑特殊情况(如内存和硬件的冲突等); 设计极端情况(如内存泄漏、破坏性测试等); 好的测试用例集能花费最小的代价(人力、物力、财力、时间)做最好的测试。
3.1.4 测试用例设计书写标准 在ANSI/IEEE829-1983标准中列出了和测试设计相关的测试用例编写规范和模板。标准模板中主要元素如下: 标识符——惟一标识每一个测试用例 测试项——准确的描述所需要测试的项及其特征 测试环境要求——表征执行该测试用例需要的测试环境 输入标准——执行测试用例的输入需求(这些输入可能包括数据、文件或者操作) 输出标准——按照指定的环境和输入标准得到的期望输出结果 测试用例之间的关联——标识该测试用例与其它的测试(或其它测试用例)之间的依赖关系 范例1 范例2
3.2 黑盒测试法的概念 黑盒测试被称为功能测试或数据驱动测试。在测试时,把被测程序视为一个不能打开的黑盒子,在完全不考虑程序内部结构和内部特性的情况下进行。 采用黑盒测试的目的主要是在已知软件产品所应具有的功能的基础上,进行: (1)检查程序功能能否按需求规格说明书的规定正常使用,测试各个功能是否有遗漏,检测性能等特性要求是否满足。 (2)检测人机交互是否错误,检测数据结构或外部数据库访问是否错误,程序是否能适当地接收输入数据而产生正确的输出结果,并保持外部信息(如数据库或文件)的完整性。 (3)检测程序初始化和终止方面的错误。 Return
3.3 三角形问题与NextDate函数 Return 1、三角形问题 输入三个整数a、b、c,分别作为三角形的三条边,现通过程序判断由三条边构成的三角形的类型为等边三角形、等腰三角形、一般三角形(特殊的还有直角三角形),以及构不成三角形。 现在要求输入三个整数a、b、c,必须满足以下条件: 条件1 1≤a≤100 条件4 a<b+ c 条件2 1≤b≤100 条件5 b<a+ c 条件3 1≤c≤100 条件6 c<a+ b Return
三角形问题与NextDate函数(续) 如果输入值a、b、c不满足条件1、条件2和条件3 ,程序给出“边的取值超出允许范围”的信息。 (1)如果不满足条件4、条件5和条件6中的一个,则程序输出为“非三角形”。 (2)如果三条边相等,则程序输出为“等边三角形”。 (3)如果恰好有两条边相等,则程序输出为“等腰三角形”。 (4)如果三条边都不相等,则程序输出为“一般三角形”。 结论:三角形问题的复杂之处在于输入与输出之间的关系比较复杂。
三角形问题与NextDate函数(续) 2、NextDate函数 NextDate函数说明另一种复杂的关系,即输入变量之间逻辑关系的复杂性。 NextDate函数包含三个变量month、day和year,函数的输出为输入日期后一天的日期。 要求输入变量month、day和year均为整数值,并且满足下列条件: 条件1 1≤ month ≤12 条件2 1≤ day ≤31 条件3 1912≤ year ≤2050 结论:在NextDate函数中有两种复杂性的输入来源,一是输入域的复杂性,二是确定闰年的规则并要增加“额外天”。
3.4 等价类划分法 Return 3.4.1 等价类的划分原则 3.4.2 等价类划分法的测试用例设计 3.4.3 常见等价类划分测试形式 3.4 等价类划分法 3.4.1 等价类的划分原则 3.4.2 等价类划分法的测试用例设计 3.4.3 常见等价类划分测试形式 3.4.4 使用等价类划分法测试的实例 Return
等价类划分法 等价类划分法是一种重要的、常用的黑盒测试方法,它将不能穷举的测试过程进行合理分类,从而保证设计出来的测试用例具有完整性和代表性。 举例:设计这样的测试用例,来实现一个对所有实数进行开平方运算( y = sqrt(x) )的程序的测试。 思考方向: 由于开平方运算只对非负实数有效,这时需要将所有的实数(输入域x)进行划分,可以分成:正实数、0 和 负实数。假设我们选定+1.4444代表正实数,-2.345代表负实数,则为该程序设计的测试用例的输入为+1.4444、 0 和 -2.345。
等价类划分法(续) 等价类划分法是把所有可能的输入数据,即程序的输入域划分为若干部分(子集),然后从每一个子集中选取少数具有代表性的数据作为测试用例。 所谓等价类是指某个输入域的子集合。在该子集合中,各个输入数据对于揭露程序中的错误都是等效的,它们具有等价特性,即每一类的代表性数据在测试中的作用都等价于这一类中的其它数据。这样,对于表征该类的数据输入将能代表整个子集合的输入。因此,可以合理的假定: ——测试某等价类的代表值就是等效于对于这一类其它值的测试。
3.4.1 等价类的划分原则 等价类是输入域的某个子集合,而所有等价类的并集就是整个输入域。因此,等价类对于测试有两个重要的意义: 3.4.1 等价类的划分原则 等价类是输入域的某个子集合,而所有等价类的并集就是整个输入域。因此,等价类对于测试有两个重要的意义: 完备性——整个输入域提供一种形式的完备性 无冗余性——若互不相交则可保证一种形式的无冗余性 如何划分?——先从程序的规格说明书中找出各个输入条件,再为每个输入条件划分两个或多个等价类,形成若干的互不相交的子集。 采用等价类划分法设计测试用例通常分两步进行: (1)确定等价类,列出等价类表。 (2)确定测试用例。
等价类的划分原则(续) 划分等价类可分为两种情况: (1)有效等价类 ——是指对软件规格说明而言,是有意义的、合理的输入数据所组成的集合。利用有效等价类,能够检验程序是否实现了规格说明中预先规定的功能和性能。 (2)无效等价类 ——是指对软件规格说明而言,是无意义的、不合理的输入数据所构成的集合。利用无效等价类,可以鉴别程序异常处理的情况,检查被测对象的功能和性能的实现是否有不符合规格说明要求的地方。
等价类的划分原则(续) 进行等价类划分的依据: (1)按照区间划分 在输入条件规定了取值范围或值的个数的情况下,可以确定一个有效等价类和两个无效等价类。 例:程序输入条件为小于100大于10的整数x,则有效等价类为10<x<100,两个无效等价类为x≤10和x≥100。 (2)按照数值划分 在规定了一组输入数据(假设包括 n个 输入值),并且程序要对每一个输入值分别进行处理的情况下,可确定 n 个有效等价类(每个值确定一个有效等价类)和一个无效等价类(所有不允许的输入值的集合)。 例:程序输入x取值于一个固定的枚举类型{1,3,7,15},且程序 中对这4个数值分别进行了处理,则有效等价类为x=1、x=3、 x=7、x=15,无效等价类为x≠1,3,7,15的值的集合。
等价类的划分原则(续) (3)按照数值集合划分 在输入条件规定了输入值的集合或规定了“必须如何”的条件下,可以确定一个有效等价类和一个无效等价类(该集合有效值之外)。 例:程序输入条件为取值为奇数的整数x,则有效等价类为x的值为奇数的整数,无效等价类为x的值不为奇数的整数。 (4)按照限制条件或规则划分 在规定了输入数据必须遵守的规则或限制条件的情况下,可确定一个有效等价类(符合规则)和若干个无效等价类(从不同角度违反规则)。 例:程序输入条件为以字符‘a’开头、长度为8的字符串,并且字符串不包含‘a’~ ‘z’之外的其它字符,则有效等价类为满足了上述所有条件的字符串,无效等价类为不以‘a’开头的字符串、长度不为8的字符串和包含了‘a’~ ‘z’之外其它字符的字符串。 (5)细分等价类 在确知已划分的等价类中各元素在程序中的处理方式不同的情况下,则应再将该等价类进一步划分为更小的等价类,并建立等价类表。
3.4.2 等价类划分法的测试用例设计 在设计测试用例时,应同时考虑有效等价类和无效等价类测试用例的设计。 3.4.2 等价类划分法的测试用例设计 在设计测试用例时,应同时考虑有效等价类和无效等价类测试用例的设计。 根据已列出的等价类表可确定测试用例,具体过程如下: (1)首先为等价类表中的每一个等价类分别规定一个唯一的编号。 (2)设计一个新的测试用例,使它能够尽量覆盖尚未覆盖的有效等价类。重复这个步骤,直到所有的有效等价类均被测试用例所覆盖。 (3)设计一个新的测试用例,使它仅覆盖一个尚未覆盖的无效等价类。重复这一步骤,直到所有的无效等价类均被测试用例所覆盖。
3.4.3 常见等价类划分测试形式 针对是否对无效数据进行测试,可以将等价类测试分为 标准等价类测试和健壮等价类测试。 3.4.3 常见等价类划分测试形式 针对是否对无效数据进行测试,可以将等价类测试分为 标准等价类测试和健壮等价类测试。 标准等价类测试——不考虑无效数据值,测试用例使用 每个等价类中的一个值。 健壮等价类测试——主要的出发点是考虑了无效等价类。对有效输入,测试用例从每个有效等价类中取一个值; 对无效输入,一个测试用例有一个无效值,其他值均取 有效值。 健壮等价类测试存在两个问题: (1)需要花费精力定义无效测试用例的期望输出 (2)对强类型的语言没有必要考虑无效的输入
3.4.4 使用等价类划分法测试的实例 实例1 三角形问题 3.4.4 使用等价类划分法测试的实例 实例1 三角形问题 分析:在多数情况下,是从输入域划分等价类的,但并非不能从被测程序的输出域反过来定义等价类,事实上,这对于三角形问题却是最简单的划分方法。 在三角形问题中,有四种可能的输出:等边三角形、等腰三角形、一般三角形和非三角形。利用这些信息能够确定下列输出(值域)等价类。 R1 = { <a,b,c>: 边为a,b,c的等边三角形 } R2 = { <a,b,c>: 边为a,b,c的等腰三角形 } R3 = { <a,b,c>: 边为a,b,c的一般三角形 } R4 = { <a,b,c>: 边为a,b,c不能组成三角形 } 标准等价类测试用例 健壮等价类测试用例
三角形问题 测试用例 a b c 预期输出 Test1 10 等边三角形 Test2 5 等腰三角形 Test3 3 4 一般三角形 非三角形 三角形问题的4个标准等价类测试用例
三角形问题 测试用例 a b c 预期输出 Test1 5 6 7 一般三角形 Test2 -1 a值超出输入值定义域 Test3 101 Test6 Test7 三角形问题的7个健壮等价类测试用例
使用等价类划分法测试的实例(续) 实例2 保险公司计算保费费率的程序 某保险公司的人寿保险的保费计算方式为: 投保额×保险费率 实例2 保险公司计算保费费率的程序 某保险公司的人寿保险的保费计算方式为: 投保额×保险费率 其中,保险费率依点数不同而有别,10点及10点以上保险费率为0.6%,10点以下保险费率为0.1%;而点数又是由 投保人的年龄、性别、婚姻状况和抚养人数来决定,具体规则如下: 年龄 性别 婚姻 抚养人数 20~39 40~59 其它 M F 已婚 未婚 1人扣0.5点 最多扣3点 (四舍五入取整) 6点 4点 2点 5点 3点
计算保费费率的程序 (1)分析程序规格说明中给出和隐含的对输入条件的要求,列出等价类表(包括有效等价类和无效等价类)。 年龄:一位或两位非零整数,值的有效范围为1~99 性别:一位英文字符,只能取值‘M’或’F’ 婚姻:字符,只能取值‘已婚’或‘未婚’ 抚养人数:空白或一位非零整数(1~9) 点数 :一位或两位非零整数,值的范围为1~99 (2)根据(1)中的等价类表,设计能覆盖所有等价类的 测试用例。 等价类表 测试用例
输入条件 有效等价类 编号 无效等价类 年龄 20~39岁 1 40~59岁 2 1~19岁 60~99岁 3 小于1 12 大于99 13 性别 单个英文字符 4 非英文字符 14 非单个英文字符 15 ‘M’ 5 除‘M’和‘F’之外的 其它单个字符 16 ‘F’ 6 婚姻 已婚 7 除’已婚’和’未婚’之外的其它字符 17 未婚 8 抚养人数 空白 9 除空白和数字之外 的其它字符 18 1~6人 10 19 6~9人 11 大于9 20
测试用例 编号 输入数据 预期输出 年龄 性别 婚姻 抚养人数 保险费率 1 27 F 未婚 空白 0.6% 2 50 M 已婚 3 70 7 0.1% 4 无法推算 5 100 6 99 男 Child 8 45 N 9 38 离婚 10 62 没有 11 18 12 40
习题 NextDate函数 请使用等价类划分法为NextDate函数列出输入域等价类表,并设计相应的测试用例。
3.5 边界值分析法 3.5.1 边界值分析法概要 3.5.2 边界值分析法测试用例 3.5.3 边界值分析法测试举例
3.5.1 边界值分析法概要 边界值分析法就是对输入或输出的边界值进行测试的一种黑盒测试方法。通常边界值分析法是作为对等价类划分法的补充,这种情况下,其测试用例来自等价类的边界。 为什么使用边界值分析法? 无数的测试实践表明,大量的故障往往发生在输入定义域或输出值域的边界上,而不是在其内部。因此,针对各种边界情况设计测试用例,通常会取得很好的测试效果。 怎样用边界值分析法设计测试用例? (1)首先确定边界情况。通常输入或输出等价类的边界就是应该着重测试的边界情况。 (2)选取正好等于、刚刚大于或刚刚小于边界的值作为测试数据,而不是选取等价类中的典型值或任意值。
举例 —— 常见的边界值 对16-bit 的整数而言 32767 和 -32768 是边界 屏幕上光标在最左上、最右下位置 报表的第一行和最后一行 数组元素的第一个和最后一个 循环的第 0 次、第 1 次和倒数第 2 次、最后一次
边界值分析 边界值分析使用与等价类划分法相同的划分,只是边界值分析假定错误更多地存在于划分的边界上,因此在等价类的边界上以及两侧的情况设计测试用例。 例:测试计算平方根的函数 ——输入:实数 ——输出:实数 ——规格说明:当输入一个0或比0大的数的时候,返回其正平方根;当输入一个小于0的数时,显示错误信息“平方根非法-输入值小于0”并返回0;库函数Print-Line可以用来输出错误信息。 实例分析
等价类划分: 可以考虑作出如下划分: 输入 (i)<0 和 (ii)>=0 输出 (a)>=0 和 (b) Error 测试用例有两个: 输入4,输出2。对应于 (ii) 和 (a) 。 输入-10,输出0和错误提示。对应于 (i) 和 (b) 。 边界值分析: 划分(ii)的边界为0和最大正实数;划分(i)的边界为最小负实数和0。由此得到以下测试用例: 输入 {最小负实数} 输入 {绝对值很小的负数} 输入 0 输入 {绝对值很小的正数} 输入 {最大正实数}
边界值分析(续) 通常情况下,软件测试所包含的边界检验有几种类型: 数字、字符、位置、质量、大小、速度、方位、尺寸、 空间等 数字、字符、位置、质量、大小、速度、方位、尺寸、 空间等 相应地,以上类型的边界值应该在: 最大/最小、首位/末位、上/下、最快/最慢、最高/最低、 最短/最长、 空/满等情况下 实例分析
举例 —— 利用边界值作为测试数据 项 边界值 测试用例的设计思路 字符 起始-1个字符/结束+1个字符 假设一个文本输入区域允许输入1个到255个 字符,输入1个和255个字符作为有效等价类;输入0个和256个字符作为无效等价类,这几个数值都属于边界条件值。 数值 最小值-1/最大值+1 假设某软件的数据输入域要求输入5位的数据值,可以使用10000作为最小值、99999作为最大值;然后使用刚好小于5位和大于5位的 数值来作为边界条件。 空间 小于空余空间一点/大于满空间一点 例如在用U盘存储数据时,使用比剩余磁盘空间大一点(几KB)的文件作为边界条件。
内部边界值分析 在多数情况下,边界值条件是基于应用程序的功能设计而需要考虑的因素,可以从软件的规格说明或常识中得到,也是最终用户可以很容易发现问题的。然而,在测试用例设计过程中,某些边界值条件是不需要呈现给用户的,或者说用户是很难注意到的,但同时确实属于检验范畴内的边界条件,称为内部边界值条件或子边界值条件。 内部边界值条件主要有下面几种: 数值的边界值检验 字符的边界值检验 其它边界值检验 小结: 在实际的测试用例设计中,需要将基本的软件设计要求和程序定义的要求结合起来,即结合基本边界值条件和内部边界值条件来设计有效的测试用例。
数值的边界值检验 计算机是基于二进制进行工作的,因此,软件的任何数值运算都有一定的范围限制。 计算机数值运算的范围 项 范围或值 位(bit) 0 或 1 字节(byte) 0 ~ 255 字(word) 0~65535(单字)或 0~4294967295(双字) 千(K) 1024 兆(M) 1048576 吉(G) 1073741824
字符的边界值检验 在计算机软件中,字符也是很重要的表示元素,其中ASCII和Unicode是常见的编码方式。下表中列出了一些常用字符对应的ASCII码值。 字符 ASCII码值 空 (null) A 65 空格 (space) 32 a 97 斜杠 ( / ) 47 Z 90 48 z 122 冒号 ( : ) 58 单引号 ( ‘ ) 96 @ 64
选择测试用例的原则 (1) 如果输入条件规定了值的范围,则应取刚达到这个范围的边界值以及刚刚超过这个范围边界的值作为测试输入数据。 (2) 如果输入条件规定了值的个数,则用最大个数、最小个数和比最大个数多1个、比最小个数少1个的数作为测试数据。 (3) 根据程序规格说明的每个输出条件,使用原则 (1)。 (4) 根据程序规格说明的每个输出条件,使用原则 (2) 。 (5) 如果程序的规格说明给出的输入域或输出域是有序集合 (如有序表、顺序文件等),则应选取集合中的第一个和 最后一个元素作为测试用例。 (6) 如果程序中使用了一个内部数据结构,则应当选择这个内部数据结构的边界上的值作为测试用例。 (7) 分析程序规格说明,找出其它可能的边界条件。
3.5.2 边界值分析法测试用例 采用边界值分析测试的基本思想是:故障往往出现在输入变量的边界值附近。 3.5.2 边界值分析法测试用例 采用边界值分析测试的基本思想是:故障往往出现在输入变量的边界值附近。 ——因此,边界值分析法利用输入变量的最小值(min)、略大于最小值(min+)、输入值域内的任意值(nom)、略小于最大值(max-)和最大值(max)来设计测试用例。 边界值分析法是基于可靠性理论中称为“单故障”的假设,即有两个或两个以上故障同时出现而导致软件失效的情况很少,也就是说,软件失效基本上是由单故障引起的。 ——因此,在边界值分析法中获取测试用例的方法是: (1) 每次保留程序中一个变量,让其余的变量取正常值,被保留的变量依次取min、min+、nom、max-和max。 (2) 对程序中的每个变量重复 (1) 。
边界值分析法测试用例(续) 例1:有两个输入变量x1(a≤x1≤b)和x2(c≤x2≤d)的程序F的边界值分析测试用例如下: { <x1nom,x2min>, <x1nom,x2min+>, <x1nom,x2nom>, <x1nom,x2max>, <x1nom,x2max->, <x1min,x2nom>, <x1min+,x2nom>, <x1max,x2nom>, <x1max-,x2nom> } x1 x2 a b c d
边界值分析法测试用例(续) 例2:有二元函数f(x,y),其中x∈[1,12],y∈[1,31]。 则采用边界值分析法设计的测试用例是: { <1,15>, <2,15>, <11,15>, <12,15>, <6,15>, <6,1>, <6,2>, <6,30>, <6,31> } 推论:对于一个含有n个变量的程序,采用边界值分析法测试程序会产生4n+1个测试用例。 练习:有函数f(x,y,x),其中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> }
健壮性测试 健壮性测试是作为边界值分析的一个简单的扩充,它除了对变量的5个边界值分析取值外,还需要增加一个略大于最大值(max+)以及略小于最小值(min-)的取值,检查超过极限值时系统的情况。因此,对于有n个变量的函数采用健壮性测试需要6n+1个测试用例。 前面例1中的程序F的健壮性测试如下图所示: x1 x2 a b c d 练习:请为例2中的函数f(x,y)写出相应的健壮性测试用例。
3.5.3 边界值分析法测试举例 实例1 三角形问题的边界值分析测试用例 3.5.3 边界值分析法测试举例 实例1 三角形问题的边界值分析测试用例 在三角形问题描述中,除了要求边长是整数外,没有给出其它的限制条件。在此,我们将三角形每边边长的取范围值设值为[1, 100] 。 说明:如果程序规格说明中没有显式地给出边界值,则可以在设计测试用例前先设定取值的下限值和上限值。 实例2 NextDate函数的边界值分析测试用例 在NextDate函数中,隐含规定了变量mouth和变量day的取值范围为1≤mouth≤12和1≤day≤31,并设定变量year的取值范围为1912≤year≤2050 。 测试用例 测试用例
测试用例 a b c 预期输出 Test 1 Test2 Test3 Test4 Test5 60 50 1 2 99 100 等腰三角形 等边三角形 非三角形 Test6 Test7 Test8 Test9 Test10 Test11 Test12 Test13
测试用例 mouth day year 预期输出 Test 1 Test2 Test3 Test4 Test5 Test6 Test7 6 15 1911 1912 1913 1975 2049 2050 2051 1911.6.16 1912.6.16 1913.6.16 1975.6.16 2049.6.16 2050.6.16 2051.6.16 Test8 Test9 Test10 Test11 Test12 Test13 -1 1 2 30 31 32 2001 day超出[1…31] 2001.6.2 2001.6.3 2001.7.1 输入日期超界 Test14 Test15 Test16 Test17 Test18 Test19 11 12 13 Mouth超出[1…12] 2001.1.16 2001.2.16 2001.11.16 2001.12.16
习题 找零钱最佳组合 假设商店货品价格(R) 都不大于100元(且为整数),若顾客付款(P)在100元内,现有一个程序能在每位顾客付款后给出找零钱的最佳组合(找给顾客货币张数最少)。 假定此商店的货币面值只包括:50元(N50)、10元(N10)、 5元(N5)、1元(N1) 四种。 请结合等价类划分法和边界值分析法为上述程序设计 出相应的测试用例。
3.6 因果图法 3.6.1 因果图法的简介 3.6.2 因果图 3.6.3 因果图法测试举例
3.6.1 因果图法的简介 因果图法产生的背景: 等价类划分法和边界值分析方法都是着重考虑输入条件,但没有考虑输入条件的各种组合、输入条件之间的相互制约关系。这样虽然各种输入条件可能出错的情况已经测试到了,但多个输入条件组合起来可能出错的情况却被忽视了。 如果在测试时必须考虑输入条件的各种组合,则可能的组合数目将是天文数字,因此必须考虑采用一种适合于描述多种条件的组合、相应产生多个动作的形式来进行测试用例的设计,这就需要利用因果图(逻辑模型)。
因果图法的简介(续) 因果图法是基于这样的一种思想:一些程序的功能可以用判定表(或称决策表)的形式来表示,并根据输入条件的组合情况规定相应的操作。 因果图法的定义:是一种利用图解法分析输入的各种组合情况,从而设计测试用例的方法,它适合于检查程序输入条件的各种组合情况。 采用因果图法设计测试用例的步骤: (1)根据程序规格说明书描述,分析并确定因(输入条件)和果(输出结果或程序状态的改变),画出因果图。 (2)将得到的因果图转换为判定表。 (3)为判定表中每一列所表示的情况设计一个测试用例。
因果图法的简介(续) 使用因果图法的优点: (1)考虑到了输入情况的各种组合以及各个输入情况之间的相互制约关系。 (2)能够帮助测试人员按照一定的步骤,高效率的开发测试用例。 (3)因果图法是将自然语言规格说明转化成形式语言规格说明的一种严格的方法,可以指出规格说明存在的不完整性和二义性。
3.6.2 因果图 c1 e1 c1 e1 c1 e1 c2 c3 c1 e1 c2 因果图中用来表示4种因果关系的基本符号: ~ 非 恒等 3.6.2 因果图 因果图中用来表示4种因果关系的基本符号: c1 e1 恒等 c1 e1 非 ~ c1 e1 或 c2 c3 ∨ c1 e1 与 c2 ∧
因果图(续) 因果图中的4种基本关系 在因果图的基本符号中,图中的左结点ci表示输入状态(或称原因),右结点ei表示输出状态(或称结果)。ci 与 ei 取值0或1,0表示某状态不出现,1则表示某状态出现。 恒等:若 c1 是1,则 e1 也为1,否则 e1 为0。 非:若 c1 是1,则 e1 为0,否则e1为1。 或:若 c1 或 c2 或 c3 是1,则 e1 为1,否则 e1 为0。 与:若 c1 和 c2 都是1,则 e1 为1,否则 e1 为0。
因果图(续) 因果图中的约束 在实际问题中输入状态相互之间、输出状态相互之间可能存在某些依赖关系,称为“约束”。对于输入条件的约束有E、I、O、R四种约束,对于输出条件的约束只有M约束。 E约束(异):a和b中最多有一个可能为1,即a和b不能同时 为1。 I 约束(或):a、b、c中至少有一个必须为1,即 a、b、c不能同时为0。 O约束(唯一):a和b必须有一个且仅有一个为1。 R约束(要求):a是1时,b必须是1,即a为1时,b不能为0。 M约束(强制):若结果a为1,则结果b强制为0。
因果图(续) 因果图中用来表示约束关系的约束符号: a b 或 I c a b 唯一 O a b 异 E R a b 要求 M a b 强制
因果图(续) 因果图法最终生成的是决策表。利用因果图生成测试用例的基本步骤如下: (1)分析软件规格说明中哪些是原因(即输入条件或输入条件的等价类),哪些是结果(即输出条件),并给每个原因和结果赋予一个标识符。 (2)分析软件规格说明中的语义,找出原因与结果之间、原因与原因之间对应的关系, 根据这些关系画出因果图。 (3)由于语法或环境的限制,有些原因与原因之间、原因与结果之间的组合情况不可能出现。为表明这些特殊情况,在因果图上用一些记号表明约束或限制条件。 (4)把因果图转换为决策表。 (5)根据决策表中的每一列设计测试用例。
3.6.3 因果图法测试举例 实例 用因果图法测试以下程序。 3.6.3 因果图法测试举例 实例 用因果图法测试以下程序。 程序的规格说明要求:输入的第一个字符必须是#或*,第二个字符必须是一个数字,此情况下进行文件的修改;如果第一个字符不是#或*,则给出信息N,如果第二个字符不是数字,则给出信息M。 解题步骤: (1)分析程序的规格说明,列出原因和结果。 (2)找出原因与结果之间的因果关系、原因与原因之间的约束关系,画出因果图。 (3)将因果图转换成决策表。 (4)根据(3)中的决策表,设计测试用例的输入数据和预期输出。
因果图法测试举例(续) (1)分析程序规格说明中的原因和结果: (2)画出因果图(编号为10的中间结点是导出结果的进一步原因): 原因 结果 c1:第一个字符是# e1:给出信息N c2:第一个字符是* e2:修改文件 c3:第二个字符是一个数字 e3:给出信息M c1 c2 c3 e1 10 e2 e3 ~ ∨ E ∧
因果图法测试举例(续) (3)将因果图转换成如下所示的决策表: 1 2 3 4 5 6 7 8 条件: C1 C2 C3 10 动作: e1 动作: e1 e2 e3 不可能 √ 测试用例 #3 #A *6 *B A1 GT 规则 选项
因果图法测试举例(续) (4)根据决策表中的每一列设计测试用例: 测试用例编号 输入数据 预期输出 1 #3 修改文件 2 #A 给出信息M *6 4 *B 5 A1 给出信息N 6 GT 给出信息N和信息M
习题 1、使用因果图法为三角形问题设计测试用例。 2、某软件的一个模块的需求规格说明书中描述: (1)年薪制员工:严重过失,扣年终风险金的4%;过失,扣年终风险金的2%。 (2)非年薪制员工:严重过失,扣当月薪资的8%;过失,扣当月薪资的4%。 请绘制出因果图和判定表,并给出相应的测试用例。
3.7 决策表法 3.7.1 决策表 3.7.2 决策表应用 3.7.3 决策表测试应用案例
3.7.1 决策表 在所有的黑盒测试方法中,基于决策表(也称判定表)的测试是最为严格、最具有逻辑性的测试方法。 3.7.1 决策表 在所有的黑盒测试方法中,基于决策表(也称判定表)的测试是最为严格、最具有逻辑性的测试方法。 决策表的概念:决策表是分析和表达多逻辑条件下执行不同操作的情况的工具。 决策表的优点:能够将复杂的问题按照各种可能的情况全部列举出来,简明并避免遗漏。因此,利用决策表能够设计出完整的测试用例集合。 在一些数据处理问题当中,某些操作的实施依赖于多个逻辑条件的组合,即:针对不同逻辑条件的组合值,分别执行不同的操作。决策表很适合于处理这类问题。 决策表实例
“阅读指南”决策表 1 2 3 4 5 6 7 8 问题 觉得疲倦? Y N 感兴趣吗? 糊涂吗? 建议 重读 √ 继续 跳下一章 休息 规则 选项
决策表的组成 决策表通常由以下4部分组成: 条件桩—列出问题的所有条件 条件项—针对条件桩给出的条件列出所有可能的取值 动作桩—列出问题规定的可能采取的操作 动作项—指出在条件项的各组取值情况下应采取的动作 条件桩 动作桩 条件项 动作项 规则 将任何一个条件组合的特定取值及相应要执行的动作称为一条规则。在决策表中贯穿条件项和动作项的一列就是一条规则。
决策表的生成 构造决策表的5个步骤: (1) 确定规则的个数。 有n个条件的决策表有2n个规则(每个条件取真、假值)。 (2) 列出所有的条件桩和动作桩。 (3) 填入条件项。 (4) 填入动作项,得到初始决策表。 (5) 简化决策表,合并相似规则。 若表中有两条以上规则具有相同的动作,并且在条件项之间存在极为相似的关系,便可以合并。 合并后的条件项用符号“-”表示,说明执行的动作与该条件的取值无关,称为无关条件。 三角形问题的决策表
三角形问题的决策表 规则 1-8 9 10 11 12 13 规则14 规则15 规则16 条件: c1: a,b,c构成 三角形? c3: a=c? c4: b=c? N - Y 动作: a1: 非三角形 a2: 一般三角形 a3: 等腰三角形 a4: 等边三角形 a5: 不可能 √ 规则 选项
3.7.2 决策表应用 NextDate函数的决策表测试用例设计 3.7.2 决策表应用 NextDate函数的决策表测试用例设计 问题分析:NextDate函数的三个变量之间在输入定义域中存在一定的逻辑依赖关系,由于等价类划分和边界值分析测试都假设了变量是独立的,如果采用上述两种方法设计测试用例,那么这些依赖关系在机械的选取输入值时可能会丢失。而采用决策表法则可以通过使用“不可能动作”的概念表示条件的不可能组合,来强调这种依赖关系。 说明:当决策表规模(指规则的数目,n个条件的决策表 有2n个规则)较大时,可以通过扩展条目决策表(条件使 用等价类)、代数简化表、将大表“分解”为小表等方法 。 实例分析
NextDate函数 为了获得下一个日期,NextDate函数执行如下操作: 如果输入日期不是当月最后一天,则把day变量的值加1; 如果输入日期是1~11月份中某月的最后一天,则把day变量的值复位为1,month变量的值加1; 如果输入日期是12月的最后一天,则day变量和month变量的值都复位为1,year变量的值加1。 关于最后一天的判断: 如果是有31天的月份(1,3,5,7,8,10,12),day变量值为31; 如果是有30天的月份(4,6,9,11), day变量值为30; 如果是有29天的月份(闰年的2月),day变量值为29; 如果是有28天的月份(非闰年的2月),day变量值为28。
NextDate函数的动作桩和条件桩 根据所执行的操作,可列出NextDate函数的动作桩: a1: 不可能;a2: day加1;a3: day复位;a4: month加1;a5: month复位;a6: year加1 考虑到决策表的规模,条件使用month、day、year变量的等价类,在以下等价类集合上建立决策表: 对于month变量的取值 M1: {mouth: mouth有30天};M2: {mouth:mouth有31天,12月除外}; M3: {mouth:mouth有12月}; M4: {mouth:mouth是2月}; 对于day变量的取值 D1:{day:1≤day≤27};D2: {day:day=28}; D3: {day:day=29}; D4: {day:day=30}; D5: {day:day=31}; 对于year变量的取值 Y1:{year:year是闰年};Y2: {year:year不是闰年}
决策表应用(续) 决策表测试法适用于具有以下特征的应用程序: if-then-else逻辑突出;输入变量之间存在逻辑关系;涉及输入变量子集的计算;输入与输出之间存在因果关系。 适用于使用决策表设计测试用例的条件: 规格说明以决策表形式给出,或较容易转换为决策表。 条件的排列顺序不会也不应影响执行的操作。 规则的排列顺序不会也不应影响执行的操作。 当某一规则的条件已经满足,并确定要执行的操作后,不必检验别的规则。 如果某一规则的条件要执行多个操作,这些操作的执行顺序无关紧要。
3.7.3 决策表测试应用案例 用决策表测试法测试以下程序: 3.7.3 决策表测试应用案例 用决策表测试法测试以下程序: 该程序有三个输入变量month、day、year(month、day和year均为整数值,并且满足:1≤month≤12和1≤day≤31),分别作为输入日期的月份、日、年份,通过程序可以输出该输入日期在日历上隔一天的日期。 例如,输入为2004年11月29日,则该程序的输出为2000年12月1日。 (1)分析各种输入情况,列出为输入变量month、day、year划分的有效等价类。 (2)分析程序规格说明,结合以上等价类划分的情况给出问题规定的可能采取的操作(即列出所有的动作桩)。 (3)根据(1)和(2),画出简化后的决策表。
案例分析 month变量的有效等价类: M1: {month=4,6,9,11} M2: {month=1,3,5,7,8,10} day变量的有效等价类: D1: {1≤day≤26} D2: {day=27} D3: {day=28} D4: {day=29} D5: {day=30} D6: {day=31} year变量的有效等价类: Y1: {year是闰年} Y2: {year不是闰年} 考虑各种有效的输入情况,程序中可能采取的操作有以下六种: a1: day+2 a2: day=2 a3: day=1 a4: month+1 a5: month=1 a6: year+1
习题 1、根据教材P85中给出的简化后的决策表,设计相应的测试用例。 2、某软件的一个模块的需求规格说明书中描述: “……对于功率大于50马力的机器或者维修记录不全的或已经运行10年以上的机器应予以优先的维修处理……”。 这里假定“维修记录不全”和“优先维修处理”有严格的定义。 请建立该需求的决策表,并绘制出化简(合并规则)后的决策表。
3.8 错误推测法 错误推测法的概念:基于经验和直觉推测程序中所有可能存在的各种错误,从而有针对性的设计测试用例的方法。 3.8 错误推测法 错误推测法的概念:基于经验和直觉推测程序中所有可能存在的各种错误,从而有针对性的设计测试用例的方法。 错误推测方法的基本思想:列举出程序中所有可能有的错误和容易发生错误的特殊情况,根据它们选择测试用例。例如: 在单元测试时曾列出的许多在模块中常见的错误、以前产品测试中曾经发现的错误等,这些就是经验的总结。 还有,输入数据和输出数据为0的情况、输入表格为空格或输入表格只有一行等。这些都是容易发生错误的情况,可选择这些情况下的例子作为测试用例。
3.9 测试方法的选择 通常,在确定测试方法时,应遵循以下原则: 根据程序的重要性和一旦发生故障将造成的损失来确定测试等级和测试重点。 3.9 测试方法的选择 通常,在确定测试方法时,应遵循以下原则: 根据程序的重要性和一旦发生故障将造成的损失来确定测试等级和测试重点。 认真选择测试策略,以便能尽可能少的使用测试用例,发现尽可能多的程序错误。因为一次完整的软件测试过后,如果程序中遗留的错误过多并且严重,则表明该次测试是不足的,而测试不足则意味着让用户承担隐藏错误带来的危险,但测试过度又会带来资源的浪费。因此测试需要找到一个平衡点。
测试方法的选择(续) 通常在确定测试策略时,有以下5条参考原则: (1)在任何情况下都必须采用边界值分析法。这种方法设计出的测试用例发现程序错误的能力最强。 (2)必要时采用等价类划分法补充测试用例。 (3)采用错误推断法再追加测试用例。 (4)对照程序逻辑,检查已设计出的测试用例的逻辑覆盖 程度。如果没有达到要求的覆盖标准,则应当再补充更多的测试用例。 (5)如果程序的功能说明中含有输入条件的组合情况,则应一开始就选用因果图法。
习题 1、某城市电话号码由三部分组成,分别是: 地区码—— 空白或三位数字; 前 缀—— 非‘0’或‘1’开头的三位数字; 前 缀—— 非‘0’或‘1’开头的三位数字; 后 缀—— 4位数字。 假定被测程序能接受一切符合上述规定的电话号码, 拒绝所有不符合规定的电话号码。要求: (1)请选择适当的黑盒测试方法,写出选择该方法的原因,并使用该方法的步骤,给出测试用例表。 (2)如果所生成的测试用例不够全面,请考虑用别的测试 方法生成一些补充的测试用例。
使用等价类划分法 多于3位数字 少于3位数字 有非数字字符 空白 3位数字 地区码 编号 无效等价类 有效等价类 输入条件 5 6 7 1 2 前缀 200~999 有非数字字符 起始位为’0’ 起始位为’1’ 少于3位数字 多于3位数字 8 9 10 11 12 3 后缀 4位数字 有非数字字符 少于4位数字 多于4位数字 13 14 15 4
测试用例 编号 输入数据 预期输出 地区码 前缀 后缀 1 空白 123 4567 接受(有效) 2 805 9876 3 20A 拒绝(无效) 4 33 234 5678 5 1234 6 2B3 7 013 8 9 23 10 2345 11 1B34 12 34 13 23345 覆盖等价类 1, 3, 4 2, 3, 4 5 6 7 8 9 10 11 12 13 14 15
习题 2、有一个处理单价为5角钱的饮料的自动售货机,相应规格说明如下: 若投入5角钱或1元钱的硬币,按下〖橙汁〗或〖啤酒〗的按钮,则相应的饮料就送出来。(每次只投入一个硬币,只押下一种饮料的按钮) 如投入5角的硬币,按下按钮后,总有饮料送出。 若售货机没有零钱找,则一个显示〖零钱找完〗的红灯会亮,这时再投入1元硬币并按下按钮后,饮料不送出来而且1元硬币也退出来。 若有零钱找,则显示〖零钱找完〗的红灯不会亮,若投入 1元硬币及按饮料按钮,则送出饮料的同时找回5角硬币。 请选择适当的黑盒测试方法,写出选择该方法的原因,并使用该方法的步骤,设计出相应的测试用例。