我们先来看一个java小程序
public class TestProject{public static void main(String args[]){int data[] = new int[10];for(i=1;i<=10;i++)data[i]=i;sout(data[i]);}
}
运行这个程序会发生什么事情呢?在这个程序中,目标是为了创建一个有10个元素的一维数组,但是,在java语言中,当一个数组被定义时,其第一个元素对应的数组下表是0而不是1.所以,上述数组定义后,数组成员的下表最大值为9,程序运行后,会造成数组下表越界的错误产生。
经验表明,在软件开发中大量的错误都发生在输入或输出范围的边界上,而不是发生在输入/输出范围的内部。开发人员最容易在边界上犯错误,所以,针对软件的各种边界情况设计测试用例,可以达到更好的测试效果。这就需要采用边界值分析法来设计测试用例,接下来看看边界值分析法的使用。
边界值分析法(Boundary Value Analysis,BVA)的测试用例来自于等价类的边界,是等价类划分法的补充。根据边界值划分法,等价类分析法中的测试 数据不是选取等价类中典型值或任意值,而是应当选取正好等于、刚刚大于、刚刚小于边界的值作为测试数据
使用边界值分析法设计测试用例,首先应该确定他的边界。有些边界并不是需求中直接给出的,需要我们分析出来,比如一些常见的边界值。
同等价类划分法一样,边界值分析法也应该遵循一定的原则:
如果输入/输出条件规定了值的范围,则应该取刚达到这个范围的边界的值,以及刚刚大于最小值以及刚刚小于最大值的值作为测试输入数据。但为了检查输入数据超过极限值时系统的情况,还需要考虑健壮性取值,会增加一个略超过最大值的和略小于最小值的取值。
例如,假设有一个函数f(x),唯一的输入参数x的取值范围为1<=x<=31.根据这条原则的第一句,他的取值应该为{1,2,30,31}.考虑健壮性测试的话,函数fx中的x的边界取值就变为{0,1,2,30,31,32}
如果有多个输入/输出变量,可以用边界值+正常值的组合模式,即其中一个变量取边界值,其他变量取正常值。
例如,有一个二元函数f(x,y),有2个输入变量x和y,他们的取值范围分别为1<=x<=31,y的取值范围1<=y<=12,如何运用边界值法来设计数据呢?运用边界值法可知x和y的健壮性边界取值分别为{0,1,2,30,31,32}和{0,1,2,11,12,13}。先依次取x边界值,y固定为一个正常值,然再依次取y的边界值,x固定为一个正常值。为保险起见,我们还会对x和y各取一个中间值(如x=15以及y=6,也可以取其他有效值)来进行测试。综上,设计测试数据如下,对x和y的组合输入就应该为{<0,6>,<1,6>,<2,6>,<30,6>,<31,6>,<32,6>,<15,6><15,1><15,2>,<15,11>,<15,12>,<15,13>}
同样的对于有3个输入条件的程序,边界值法的运用也如此。
例如,有一个三原函数f(x,y,z),有三个输入变量:x,y,z。他们的取值范围分别为1<=x<=31,1<=y<=12,1949<=z<=2050.那么测试数据应该为{<0,6,2000><1,6,2000>,<2,6,2000>,<30,6,2000>,<31,6,2000>,<32,6,2000>,<15,6,2000>,<15,0,2000>,<15,1,2000>,<15,2,2000>,<15,11,2000><15,12,2000>,<15,13,2000>,<15,6,1949>,<15,6,1950>,<15,6,2049>,<15,6,2050>,<15,6,2051>}
通常,一个参数如果有上下界,就会有6个边界取值,那么对于有n个输入变量的程序,健壮性测试采用边界值分析程序会产生6n+1个测试数据,也就是是6n+1条测试用例,但也有例外,这要具体视边界值的约束而定。
有一个计算长方体体积的程序,要求输入长宽高,分别用xyz来表示,取值均为1-100.如何对长宽高分别采用边界值分析法来设计测试用例呢?
【解析】
xyz的健壮性边界取值均为{0,1,2,99,100,101}再增加一条中间值,设计的健壮性边界值测试用例如下表所示
| 用例编号 | x | y | z | 预期输出 |
|---|---|---|---|---|
| 长方体-001 | 50 | 50 | 0 | z 超出范围 |
| 长方体-002 | 50 | 50 | 1 | 2 500 |
| 长方体-003 | 50 | 50 | 2 | 5 000 |
| 长方体-004 | 50 | 50 | 50 | 125 000(中间值) |
| 长方体-005 | 50 | 50 | 99 | 247 500 |
| 长方体-006 | 50 | 50 | 100 | 250 000 |
| 长方体-007 | 50 | 50 | 101 | z 超出范围 |
| 长方体-008 | 50 | 0 | 50 | y 超出范围 |
| 长方体-009 | 50 | 1 | 50 | 2 500 |
| 长方体-010 | 50 | 2 | 50 | 5 000 |
| 长方体-011 | 50 | 99 | 50 | 125 000 |
| 长方体-012 | 50 | 100 | 50 | 247 500 |
| 长方体-013 | 50 | 101 | 50 | y 超出范围 |
| 长方体-014 | 0 | 50 | 50 | x 超出范围 |
| 长方体-015 | 1 | 50 | 50 | 2 500 |
| 长方体-016 | 2 | 50 | 50 | 5 000 |
| 长方体-017 | 99 | 50 | 50 | 125 000 |
| 长方体-018 | 100 | 50 | 50 | 247 500 |
| 长方体-019 | 101 | 50 | 50 | x 超出范围 |
边界值一般和等价类一起搭配应用,找到有效数据和无效数据的分界点(最大值和最小值)及其两边的点进行测试,形成一套完整的测试方案。边界值数据本质上可以归为有效和无效的范畴,但从测试技术角度来讲,需要单独拿出来测试。
边界值分析法和等价类划分法之间最大的区别就是,边界值分析考察正处于等价类划分的边界或在边界附近的状态
边界值分析通过选择等价类边界作为测试用例,不仅重视输入条件边界,而且也必须考虑输出域边界。比如某程序需要输出一个0到100的数,那么针对输出域也要取边界进行测试。
