3、 理想等价类
这种等价类是严格按照等价类的定义来划分的,即划分的各个等价类中,每个等价类都满足每个可测数据对揭示所有可能的缺陷都是等价的,并且划分的各个等价类中各自任意取一个可测数据做为测试数据可以将全部的缺陷都揭示出来。
理想等价类在实际情况中是很罕见的,除非只有很少的一两种可能的出错情况,否则很难划分成对揭示所有可能缺陷都等价的子集。所以在实际使用时,没有必要去寻找理想等价类,否则徒然浪费时间,一般采用强等价类或弱等价类进行测试就足够了。
1.3 等价类的判定方法
当将一个输入域进行等价类划分后,划分出来的子集是否是等价的基本上靠经验判断,这给使用等价类分法带来很大的难度,凭经验划分出来的等价类也许并不是真的等价类,如何才能确定划分的类是等价类呢?
按照前面讲过的弱等价类与强等价类的定义,要知道划分的子集是否等价类先要知道又那些种类的可能缺陷,然后将划分的等价类对照可能的缺陷进行验证看是否能揭示出那些可能发生的缺陷。
这种判定方法的缺点是必须先知道会发生那些可能的缺陷,实际情况中往往并不知道所有可能的缺陷,那么在实际情况中如何采取一些简单方法来判定一个子集是否是等价类呢?
当一个子集的处理过程与输出完全一致时,基本上可以认为是等价类,处理过程是否相同很容易从需求和设计中得出。但是现实情况中往往同一个等价类中的不同数据对应的输出结果并不相同,所以这种方法并不能对所有的情况都适用。
其实没有什么特别好的办法可以用来判断一个子集中的任一数据对揭露程序中的缺陷都是等价的,除非将所有数据测试一遍。但是有一些条件可以协助判断出某个子集不是等价类。
1、路径判定法
最容易判定一个子集是否是等价类的方法就是路径判定法,路径判定法的基本思想是:对于子集中的任一数据,如果执行路径并不完全相同,那么这个子集不是等价类。
需要注意的是,路径判定法的反命题并不成立,即不能由执行路径相同就推断出子集中的数据是等价类。因为执行路径相同情况下得到的结果不一定相同,举例如下:
int mul(int a)
{
return (a*10000);
}
在mul()函数中,不论a输入多少,执行路径都只有一条,但是当a超过一定大小时,会出现整数乘法溢出,显然不能将a的任意取值都作为等价类。
路径相同之所以不能认为是等价类的根本原因在于程序设计中本身可能存在缺陷和遗漏,设计或编码后的程序中的路径本身就可能不正确,测试用例设计时不能假定程序中的路径一定是正确的。
2、概率判定法
概率判定法是通过计算等价子集中的数据揭示某个缺陷的概率来进行判断的方法。如果在一个等价子集中,所有数据的揭示缺陷的概率不相同并有一定差距,那么可以认为不是等价类。
这个判定法的使用并不是说事先需要知道所有可能发生的缺陷,它只需要找到一个缺陷来证明在这种缺陷情况下,子集中的数据在揭示这个缺陷方面的概率是不相同的,那么就可以认为在这种缺陷条件下不是等价类,至少可以认为不是强等价类。
比如前面讲的x>10的划分,{0~10}这个集合中,在写成x>=10的情况下,10和子集中其他数据揭示缺陷的概率是不同的,0~9都不能发现缺陷,测试会通过,也就是说揭示出这个缺陷的概率为0,而 10则能揭示出这个缺陷,所以它们不能划分到同一个等价类里面。
原文转自:http://www.uml.org.cn/Test/201205143.asp