等价类划分(Equivalence Partitioning)

来源:互联网 发布:js面向对象继承 编辑:程序博客网 时间:2024/06/07 02:20
 

等价类划分:运用的是对组件的输入值域和输出值域进行划分的模式来设计测试用例。

通过对需求文档的分析来得到这些输入值域和输出值域。这是需求文档的深度详细程度精确程度等将对输入值域和输出值域都产生巨大的影响。所以测试人员要在需求文档编写期间积极参与文档的审查工作。

该设计模式应该包括对输入值域和输出值域的划分。

(1)     每个划分出来的等价类应该包含一组值的集合或一个范围内的值。

(2)     每个等价类中,所有的值对于这个组件来说在某种程度上都是等效(价)的。

(3)     此外有效值域和无效值域都应当按照这种方式划分。

在这种模式下测试用例将执行(覆盖)各个等价类。这样的等价类包括对有效输入值域进行划分所得等价类和对无效输入值域进行划分所得的等价类。测试用例还可以被设计为用来测试那些无法被推导出的无效输出值

一个测试用例可以执行(覆盖)任意数量的等价类。每一个测试用例应当包括:

l 对于该组件的输入。

l 该用例所执行(覆盖)的等价类。

l 该用例的期望输出。

等价类设计模式的覆盖率为:

等价类划分覆盖率=(已覆盖的等价类数量/总的等价类数)×100%

已覆盖的等价类数量是指我们在测试用例设计过程中使用等价类划分所设计的测试用例集(test case suite)总共覆盖的等价类数量。总的等价类数量是指一个组件的输入值域和输出值域的所有可能的等价类的总和。


思路:先划分等价类,再设计测试用例来执行(覆盖)每个等价类。等价类将按照该组件的输入和输出域来进行划分。输入域和输出域中所有的有效值域和无效值域都将被考虑。

1、分析该组件的输入域。

先对其两个参数的有效值域进行划分。

l 0≤考试成绩≤80

l 0≤平时成绩≤20

然后对这两个参数的其无效值域进行划分。

l 考试成绩<0

l 考试成绩>80

l 平时表现<0

l 平时表现>20

(当然可能碰到误输入小数点或一些字母、符号等非数字的字符组合。于是在这两个参数的输入域中还划分出以下无效值域。)

l 考试成绩=带小数的浮点数。

l 考试成绩=非数字的字符组合。

l 平时表现=带小数的浮点数。

l 考试成绩=非数字的字符组合。

2、下面来分析一下该组件的输出域。

先对其输出域的有效值域进行划分。

l 80≤总分≤100         将输出 A’(优秀)

l 60≤总分<80             将输出 B’(良好)

l 50≤总分<60           将输出 C’(补考)

l 0≤总分<50               将输出 D’(重修)

l 100<总分                 将输出 error message’(错误信息)

l 总分<0                    将输出 error message’(错误信息)

在此,

总分=考试成绩+平时表现。

(“error message”(错误信息)也在输出域的有效值域之列。这是因为组件的设计文档中已经指明输入的考试成绩与平时表现如果超出其有效值范围,则该将返回一个错误信息(error message)的提示信息。)

以上6种情况之外的输出就是无效输出了。一般来说未在组件设计文档中描述的无效输出比较难被界定出来的。但是一旦测试人员在使用该组件时遇到或界定出某一无效输出时就应当要求开发人员将其加入设计文档,并在新的版本中将其实现。

本例中输出域的无效值域划分为以下等价类。

l output=null”等效于输入的两个参数皆为null

l output=float input”等效于输入参数至少有一个是浮点数

l output=non-numberic input”等效于输入参数至少有一个是非数字

3、总结一下所有的等价类划分。

l 0≤考试成绩≤80
l 80≤总分≤100         将输出 A’(优秀)

l 60≤总分<80           将输出 B’(良好)

l 50≤总分<60           将输出 C’(补考)

l 0≤总分<50            将输出 D’(重修)

l 100<总分              将输出 error message’(错误信息)

l总分<0                将输出 error message’(错误信息)

l output=null”等效于输入的两个参数皆为null

l output=float input”等效于输入参数至少有一个是浮点数

l output=non-numberic input”等效于输入参数至少有一个是非数字

4、设计测试用例来覆盖以上的各个等价类,此时采用逐个覆盖的方法。使我们设计出的用例和被其覆盖的等价类之间的关系显得非常清晰。

1)以下用例是对输入参数与考试成绩相关的等价类进行覆盖

输入参数-考试成绩相关的等价类

注:其中平时表现被设定为任意的有效值15

2)以下用例是对输入参数与平时表现相关的等价类进行覆盖

输入参数-平时表现相关的等价类

注:其中考试成绩被设定为任意的有效值70

3)以下用例是对输入参数的其它无效值域相关的等价类进行覆盖

输入参数的其它无效值域相关的等价类

注:以上带*的输出结果都未在组件设计文档中详细描述。

4)以下用例是对输出域的有效值域的等价类进行覆盖

输出域的有效值域的等价类

5)以下用例是对输出域的无效值域的等价类进行覆盖

输出域的无效值域的等价类

注:以上带*的输出结果都未在组件设计文档中详细描述。

说明:回顾我们设计的测试用例发现,许多用例比较相似。例如007017,不同的只是它们被设计的目的是为了覆盖不同的等价类。仔细观察测试用例还可以发现以上私企测试用例都涵盖了2个输入值和一个输出值。意味着每个用例实际上覆盖了3个等价类:两个输入域的等价类和一个输出域的等价类。下面就来尝试

缩小以上用例的集合

注:以上带*的输出结果都未在组件设计文档中详细描述。

逐个覆盖法和最小集合法才能覆盖所有的等价类。不同的是,逐个覆盖法需要更多的测试用例。而运用最小集合法时,如果测试用例全部通过,则等效于所有等价类都顺利地通过了测试,但是一旦出现了某个或多个用例未通过的情况,我们就必须设计运行更多的测试用例以定位出现缺陷的等价类。

通常来说,分析组件的设计文档、界定并划分等价类的时间远高于产生测试用例和执行测试所花的时间,所以经过初步分析,最小集合法一般不能大量减少测试用例,则一般都直接采用逐个覆盖法所产生的测试用例的集合。