书中曾用悬崖形容软件边界:如果在悬崖峭壁边可以自信而安全地行走而不掉下去,平地就几乎不在话下了。边界条件是特殊情况,因为编程在根本上说在边界上容易产生问题。实践表明,故障往往出现在定义域或值域的边界上。
1.边界值分析法的概念
边界值分析法就是对输入的边界值进行测试的一种黑盒测试方法,通常边界值分析法是作为对等价类划分方法的补充,这种情况下,其测试用例来自等价类的边界。
#include <cstring> #include <cstdio> #include <iostream> #include <cstdlib> #include <cmath> using namespace std; int a[10]; int main(){ memset(a, -1, sizeof(a)); for( int i = 1; i <= 10; i ++) a[i] = i; return 0; }
上述代码是很常见的数组越界问题,数组的范围为0~9,而上述赋值语句却是在1~10范围内操作,因此,在上述代码实现中a[0]=-1,而非我们一开始希望的a[0]=0。这都不是我们希望得到的结果。
2.边界值分析法选择测试用例原则
1) 如果输入条件规定了值的范围,则应取刚达到这个范围的边界值、以及刚超越这个范围边界的值作为测试输入数据
2) 如果输入条件规定了值的个数,则选取最大个数、最小个数、比最大个数多一、比最小个数少一的数作为测试数据
3) 根据规格说明的每个输出条件,使用规则1)
4) 根据规格说明的每个输出条件,使用规则2)
5) 若输入域是有序集合,则选取集合的第一个元素和最后一个元素作为测试用例
6) 如果程序使用了一个内部数据结构,则应当选择内部数据结构上得边界值作为测试用例
7) 分析规格说明,找出其他可能的边界条件
3.使用边界分析法设计测试用例
1)首先确定边界情况数据
2)选取正好等于,刚刚大于或刚刚小于边界的值作为测试,而不是选取等价类中的典型值或任意值。
4.小实例
- 问题描述:NextData函数包含三个变量:month,day,year,函数的输出为输入日期的后一天。
- 要求输入变量month,day,year均为整数值,并且满足下列条件:
- 1≤month≤12
- 1≤day≤31
- 1812≤year≤2012
- 等价类划分法:http://www.cnblogs.com/tju-crab/p/4354643.html在这篇博客中应用等价类划分法在这个实例上了
- 测试用例设计:
用例编号 | 输入 | 预期输出 | ||
year | month | day | ||
1 | 1811 | 2 | 1 | null |
2 | 2013 | 2 | 1 | null |
3 | 1812 | 0 | 1 | null |
4 | 1812 | 13 | 1 | null |
5 | 1812 | 2 | 0 | null |
6 | 1812 | 2 | 29 | 1812/3/1 |
7 | 1812 | 2 | 30 | null |
8 | 1812 | 3 | 0 | null |
9 | 1812 | 3 | 31 | 1812/4/1 |
10 | 1812 | 3 | 32 | null |
11 | 1812 | 4 | 0 | null |
12 | 1812 | 4 | 30 | 1812/5/1 |
13 | 1812 | 4 | 31 | null |
14 | 1813 | 2 | 28 | 1813/3/1 |
15 | 1813 | 2 | 29 | null |
16 | 1812 | 12 | 31 | 1813/1/1 |
17 | 2012 | 12 | 31 | 2013/1/1 |
- 代码实现:
bool isLeap( int year){ if( year % 4 != 0 ) return false; else if( year % 100 != 0 ) return true; else if( year % 400 == 0 ) return true; else return false; } void NextDate( int month, int day, int year){ if( year >= 1812 && year <= 2012){ if(month >= 1 && month <= 12){ if(month == 2){ if(isLeap(year)){ if(day >= 1 && day < 29){ cout << year << "年" << month << "月" << day + 1 << "日" << endl; } else if(day == 29){ cout << year << "年" << 3 << "月" << 1 << "日" << endl; } } else{ if(day >= 1 && day < 28){ cout << year << "年" << month << "月" << day + 1 << "日" << endl; } else if(day == 28){ cout << year << "年" << 3 << "月" << 1 << "日" << endl; } } } else if(month == 2 || month == 4 || month == 6 || month == 9 || month == 11 ){ if(day >= 1 && day < 30){ cout << year << "年" << month << "月" << day + 1 << "日" << endl; } else if(day == 30){ cout << year << "年" << month + 1 << "月" << 1 << "日" << endl; } } else{ if(day >= 1 && day < 31){ cout << year << "年" << month << "月" << day + 1 << "日" << endl; } else if(day == 31){ if(month == 12){ cout << year + 1 << "年" << 1 << "月" << 1 << "日" << endl; } else{ cout << year << "年" << month + 1 << "月" << 1 << "日" << endl; } } }