黑盒测试案例设计技术--等价类划分法

什么是测试用例

所谓的测试用例设计就是将软件测试的行为活动,作一个科学化的组织归纳。软件测试是有组织性、步骤性和计划性的,而设计软件测试用例的目的,就是为了能将软件测试的行为转换为可管理的模式。软件测试是软件质量管理中最实际的行动,同时也是耗时最多的一项。基于时间因素的考虑,软件测试行为必须能够加以量化,才能进一步让管理阶层掌握所需要的测试过程,而测试用例就是将测试行为具体量化的方法之一。

简单地说,测试用例就是设计一个情况,软件程序在这种情况下,必须能够正常运行并且达到程序所设计的执行结果。如果程序在这种情况下不能正常运行,而且这种问题会重复发生,那就表示软件测试人员已经测出软件有缺陷,这时候就必须将这个问题标示出来,并且输入到问题跟踪系统内,通知软件开发人员。软件开发人员接获通知后,将这个问题修改完成于下一个测试版本内,软件测试工程师取得新的测试版本后,必须利用同一个用例来测试这个问题,确保该问题已修改完成。

因为我们不可能进行穷举测试,为了节省时间和资源,提高测试效率,必须要从数据量极大的可用测试数据中精心挑选出具有代表性或特殊性的测试数据来进行测试。

使用测试用例的好处主要体现在以下几个方面:

①在开始实施测试之前设计好测试用例,可以避免盲目测试并提高测试效率。

②测试用例的使用令软件测试的实施重点突出,目的明确。

③在软件版本更新后只需修正少部分的测试用例便可开展测试工作,降低工作强度,缩短项目周期。

④功能模块的通用化和复用化使软件易于开发,而测试用例的通用化和复用化则会使软件测试易于开展,并随着测试用例的不断精化,其效率也不断攀升。

下面将具体介绍几种常用的黑盒测试用例设计方法。

等价类划分法

等价类划分是一种典型的黑盒测试方法,用这一方法设计测试用例完全不考虑程序的内部结构,只根据对程序的要求和说明,即需求规格说明书。我们必须仔细分析和推敲说明书的各项需求,特别是功能需求。把说明书中对输入的要求和输出的要求区别开来并加以分解。

由于穷举测试工作量太大,以至于无法实际完成,促使我们在大量的可能数据中选取其中的一部分作为测试用例。例如,在不了解等价分配计数的前提下,我们做计算器程序的加法测试时,测试了1+1,1+2,1+3和1+4之后,还有必要测试1+5和1+6吗,能否放心地认为它们是正确的?我们感觉1+5和1+6,与前面的1+1,1+2都是很类似的简单加法。

等价类划分的方法是把程序的输入域划分成若干部分,然后从每个部分中选取少数代表性数据作为测试用例。每一类的代表性数据在测试中的作用等价于这一类中的其他值,也就是说,如果某一类中的一个例子发现了错误,这一等价类中的其他例子也能发现同样的错误;反之,如果某一类中的一个例子没有发现错误,则这一类中的其他例子也不会查出错误(除非等价类中的某些例子属于另一等价类,因为几个等价类是可能相交的)。使用这一方法设计测试用例,首先必须在分析需求规格说明的基础上划分等价类,列出等价类表。

1、划分等价类和列出等价类表

等价类是指某个输入域的子集合。在该子集合中,各个输入数据对于发现程序中的错误都是等效的。并合理地假定:测试某个等价类的代表值就等于对这一类其他值的测试。

因此,可以把全部输入数据合理地划分为若干等价类,在每一个等价类中取一个数据作为测试输入条件,就可以用少量代表性的测试数据取得较好的测试结果。等价类划分有两种不同的情况:有效等价类和无效等价类。

有效等价类:指对于程序的规格说明来说是合理的、有意义的输入数据构成的集合。利用有效等价类可以检验程序是否实现了规格说明中所规定的功能和性能。

无效等价类:与有效等价类的定义相反。

设计测试用例时,要同时考虑这两种等价类。因为软件不仅要能接收合理的数据,也要能经受意外的考验。这样的测试才能确保软件具有更好的可靠性。

