等价类划分法

等价类划分法

等价类划分是一种典型的黑盒测试方法,用这一方法设计测试用例完全不考虑程序的内部结构,只根据对程序的要求和说明,即需求规格说明书。我们必须仔细分析和推敲说明书的各项需求,特别是功能需求。把说明书中对输入的要求和输出的要求区别开来并加以分解。 由于穷举测试工作量太大,以至于无法实际完成,促使我们在大量的可能数据中选取其中的一部分作为测试用例。例如,在不了解等价分配计数的前提下,我们做计算器程序的加法测试时,测试了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}

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

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],如下表所示:

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

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

等价类划分法

等价类划分是一种典型的黑盒测试方法,用这一方法设计测试用例完全不考虑程序的内部结构,只根据对程序的要求和说明,即需求规格说明书。我们必须仔细分析和推敲说明书的各项需求,特别是功能需求。把说明书中对输入的要求和输出的要求区别开来并加以分解。 由于穷举测试工作量太大,以至于无法实际完成,促使我们在大量的可能数据中选取其中的一部分作为测试用例。例如,在不了解等价分配计数的前提下,我们做计算器程序的加法测试时,测试了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}

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

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],如下表所示:

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

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


相关文章

  • 2.等价类划分法
  • 功能测试技术 -等价类划分法 东软IT人才实训中心 1 主要内容•• • •什么是等价类划分法等价类的类型等价类的划分原则等价类划分法设计测试用例的步骤 2 等价类划分法•等价类划分法是一种重要的.常用的黑盒测试方法,它将不能穷举的测试过程 ...查看


  • [黑盒测试基本方法]之等价类与边界值
  • 测试用例设计方法之等价类划分与边界值分析 1. 等价类划分 1.1. 前言 我们知道软件测试是根据软件开发各个阶段的规格说明和程序的内部结构而精心设计一批测试用例,并利用这些测试用例运行软件,以发现软件错误的过程.但在设计测试用例时,往往程 ...查看


  • 实例介绍等价类划分法
  • 实例介绍等价类划分法 在软件测试的活动中,穷尽法无疑是最安全最保险的一种方法,但也是成本代价高到不可能实现的一种方法,或许一个软件的所有输入和操作还没有穷尽完,这个软件都没有存在的必要了,甚至测试人员都要老死了.所以,前辈们为我们准备了等价 ...查看


  • 黑盒测试的方法
  • 黑盒测试的方法 1. 等价类划分法. 划分等价类 1) 划分等价类: 等价类是指某个输入域的子集合.在该子集合中,各个输入数据对于揭露程序中的错误都是等效的,并合理地假定:测试某等价类的代表值就等于对这一类其它值的测试.因此,可以把全部输入 ...查看


  • 等价划分的例子
  • 等价划分的例子 例1:某城市的电话号码由三部分组成.这三部分的名称和内容分别是地区码:空白或三位数字: 前 缀:非'0'或'1'开头的三位数:后 缀:四位数字.假定被调试的程序能接受一切符合上述规定的电话号码,拒绝所有不符合规定的号码,就可 ...查看


  • 实验2-黑盒测试之等价类划分
  • 实验2 黑盒测试之等价类划分 一.实验目的 1.掌握等价类划分的方法 2.掌握按等价类方法设计测试用例 二.实验内容 1.请用等价类划分法为三角形问题划分等价类,并设计相应的测试 用例,测试下面三角形问题程序,找出缺陷并改正,记录缺陷. # ...查看


  • 等价关系离散数学
  • 等价关系(4学时) [教学目的] 了解.掌握等价关系及相应的等价类与集合划分的基本概念及例子 [教学要求] 正确地掌握等价关系及相应的等价类与集合划分之间的关系:给定A 上的等价关系R ,会求所有的等价类和商集A/R,或者求与R 相对应的划 ...查看


  • 内蒙古工业大学黑盒测试实验报告
  • 内蒙古工业大学信息工程学院 实 验 报 告 课程名称: 软件测试 实验名称 黑盒测试 实验类型: 验证性□ 综合性□ 设计性□ 实验室名称: 信息工程学院实验室 班级: 软件13-1 学号:2013202050xx 姓名: 某某某 组别: ...查看


  • 白盒测试和黑盒测试
  • 白盒测试和黑盒测试 目录 1. 软件测试基本分类 ............................................................................................... ...查看


热门内容