1、第五章 黑盒测试案例设计技术5.1 概述本章介绍黑盒测试的概念和进行黑盒测试的目的与意义,以及关于等价类划分、边界值分析、因果图法、判定表法、正交试验法、功能图法等测试用例设计方法的原理与实现,并从测试设计说明、测试用例说明、测试程序说明三个方面介绍如何编写测试用例,最后总结一个 ATM 的例子体现如何设计测试用例。5.2 测试用例设计方法初涉软件测试者可能认为拿到软件后就可以立即进行测试,并希望马上找出软件所有缺陷,这种想法就如同没有受过工程训练的开发工程师急于去编写代码一样。软件测试也是一个工程,也相应安装工程的角度去认识软件测试,在具体的测试实施之前,我们需要明白我们测试什么,怎么测试等
2、,也就是说通过制定测试用例指导测试的实施。5.2.1 什么是测试用例所谓测试用例设计就是将软件测试的行为活动,作一个科学化的组织归纳。软件测试是有组织性、不周详和计划性的,而设计软件测试用例的目的,就是为了能将软件测试的行为转换为可管理的模式。软件测试时软件质量管理中最实际的行动,同时也是耗时最多的一项。基于时间因素的考虑,软件测试行为必须能够加以量化,才能进一步让管理阶层掌握所需要的测试过程,而测试用例就是将测试行为具体量化的方法之一。简单的说,测试用例就是设计一个情况,软件程序在这种情况下,必须能够正常运行并且达到程序所设计的执行结果。如果程序在这种情况下不能正常运行,而且这种问题会重复发
3、生,那就表示软件程序人员已经测出软件有缺陷,这时候就必须将这个问题标示出来,并且输入到问题跟踪系统内,通知软件开发人员。软件开发人员接获通知后,将这个问题修改完成于下一个测试版本内,软件测试工程师取得新的测试版本后,必须利用同一个用例来测试这个问题,确保该问题已修改完成。因为我们不可能进行穷举测试,为了节省时间和资源、提高测试效率,必须要从数量极大的可用测试数据中精心挑选出具有代表性或特殊性的测试数据来测试。使用测试用例的好处主要体现在以下几个方面。 在开始实施测试之前设计好测试用例,可以避免盲目测试并提高测试效率。 测试用例的使用领软件测试的实施重点突出、目的明确。 在软件版本更新后只需修正
4、少部分的测试用例便可开展测试工作,降低工作强度,缩短项目周期。 功能模块的通用化和复用化使软件测试易于开展,并随着测试用例的不断精化其效率也不断攀升。具体的黑盒测试用例设计方法包括等价类划分法、边界值分析法、错误推测法、因果图法、判定表驱动法、正交试验设计法、功能图法等。应该说,这些方法是比较实用的,但采用什么方法,在使用时自然要针对开发项目的特点对方法加以适当的选择。下面我们讨论集中常用的方法。5.2.2 等价类划分法等价类划分是一种典型的黑盒测试方法,用这一方法设计测试用例完全不考虑程序的内部结构,只根据对程序的要求和说明,即需求规格说明书。我们必须仔细分析和推敲说明书的各项需求,特别是功
5、能需求。把说明书中对输入的要求和输出的要求区别开来并加以分解。由于穷举测试工作量太大,以至于无法实际完成,促使我们在大量的可能数据中选取其中的一部分作为测试用例。例如,在不了解等价分配技术的前提下,我们做计算器程序的加法测试时,测试了 1+1,1+2,1+3,1+4 之后,还有必要测试 1+5,1+6 吗,能否放心地认为他们是正确的?我们感觉 1+5,1+6,与前面的1+1,1+2 都是很类似的简单加法。等价类划分的办法是把程序的输入域划分成若干部分,然后从每个部分中选取少数代表性数据作为测试用例。每一类的代表性数据在测试中的作用等价于这一类中的其他值,也就是说,如果某一类中的一个例子发生了错
6、误,这一等价类中的其他例子也能发生同样的错误;反之,如果某一类中的一个例子没有发现错误,则这一类中的其他例子也不会查出错误(除非等价类中的某些例子属于另一等价类,因为几个等价类是可能相交的) 。使用这一方法设计测试用例,首先必须在分析需求规格说明的基础上划分等价类,列出等价类表。1. 划分等价类和列出等价类表等价类是指某个输入域的子集合。在该子集合中,各个输入数据揭露程序中的错误都是等效的。并合理地假定:测试某等价类的代表值就等于对这一类其他值的测试。因此,可以把全部输入数据合理的划分为若干等价类,在每一个等价类中取一个数据作为测试的输入条件,就可以用少量代表性的测试数据取得较好的测试结果。等
7、价类划分有两种不同的情况:有效等价类和无效等价类。有效等价类:指对于程序的规格说明来说是合理的,有意义的输入数据构成的集合。利用有效等价类可检验程序是否实现了规格说明中所规定的功能和性能。无效等价类:与有效等价类的定义恰巧相反。设计测试用例时,要同时考虑这两种等价类。因为软件不仅要能接收合理的数据,也要能经受意外的考验。这样的测试才能确保软件具有更高的可靠性。下面给出 6 条确定等价类的原则: 在输入条件规定了取值范围或值的个数情况下,可以确立一个有效等价类和两个无效等价类。 在输入条件规定了输入值的集合或者规定了“必须如何”的条件的情况下,可以确立一个有效等价类和一个无效等价类。 在输入条件
8、是一个布尔量的情况下,可确定一个有效等价类和一个无效等价类。 在规定了输入数据的一组值(假定 n 个) ,并且程序要对每一个输入值分别处理的情况下,可确定 n 个有效等价类和一个无效等价类。 在规定了输入数据必须遵守的规则的情况下,可确立一个有效等价类(符合规则)和若干个无效等价类(从不同角度违反规则) 。 在确定已划分的等价类中,各元素在程序处理中的方式不同的情况下,则应再将该等价类进一步地划分为更小的等价类。在确立了等价类之后,建立等价类表,列出所有划分出的等价类如表所示。表 5-1 等价类表示例输入条件 有效等价类 无效等价类 输入条件 有效等价类 无效等价类 2. 确定测试用例根据已列
9、出的等价类表,按以下步骤确定测试用例: 为每个等价类规定一个唯一的编号。 设计一个新的测试用例,使其尽可能多的覆盖尚未覆盖的有效等价类。重复这一步,最后使得所有有效等价类均被测试用例所覆盖。 设计一个新的测试用例,使其只覆盖一个无效等价类。重复这一步使所有无效等价类均被覆盖。在寻找等价区间时,想办法把软件的相似输入、输出、操作分成组。这些组就是等价区间。例题:根据下面给出的规格说明,利用等价类划分的方法,给出足够的测试用例。 “一个程序读入 3 个整数,把这三个数值看作一个三角形的三条边的长度值。这个程序要打印出信息,说明这个三角形是不等边的、是等腰的、还是等边的” 。我们可以设三角形的三条边
10、为 A,B ,C。如果他们能够构成三角形的 3 条边,必须满足:A0, B0, C0, 且 A+BC, B+CA, A+CB。如果是等腰的,还要判断 A=B,或 B=C,或 A=C。如果是等边的,则需判断是否 A=B,且 B=C,且 A=C。列出等价类表,如表 5-2 所示。设计测试用例:输入顺序是【A,B ,C】 ,如表 5-3 所示。请记住,等价分配的目标是把可能的测试用例组合缩减到仍然足以满足软件测试需求为止。因为,选择了不完全测试,就要冒一定的风险,所以必须仔细选择分类。关于等价分配最后要讲的一点是,这样做有可能不客观。科学有时也是一门艺术。测试同一个复杂程序的两个软件测试员,可能会制
11、定出两种不同的等价区间。只要审查等价区间的人都认为他们足以覆盖测试对象就可以了。5.2.3 边界值分析法人们从长期的测试工作经验得知,大量的错误是发生在输入或输出范围的边界上的,而不是在输入范围的内部。因此针对各种边界情况设计测试用例,可以查出更多的错误。例如,在做三角形计算时,要输入三角形的 3 个边长A、B 、C。这三个数值应当满足 A0, B0,C0, A+BC, A+CB, B+CA,才能构成三角形。但如果把 6 个不等式中的任何一个大于号“”错写成大于等于号“” ,那就不能构成三角形。问题恰恰出现在容易被疏忽的边界附近。这里所说的边界是指相当于输入等价类和输出等价类而言,稍高于其边界
12、值及稍低于其边界值的一些特定情况。1. 边界条件我们可以想象一下,如果在悬崖峭壁边可以自信地安全行走,平地就不在话下了。如果软件在能力达到极限时能够运行,那么在正常情况下一般也就不会有什么问题。边界条件是特殊情况,因为编程从根本上说不怀疑边界有问题。下面的一段源代码说明了在一个极简单的程序中是如何产生边界条件问题的。rem create a 10 element integer arrayrem initialize each element to-1dim data(10) as integerdim I as integerfor i=1 to 10data(i) =-1next iend这段代码的意图是创建包含 10 个元素的数组,并为数组中的每一个元素赋初值-1.看起来相当简单。它建立了包含 10 个整数的数组 data 和一个计数值i。For 循环是从 110,数组中从第一个元素到第十个元素被赋予数值-1. 那么边界问题在哪儿呢?在大多数开发语言脚本中,应当以声明的范围定义数组,在本例中定义语句是 dim data (10) as interger,第一个创建的元素是 data(0),而不是 data(1)。该程序实际上创建了一个从 data(0) data(10)共 11 个元素的数组。