下面给出6条确定等价类的原则:

①在输入条件规定了取值范围或值的个数的情况下,可以确立一个有效等价类和两个无效等价类。

②在输入条件规定了输入值的集合或者规定了“必须如何”的条件的情况下,可以确立一个有效等价类和一个无效等价类。

③在输入条件是一个布尔量的情况下,可确定一个有效等价类和一个无效等价类。

④在规定了输入数据的一组值(假定n个),并且程序要对每一个输入值分别处理的情况下,可确立n个有效等价类和一个无效等价类。

⑤在规定了输入数据必须遵守的规则的情况下,可确立一个有效等价类(符合规则)和若干个无效等价类(从不同角度违反规则)。

⑥在确知已划分的等价类中,各元素在程序处理中的方式不同的情况下,则应再将该等价类进一步划分为更小的等价类。

在确立了等价类之后,建立等价类表,列出所有划分出的等价类如下表所示:

2、确定测试用例

根据已列出的等价类表,按以下步骤确定测试用例:

①为每个等价类规定一个唯一的编号。

②设计一个新的测试用例,使其尽可能多地覆盖尚未覆盖的有效等价类。重复这一步,最后使得所有有效等价类均被测试用例所覆盖。

③设计一个新的测试用例,使其只覆盖一个无效等价类。重复这一步使所有无效等价类均被覆盖。

在寻找等价区间时,设法把软件的相似输入、输出、操作分成组,这些组就是等价区间。

等价类的重要问题是它们构成的集合的划分,其中,划分是指互不相交的一组子集,这些子集的并是整个集合。这对于测试有两点非常重要的意义:表示整个集合这个事实提供了一种形式的完备性,而互不相交可保证一种形式的无冗余性。由于子集是由等价关系决定的,因此子集的元素都有一些共同点。等价类测试的思想是通过每个等价类中的一个元素标识测试用例。如果广泛选择等价类,则这样可以大大减低测试用例之间的冗余。

为了便于理解,以下讨论涉及有两个变量X1和X2的函数F。如果函数F实现为一个程序,则输入变量X1和X2将拥有以下边界,以及边界内的区间:

a≤X1≤d,区间为[a,b),[b,c),[c,d]                                

e≤X2≤g,区间为[e,f),[f,g]

其中方括号和圆括号分别表示闭区间和开区间的端点。X1,X2的无效值是X1d,X2g。以此作为例子,我们将进一步讨论等价类划分法。

弱一般等价类测试

采用上面给出的标记,弱一般等价类测试通过一个测试用例中的每个等价类(区间)的一个变量实现(请注意单边假设作用)。对于前面给出的例子,可得到如下图所示的弱等价类测试用例。

由函数的定义可知,带阴影的矩形中的任何点都是函数F的有效输入。这三个测试用例使用每个等价类中的一个值。我们以对称方式标识这些测试用例,于是得到外在的模式。事实上,永远都有等量的弱等价类测试用例,因为划分中的类对应最大子集数。

强一般等价类测试

强一般等价类测试基于多缺陷假设,因此需要等价类笛卡尔积的每个元素对应的测试用例,如下图所示:

请注意,这些测试用例的模式与命题逻辑中的真值表构造具有相似性。笛卡尔积可以保证两种意义上的“完备性”:一是覆盖所有的等价类,二是有可能的输入组合中的一个。

事实上,“好的”等价类测试的关键是等价关系的选择。注意被“相同处理”的输入。在大多数情况下,等价类测试定义输入定义域的类。没有理由不能根据被测程序函数的输出值域定义等价关系,我们可以看到,这对于三角形问题是最简单的方法。

弱健壮等价类测试

这种测试的名称显然与直觉矛盾,且自相矛盾。怎么能够既弱又健壮呢?说它健壮,是因为这种测试考虑了无效值;说它弱,是因为有单缺陷假设。

1、对于有效输入,使用每个有效类的一个值。(就像我们在所谓弱一般等价类测试中所做的一样。请注意,这些测试用例中的所有输入都是有效的。)

