等价类,作为最常用的测试方法之一,最难的地方可能就有两点:如何对每个输入元素进行合适的有效及无效等价类划分,太细,则冗余,太粗,则覆盖率降低;另外对于元素之间有关联和制约关系的情况来说,也需要进行合适的有效及无效等价类划分(如下面的“下一日期”软件中年、月、日之间就存在一定的制约关系)。
以C#语言编写的“下一日期”软件进行等价类设计分析。
第一步,对每个输入条件进行等价类拆分
输入 | 输入条件 | 有效等价类 | 无效等价类 |
年 | 正整数 | 正整数(1) | 小数、字母、特殊字符(9) |
闰年/非闰年 | 非闰年(2) |
| |
>0 | >0(6) | <=0 (10) | |
必填 | 填写(7) | 为空(11) | |
Int型有效性 | -2147483648 ~ 2147483647 (8) | <-2147483648 (12) | |
月 | 正整数 | 正整数(14) | 小数、字母、特殊字符(20) |
1~12 | 二月(15) | <1 (21) | |
必填 | 填写(18) | 为空(23) | |
Int型有效性 | -2147483648 ~ 2147483647 (19) | <-2147483648 (24) | |
日 | 正整数 | 正整数(26) | 小数、字母、特殊字符(33) |
1~31 | 1~28(非闰年2月)(27) | <1 (34) | |
必填 | 填写(31) | 为空(36) | |
Int型有效性 | -2147483648 ~ 2147483647 (32) | <-2147483648 (37) | |
特殊值 | BIOS重置日期 | 1/19/2038 (39) |
|
说明:
1、正整数的无效等价类没有拆分为如非正整数的整数、小数、字母、特殊字符这几大类,而是统一为一类,原因在于对于C#而言,转换文本框中的String值转换int型值时,如果字符串为小数、字母、特殊字符等,均会以异常处理,另外0和负整数属于数值区间中无效等价类的子集,为了避免冗余重复,此处可以忽略。
2、Int型有效性是个非常隐藏的输入条件,如果出入值超出了Int型的定义范围,C#会报出异常,以此检测程序的异常处理。当然无效等价类中的这个年份非常之大,实际使用中用户填写该年份的概率很小,因此bug等级比较低。
注:上述表格中的int有效区间定义的C#中32位类型
3、还有一个很隐蔽的异常测试就是BIOS时间的有效区间。该时间被统一定义为是从1970年1月1日的零时开始计算的(这也是为什么很多计算机或设备上日期设置的下限是该时间,再早就不能设置了)。目前大部分机器是32位机器,所以BIOS用32位数字表述时间的话,最大的时间值为2038年1月19日03:14:08,此时计算机将重置时间为1901年12月13日零时(那时候估计没有人会在用32位机器了O(∩_∩)O~)
4、对于欧洲立法中的教皇阳历规定(9/3/1752~9/13/1752 这十一天在历史上是不存在的),上述表格没有表述。