1、黑盒测试,问题引入,例: 某个软件需求文档中有这样的说明:第一列字符必须是A或B,第二列字符必须是一个数字,在此情况下进行文件的修改。但如果第一列字符不正确,则给出信息L;如果第二列字符不是数字,则给出信息M。,逻辑条件的处理,在所有的黑盒测试方法中,基于判定表(也称决策表)的测试是最为严格、最具有逻辑性的测试方法。 决策表的概念:决策表是分析和表达多逻辑条件下执行不同操作的情况的工具。 决策表的优点:能够将复杂的问题按照各种可能的情况全部列举出来,简明并避免遗漏。因此,利用决策表能够设计出完整的测试用例集合。 在一些数据处理问题当中,某些操作的实施依赖于多个逻辑条件的组合,即:针对不同逻辑条
2、件的组合值,分别执行不同的操作。决策表很适合于处理这类问题。,基于判定表的测试,判定表的原理 判定表的组成 判定表建立的步骤,1. 判定表的原理,判定表 判定表(Decision Table),又叫决策表 判定表是分析和表达多逻辑条件下执行不同操作的工具。 在程序设计发展的初期,判定表被当作编写程序的辅助工具。,2. 判定表的组成,条件桩(Condition Stub) 列出问题的所有条件 动作桩(Action Stub) 列出可能采取的操作 条件项(Condition Entity) 列出条件桩的取值 动作项(Action Entity) 列出条件项各种取值下应该采取的动作,判定表的组成,规
3、则,任何一个条件组合的特定取值及其相应要执行的操作称为规则; 在判定表中贯穿条件项和动作项的一列就是一条规则; 判定表中列出多少组条件取值,也就有多少条规则,即条件项和动作项有多少列。,规则示例:三角形问题,规则(续),规则合并 规则合并就是判定表的简化。 有两条或多条规则具有相同的动作,并且其条件项之间存在着极为相似的关系,就可以将规则合并。,(1)两条规则合并成一条,条件项“”表示与取值无关。,条件项“”在逻辑上包含其它的条件。,(2)两条规则的进一步合并,3. 判定表建立步骤,根据软件规格说明 列出所有的条件桩和动作桩; 确定规则的个数; 假如有n个条件,每个条件有两个取值(0,1),则
4、有2n 种规则; 填入条件项; 填入动作项,得到初始决策表; 简化,合并相似规则(相同动作)。,例:维修机器问题,问题描述: “对于功率大于50马力的机器,并且维修记录不全或已运行10年以上的机器,应给予优先的维修处理” 请建立决策表。,例:维修机器问题(续),(1)列出所有的条件桩和动作桩 条件桩 C1:功率大于50马力吗? C2:维修记录不全吗? C3:运行超过10年吗? 动作桩 A1:进行优先处理 A2:作其他处理,例:维修机器问题(续),(2)确定规则个数 输入条件个数:3; 每个条件的取值:“是”或“否”; 规则个数:2*2*2 =8;,功率大于50马力吗维修记录不全吗运行超过10年
5、吗,例:维修机器问题(续),(3)填入条件项;,利用集合的笛卡尔积计算条件项的取值,例:维修机器问题(续),(4)填入动作项;,1,2合并,5,7合并,6,8合并,例:维修机器问题(续),(5)化简;,案例:三角形问题,问题描述输入三个正整数a、b、c,分别作为三角形的三条边,通过程序判断三条边是否能构成三角形?如果能构成三角形,判断三角形的类型(等边三角形、等腰三角形、一般三角形)。 请用基于判定表的方法设计测试用例。,(1)条件桩 C1:a,b,c构成三角形? C2:a = b? C3:a = c? C4:b = c? (2)规则数 共有四个条件,每个条件的取值为“是”或“否”,因此有24
6、= 16条规则。,一、设计判定表,(3)动作桩A1:非三角形;A2:不等边三角形;A3:等腰三角形;A4:等边三角形;A5:不可能;,(4)判定表,注意: 条件的选择可以大大扩展判定表的规模; 例如:a, b, c构成三角形吗?可以扩展为三个条件: a b + c? b a + c? c a + b? 则规则条数变为26=64,条件桩修改后的判定表,a=b, a=c, bc,二、设计测试用例,课后作业,登陆功能说明书:(用户输入和密码输入) 1)管理员用户名为“admin”,密码为“123456”,正常登陆 2)用户名和密码输入为空,提示 “用户和密码不允许为空” 在用户名和密码非空的情况下:
7、 3)要求用户名必须输入字母,否则提示“输入非法” 4)要求密码必须输入数字,否则提示 “输入非法” 在输入合法的情况下: 5)用户名错误,提示 “用户名和密码输入错误”,用户名和密码清空 6)用户名正确,密码错误,提示 “用户名和密码输入错误”,用户名保留,密码清空,进一步分析,条件 Y1)用户名正确 Y2)用户名为空 Y3)用户名为非字母 Y4)用户名为字母,但错误 M1)密码正确 M2)密码为空 M3)密码为非数字 M4)密码为数字,但错误 动作: A)正常登陆 B)显示提示信息“用户和密码不允许为空” C)显示提示信息“用户名和密码输入错误”,用户名和密码清空 D)显示提示信息“用户名
8、和密码输入错误”用户名保留,密码清空 E)显示提示信息“输入非法”,4.3.4 案例: NextDate函数,问题描述程序有三个输入变量month、day、year,并且满足:1month12、1day31、1900 year 2050。它们分别作为输入日期的月份、日、年份,通过程序可以输出该输入日期在日历上下一天的日期。例如,输入为2005年11月29日,则该程序的输出为2005年11月30日。,NextDate函数,为了获得下一个日期,NextDate函数执行如下操作: 如果输入日期不是当月最后一天,则把day变量的值加1; 如果输入日期是111月份中某月的最后一天,则把day变量的值复位
9、为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: mo
10、nth复位;a6: year加1 考虑到决策表的规模,条件使用month、day、year变量的等价类,在以下等价类集合上建立决策表: 对于month变量的取值M1: month: month有30天;M2: month : month有31天,12月除外; M3: month : month是12月; M4: month : month是2月; 对于day变量的取值D1: day:1day27;D2: day:day=28;D3: day:day=29; D4: day:day=30; D5: day:day=31; 对于year变量的取值Y1:year:year是闰年;Y2: year:y
11、ear不是闰年,第一次尝试,M1=月份:每月有30天 M2=月份:每月有31天 M3=月份:此月是2月 D1=日期:1日期28 D2=日期:日期=29 D3=日期:日期=30 D4=日期:日期=31 Y1=年:年是闰年 Y2=年:年是平年,有256条规则的第一次尝试(互斥条件),注意:年变量对应的等价类是否可以收缩为表中的一个条件?,第二次尝试(重点考虑闰年),M1=月份:每月有30天 M2=月份:每月有31天 M3=月份:此月是2月 D1=日期:1日期28 D2=日期:日期=29 D3=日期:日期=30 D4=日期:日期=31 Y1=年:年是闰年 Y2=年:年不是闰年,第三次尝试(关注日期和
12、月份),M1=月份:每月有30天 M2=月份:每月有31天,12月除外 M3=月份:此月是12月 M4=月份:此月是2月 D1=日期:1日期 27 D2=日期:日期=28 D3=日期:日期=29 D4=日期:日期=30 D5=日期:日期=31 Y1=年:年是闰年 Y2=年:年不是闰年,NextDate函数的判定表,每月30天,每月31天,12月除外,每月30天,每月31天,12月除外,续,此月是12月,此月是2月,此年是闰年,此月是12月,此月是2月,此年是闰年,此月是12月,此月是2月,NextDate函数的精简判定表,每月30天,每月31天,12月除外,续,此年是闰年,此月是12月,此月是
13、2月,28日,NextDate函数的测试用例,指导方针和观察,判定表技术适用的应用程序的特征: if-then-else逻辑很突出 输入变量之间存在逻辑关系 涉及输入变量子集的计算 输入与输出之间存在因果关系,判定表的优点 能把复杂的问题按各种可能的情况一一列举出来 简明而易于理解 可避免遗漏,判定表的缺点 不能表达重复执行的动作,例如循环结构 判定表不能很好地伸缩 有n个条件的决策表有2n 个规则。 解决方法 使用扩展条目判定表、代数简化表,将大表“分解”为小表,查找条件项的判定表式,课后作业,用决策表测试法测试以下程序:该程序有三个输入变量month、day、year(month、day和
14、year均为整数值,并且满足:1month12和1day31),分别作为输入日期的月份、日、年份,通过程序可以输出该输入日期在日历上隔一天的日期。例如,输入为2004年11月29日,则该程序的输出为2004年12月1日。 (1)分析各种输入情况,列出为输入变量month、day、year划分的有效等价类。 (2)分析程序规格说明,结合以上等价类划分的情况给出问题规定的可能采取的操作(即列出所有的动作桩)。 (3)根据(1)和(2),画出简化后的决策表。,进一步分析,month变量的有效等价类:M1: month=4,6,9,11 M2: month=1,3,5,7,8,10M3: month=
15、12 M4: month=2 day变量的有效等价类:D1: 1day26 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:等价类划分法和边界值分析方法都是着重考虑输入条件,但没有考虑输入条件的各种组合、输入条
16、件之间的相互制约关系。这样虽然各种输入条件可能出错的情况已经测试到了,但多个输入条件组合起来可能出错的情况却被忽视了。 问题2:如果在测试时必须考虑输入条件的各种组合,则可能的组合数目将是天文数字,因此必须考虑采用一种适合于描述多种条件的组合、相应产生多个动作的形式来进行测试用例的设计,这就需要利用因果图(逻辑模型)。,3 因果图法,因果图是一种挑选高效测试用例以检查组合输入条件的系统方法. 因果图法的定义 是一种利用图解法分析输入的各种组合情况,从而设计测试用例的方法,它适合于检查程序输入条件的各种组合情况。,1 因果图法的简介,因果图法是基于这样的一种思想:一些程序的功能可以用判定表(或称
17、决策表)的形式来表示,并根据输入条件的组合情况规定相应的操作。 采用因果图法设计测试用例的步骤: (1)根据程序规格说明书描述,分析并确定因(输入条件)和果(输出结果或程序状态的改变),画出因果图。 (2)将得到的因果图转换为判定表。 (3)为判定表中每一列所表示的情况设计一个测试用例。,因果图法的简介(续),因果测试的导出: 将规格说明分解成可以操作的块 鉴别因和果 制作因果图 注明限制,说明不会出现因/果组合 按顺序跟踪图中的状态条件,将图转换为有限判定表,表中的每列代表一个测试用例。 判定表的各列转换为测试用例,因果图法的简介(续),使用因果图法的优点: (1)考虑到了输入情况的各种组合
18、以及各个输入情况之间的相互制约关系。 (2)能够帮助测试人员按照一定的步骤,高效率的开发测试用例。 (3)因果图法是将自然语言规格说明转化成形式语言规格说明的一种严格的方法,可以指出规格说明存在的不完整性和二义性。,因果图基本符号,因果图中用来表示4种因果关系的基本符号:,因果图4种基本关系,因果图中的4种基本关系在因果图的基本符号中,图中的左结点ci表示输入状态(或称原因),右结点ei表示输出状态(或称结果)。ci 与 ei 取值0或1,0表示某状态不出现,1则表示某状态出现。 恒等:若 c1 是1,则 e1 也为1,否则 e1 为0。 非:若 c1 是1,则 e1 为0,否则e1为1。 或
19、:若 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约束(强
20、制):若结果a为1,则结果b强制为0。,因果图(续),因果图中用来表示约束关系的约束符号:,因果图生成测试用例的基本步骤:,因果图法最终生成的是决策表。 (1)分析软件规格说明中哪些是原因(即输入条件或输入条件的等价类),哪些是结果(即输出条件),并给每个原因和结果赋予一个标识符。 (2)分析软件规格说明中的语义,找出原因与结果之间、原因与原因之间对应的关系, 根据这些关系画出因果图。 (3)由于语法或环境的限制,有些原因与原因之间、原因与结果之间的组合情况不可能出现。为表明这些特殊情况,在因果图上用一些记号表明约束或限制条件。 (4)把因果图转换为决策表。 (5)根据决策表中的每一列设计测试
21、用例。,案例,用因果图法测试以下程序。程序的规格说明要求:输入的第一个字符必须是#或*,第二个字符必须是一个数字,此情况下进行文件的修改;如果第一个字符不是#或*,则给出信息N,如果第二个字符不是数字,则给出信息M。 解题步骤: (1)分析程序的规格说明,列出原因和结果。 (2)找出原因与结果之间的因果关系、原因与原因之间的约束关系,画出因果图。 (3)将因果图转换成决策表。 (4)根据(3)中的决策表,设计测试用例的输入数据和预期输出。,因果图法测试举例(续),(1)分析程序规格说明中的原因和结果:(2)画出因果图(编号为10的中间结点是导出结果的进一步原因):,因果图法测试举例(续),(3
22、)将因果图转换成如下所示的决策表:,规则,选项,因果图法测试举例(续),(4)根据决策表中的每一列设计测试用例:,课堂练习,分析中国象棋中走马的实际情况(下面未注明的均指的是对马的说明) 1、如果落点在棋盘外,则不移动棋子; 2、如果落点与起点不构成日字型,则不移动棋子; 3、如果落点处有自己方棋子,则不移动棋子; 4、如果在落点方向的邻近交叉点有棋子(绊马腿),则不移动棋子; 5、如果不属于1-4条,且落点处无棋子,则移动棋子; 6、如果不属于1-4条,且落点处为对方棋子(非老将),则移动棋子并除去对方棋子; 7如果不属于1-4条,且落点处为对方老将,则移动棋子,并提示战胜对方,游戏结束。,
23、其他黑盒测试方法,正交实验设计法 场景法 错误推测法,5正交试验设计法,正交试验设计是研究多因素多水平的一种设计方法,它是根据正交性从全面试验中挑选出部分有代表性的点进行试验,这些有代表性的点具备了“均匀分散,齐整可比”的特点,正交试验设计是一种基于正交表的、高效率、快速、经济的试验设计方法 正交表的构成 行数(Runs):正交表中的行的个数,即试验的次数。 因素数(Factors):欲考察的变量数目,即正交表中列的个数。 水平数(Levels):变量取值的最大个数。 正交表的表示形式: L行数(水平数因素数),用正交表设计测试用例的步骤,1 有哪些因素(变量) 2 每个因素有哪几个水平(变量
24、的取值) 3 选择行数最少的正交表 4 把变量的值映射到表中 5 把每一行的各因素水平的组合做为一个测试用例 6 加上你认为可疑且没有在表中出现的组合,正交表行数的确定: 试验次数(行数)(每列水平数1)1 例:5个3水平因子及一个2水平因子,表示为35*21,试验次数5*(3-1)+1*(2-1)+112,即L12(35*2),正交试验法,正交试验设计法依据Galois理论,从大量的(测试)数据中挑选适量的、有代表性的点,从而合理安排测试的一种科学实验设计方法。 如图所示,从完全测试组合数的27降为组合数9。不难发现,任何一个面都有3个点,也只有3个点,而且任何一条线上只有一个点。,案例:对
25、某人进行查询,假设查询某个人时有三个查询条件:根据“姓名”进行查询根据“身份证号码”查询根据“手机号码”查询考虑查询条件要么不填写,要么填写,此时可用正交表进行设计,变量映射,姓名:0填写,1不填写 身份证号:0填写,1不填写 手机号码: 0填写,1不填写,用L4(23) 设计的测试用例,测试用例如下:1:填写姓名、填写身份证号、填写手机号2:填写姓名、不填身份证号、不填手机号3:不填姓名、填写身份证号、不填手机号4:不填姓名、不填身份证号、填写手机号增补测试用例 5:不填姓名、不填身份证号、不填手机号测试用例减少数: 85,现在的软件几乎都是用事件触发来控制流程的,事件触发时的情景便形成了场
26、景,而同一事件不同的触发顺序和处理结果就形成事件流。 这种在软件设计方面的思想也可以引入到软件测试中,可以比较生动地描绘出事件触发时的情景,有利于测试设计者设计测试用例,同时使测试用例更容易理解和执行。 用例场景用来描述流经用例的路径,从用例开始到结束遍历这条路径上所有基本流和备选流。,6 场景法,场景说明,基本流:是流经用例的最简单路径; 备选流:自基本流开始,之后会在某特定条件下执行; 可能重新加入基本流(流1,流3) 可能起源于另一备选流(流2 ) 终止用例不再重新加入某个流。(流2,流4),遵循上图中每个经过用例的可能路径,可以确定不同的用例场景。从基本流开始,再将基本流和备选流结合起
27、来,可以确定以下用例场景:,案例 ATM机,基本流 - 提取预设金额(10 美元、20 美元、50 美元、100 美元) 备选流 2 - ATM 内没有现金 备选流 3 - ATM 内现金不足 备选流 4 - PIN 有误 备选流 5 - 帐户不存在/帐户类型有误 备选流 6 - 帐面金额不足,案例 ATM机,7 错误推测法,错误推测法的概念:基于经验和直觉推测程序中所有可能存在的各种错误,从而有针对性的设计测试用例的方法。 错误推测方法的基本思想:列举出程序中所有可能有的错误和容易发生错误的特殊情况,根据它们选择测试用例。例如: 在单元测试时曾列出的许多在模块中常见的错误、以前产品测试中曾经
28、发现的错误等,这些就是经验的总结。 还有,输入数据和输出数据为0的情况、输入表格为空格或输入表格只有一行等。这些都是容易发生错误的情况,可选择这些情况下的例子作为测试用例。,黑盒测试法小结 测试方法的选择,通常,在确定测试方法时,应遵循以下原则: 根据程序的重要性和一旦发生故障将造成的损失来确定测试等级和测试重点。 认真选择测试策略,以便能尽可能少的使用测试用例,发现尽可能多的程序错误。因为一次完整的软件测试过后,如果程序中遗留的错误过多并且严重,则表明该次测试是不足的,而测试不足则意味着让用户承担隐藏错误带来的危险,但测试过度又会带来资源的浪费。因此测试需要找到一个平衡点。,测试方法的选择(
29、续),通常在确定测试策略时,有以下5条参考原则: 首先进行等价类划分,包括输入条件和输出条件的等价划分,将无限测试变成有限测试,这是减少工作量和提高测试效率最有效的方法。在任何情况下都必须使用边界值分析方法。经验表明,用这种方法设计出的测试用例发现程序错误的能力最强。 采用错误推断法再追加测试用例,这需要依靠测试工程师的智慧和经验。 对照程序逻辑,检查已设计出的测试用例的逻辑覆盖 程度。如果没有达到要求的覆盖标准,则应当再补充更多的测试用例。 如果程序的功能说明中含有输入条件的组合情况,则应一开始就选用因果图法和判定表驱动法。,对于业务流清晰的系统,可以利用场景法贯穿整个测试案例过程,在案例中
30、综合使用各种测试方法。 对于参数配置类的软件,要用正交试验法选择较少的组合方式达到最佳效果。,习题,1、有一个处理单价为5角钱的饮料的自动售货机,相应规格说明如下: 若投入5角钱或1元钱的硬币,按下橙汁或啤酒的按钮,则相应的饮料就送出来。(每次只投入一个硬币,只押下一种饮料的按钮) 如投入5角的硬币,按下按钮后,总有饮料送出。 若售货机没有零钱找,则一个显示零钱找完的红灯会亮,这时再投入1元硬币并按下按钮后,饮料不送出来而且1元硬币也退出来。 若有零钱找,则显示零钱找完的红灯不会亮,若投入 1元硬币及按饮料按钮,则送出饮料的同时找回5角硬币。 请选择因果图+判定表法,并给出该方法的详细步骤,设计出相应的测试用例。,进一步分析,原因: 1.售货机有零钱找 2.投入1元硬币 3.投入5角硬币 4.按下橙汁按钮 5.按下啤酒按钮,结果: 21.售货机零钱找完灯亮 22.退还1元硬币 23.退还5角硬币 24.送出橙汁饮料 25.送出啤酒饮料,问题与讨论,