2、对于无效输入,测试用例将拥有一个无效值,并保持其余的值都是等效的。(因此,“单缺陷”会造成测试用例失败。)

按照这种策略产生的测试用例如下图所示:

健壮等价类测试有两个问题。第一个问题是,规格说明常常并没有定义无效测试用例所预期的输出是什么。(我们可以把这看作是规格说明的不足,但是这并不能解决问题。)因此,测试人员需要花费大量时间定义这些测试用例的输出。第二个问题是,强类型语言没有必要考虑无效输入。传统等价类测试是诸如FORTRAN和COBOL这样的语言占统治地位的年代的产物,因此那时这种错误很常见。事实上,正是由于经常出现这种错误,才促使人们实现强类型语言。

对于第二个问题,应该是指对于纯编程语言而言的。在实际的项目中,由于人的因素(人总会犯错误,即使编程语言本身再怎么完美,诸如Java、Python、C++这样的强类型语言,也无法避免),以及业务的具体要求,无效输入往往要考虑业务因素,所以任何时刻都必须考虑无效输入。

强健壮等价类测试

至少这种测试的名称既不与直觉矛盾,也不自相矛盾,只是有些冗余。像以前的定义一样,健壮是指要考虑无效值,强是指多缺陷假设。

我们从所有的等价类笛卡尔积的每个元素中获得测试用例,如下图所示:

下面我们将结合三角形问题,来实际应用等价类划分的方法。三角形问题是这样的经典,以至于虽然大家都知道它是经典问题,面试和笔试中还是会遇到。

例题:根据下面给出的规格说明,利用等价类划分的方法,给出足够的测试用例。“一个程序读入3个整数,把这3个数值看作一个三角形的3条边的长度值。这个程序要打印信息,说明这个三角形是不等边的、是等腰的、是等边的,或者不能构成三角形”。

在描述问题时,我们提到有四种可能出现的输出:非三角形、不等边三角形、等腰三角形和等边三角形。可以使用这些输出标识如下所示的输出(值域)等价类:

R1={:有三条边a、b和c的等边三角形}

R2={:有三条边a、b和c的等腰三角形}

R3={:有三条边a、b和c的不等边三角形}

R4={:三条边a、b和c的不构成三角形}

四个弱一般等价类测试用例是:

由于a、b和c没有有效区间,则强一般等价类测试用例与弱一般等价类测试用例相同。

考虑a、b和c的无效值产生的以下额外弱健壮等价类测试用例:

以下是额外强健壮等价类测试用例三维立方的一个“角”:

请注意,预期输出如何完备地描述无效输入值。

等价类测试显然对用来定义类的等价关系很敏感。如果在输入定义域上定义等价类,则可以得到更丰富的测试用例集合。三个整数a、b和c有些什么可能的取值呢?这些整数可以相等,有一对整数相等(有三种相等方式),或都不相等。

D1={:a=b=c},D2={:a=b,a≠c},D3={:a=c,a≠b}

D4={:b=c,a≠b},D5={:a≠b,a≠c,b≠c}

作为一个单独的问题,我们可以通过三角形的性质来判断三条边是否构成一个三角形。(例如,三元组<1,4,1>有一对相等的边,但是这些边不构成一个三角形。)

D6={:a≥b+c},D7={:b≥a+c},D8={:c≥a+b}

如果我们要彻底一些,可以将“大于或等于”分解为两种不同的情况,这样D6就变成

D6′={:a=b+c},D6″={:a>b+c},同样对于D7和D8也有类似的情况。

列出等价类表,如下所示:

设计测试用例:输入顺序是[A,B,C],如下表所示:

请记住,等价分配的目标是把可能的测试用例组合缩减到仍然足以满足软件测试需求为止。因为,选择了不完全测试,就要冒一定的风险,所以必须仔细选择分类。

关于等价分配的最后一点要注意的是,这样做有可能不客观。科学有时也是一门艺术。测试同一个复杂软件的两个测试人员,可能会制定出两组不同的等价区间。只要审查等价区间的人认为它们都足以覆盖测试对象就可以了。

你可能感兴趣的:(测试)