1.4.4 等价类划分
我们已经知道,彻底的软件测试是不现实的,也是不经济的,我们只能通过有限的测试来尽可能多地找出潜在的产品缺陷,要做到这一点,测试的等价类划分是一种可行的思路。
我们可以把所有可能的输入进行归类划分,每个类别中的输入虽然不一样,但是从软件功能的角度看,它们在那个类别中是“等价”的,是没有差别的。我们在每个类别中挑选一个代表进行这个类别的测试,如果测试通过,我们可以基本确认这一类输入都可以通过测试,没有必要在这个类别中选取更多候选输入进行测试。这个思路就是测试用例的等价类划分(Equivalence partitioning)[2]。
假如,某个软件程序的功能是根据用户输入的考试分数来划分成绩等级的,如表1-2所示。
表1-2 考试分数与成绩等级
在不考虑“半分”的情况下,考试分数有0~100这101个可能的值,大于100的值是无效值,小于0的值也是无效值。
101、102、200、5000……这些都是无效的考试分数值,我们无法穷举所有无效的值,但是可以把它们归于一类,称为“大于满分的无效值”。在这个类别中,我们可以挑选其中一个值,比如101进行测试。如果程序可以正确识别出这是无效值,我们可以认为程序可以正确识别和处理所有“大于满分的无效值”。
同理,我们可以用–1或者–888来代表“小于零分的无效值”进行测试。
对于成绩等级中的A等级,它包含的分数区间是一个有限闭区间,只有90~100这11个值。即使可以穷举所有的可能输入进行测试,我们仍然应该用等价类划分类进行测试,从这11个数中挑选一个值(比如95),如果这个值可以被程序正确识别为A等级,我们就可以认为程序可以正确识别和处理所有的“A等级的分数”。
通过等价类划分,我们可以把测试用例的数量大幅减少到一个可控的范围,用较少的测试用例覆盖尽可能多的情况,极大地节省了成本。