实验四 黑盒测试2
1.实验目的
(1)能熟练应用黑盒测试技术进行测试用例设计;
(2)对测试用例进行优化设计。
2.实验内容
题目 1:日期问题。
应用等价类和边界值、随机数据生成法设计测试用例进行程序测试:该程序
有三个输入变量 month、day、year(month、day和year 均为整数值,并且满
足:1000≤year≤1999,1≤month≤12 和 1≤day≤31)分别作为输入日期的月份、日、年份,通过程序可以输出该输入日期在日历上隔一天的日期。例如,输入为2004年11月29日,则该程序的输出为 2004年12月1日。
(1) 分析各种输入情况,列出为输入变量 month、day、year划分的有效等价类和无效等价类。
(2) 分析程序的需求说明,结合等价类划分、边界值、随机数据生成方法,给出程序可能的输入。
(3) 根据 (1) 和 (2) ,导出测试用例。
(4) 设计程序并编码实现,应用 1-3 设计的测试用例进行测试,记录测试结果。
步骤一:划分有效等价类和无效等价类
Testcase | 有效等价类 | 编号 | 无效等价类 | 编号 |
年 | 1000到1999年内的闰年 | 1 | 小于1000的年份数 | 11 |
1000到1999年内的平年 | 2 | 大于1999的年份数 | 12 | |
月 | 2 | 3 | 小于1的整数 | 13 |
4,6,9,11 | 4 | |||
1,3,5,7,8,10 | 5 | 大于12的整数 | 14 | |
12 | 6 | |||
日 | 1到27的整数 | 7 | 小于1的整数 | 15 |
28 | 8 | 大于31的整数 | 16 | |
29 | 9 | 其他输入如字符、浮点数 | 17 | |
30 | 10 | 29 | 18 | |
31 | 12 | 30 | 23 | |
31 | 24 |
测试用例 | 年 | 月 | 日 | 期望输出 | 实际输出 | 测试结果 |
1 | 999 | 7 | 21 | 年份不符合 | 隔日日期为1021年3月2号 | √ |
2 | 1000 | 2 | 10 | 隔日日期为1000年2月12号 | 隔日日期为1000年2月12号 | √ |
3 | 1001 | 2 | 10 | 隔日日期为1001年2月12号 | 隔日日期为1001年2月12号 | √ |
4 | 1998 | 3 | 20 | 隔日日期为1998年3月22号 | 隔日日期为1998年3月22号 | √ |
5 | 1999 | 3 | 20 | 隔日日期为1999年3月22号 | 隔日日期为1999年3月22号 | √ |
6 | 2000 | 7 | 21 | 年份不符合要求 | 年份不符合要求 | √ |
7 | 1021 | 0 | 10 | 月份不符合要求 | 月份不符合要求 | √ |
8 | 1021 | 1 | 10 | 隔日日期为1021年1月12号 | 隔日日期为1021年1月12号 | √ |
9 | 1021 | 2 | 10 | 隔日日期为1021年2月12号 | 隔日日期为1021年2月12号 | √ |
10 | 1021 | 11 | 10 | 隔日日期为1021年11月12号 | 隔日日期为1021年11月12号 | √ |
11 | 1021 | 12 | 10 | 隔日日期为1021年12月12号 | 隔日日期为1021年12月12号 | √ |
12 | 1021 | 13 | 10 | 月份不符合要求 | 月份不符合要求 | √ |
13 | 1021 | 2 | 27 | 隔日日期为1021年3月1号 | 隔日日期为1021年3月1号 | √ |
14 | 1021 | 2 | 28 | 隔日日期为1021年3月2号 | 隔日日期为1021年3月2号 | √ |
15 | 1021 | 2 | 29 | 日期不符合要求 | 日期不符合要求 | √ |
16 | 1020 | 2 | 27 | 隔日日期为1020年2月29号 | 隔日日期为1020年2月29号 | √ |
17 | 1020 | 2 | 28 | 隔日日期为1020年3月1号 | 隔日日期为1020年3月1号 | √ |
18 | 1020 | 2 | 29 | 隔日日期为1020年3月2号 | 隔日日期为1020年3月2号 | √ |
19 | 1021 | 2 | 30 | 日期不符合要求 | 日期不符合要求 | √ |
20 | 1021 | 1 | 30 | 隔日日期为1021年2月1号 | 隔日日期为1021年2月1号 | √ |
21 | 1021 | 1 | 31 | 隔日日期为1021年2月2号 | 隔日日期为1021年2月2号 | √ |
22 | 1021 | 4 | 30 | 隔日日期为1021年5月2号 | 隔日日期为1021年5月2号 | √ |
23 | 1021 | 4 | 31 | 日期不符合要求 | 日期不符合要求 | √ |
24 | 1021 | 2 | 0 | 日期不符合要求 | 日期不符合要求 | √ |
步骤二:设计测试用例
实验代码:
#include<iostream>
using namespace std;
struct Data{
int year;
int month;
int day;};
int day_month[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
void IsLeapYear(Data d)//判断闰年,改变2月日数
{
if ((d.year % 4 == 0 && d.year % 100 != 0) || d.year % 400 == 0)
day_month[1] = 29;
else
day_month[1] = 28;
}
bool IsDay(Data d)//判断日期是否正确
{
IsLeapYear(d);
if (d.year < 1000 || d.year>1999)
{
cout << "年份不符合要求" << endl; return false;
}
else if (d.month < 1 || d.month>12)
{
cout << "月份不符合要求" << endl; return false;}
else{
if (d.day >= 1 && d.day <= day_month[d.month - 1])
{ }
else
{
cout << "日期不符合要求" << endl; return false;
}}}
void AfterData(Data d)//隔一日问题
{
d.day = d.day + 2;
if (d.day / day_month[d.month - 1] > 0)
{
d.day = d.day % day_month[d.month - 1];
d.month++;
if (d.month > 12)
{
d.month = d.month % 12;
d.year++;
}}
cout << "隔日日期为" << d.year << "年" << d.month << "月" << d.day << "号" << endl;}
int main()
{
Data data;
while (true)
{
int year, month, day;
cout << "请输入1000年-1999年间某日期:";
cin >> year; cin >> month; cin >> day;
data.year = year; data.month = month; data.day = day;
if (IsDay(data))
AfterData(data);
system("pause");
}
return 0;}
题目 2:采用状态图分析方法绘制电梯运行的状态图
要求:用文字描述状态图绘制的步骤;编号所有的输入;初始状态:空闲;
绘制电梯运行的所有状态直到没有新的状态产生。根据状态图设计测试用例覆盖
图中的所有状态。
步骤一:列出被测系统的输入事件
代号 | 事件 |
ip1 | 按上升键 |
ip2 | 按下降键 |
ip3 | 按楼层取消键 |
ip4 | 按开门键 |
ip5 | 按关门键 |
ip6 | 按报警键 |
ip7 | 楼层到达 |
步骤二:绘制电梯状态图
步骤三:设计测试用例
路径1:空闲-开门-关门-上升-报警
路径2:空闲-上升-到达楼层-下降-空闲
3.实验分析
题目一应用等价类和边界值、随机数据生成法设计测试用例对程序进行测试。首先对于年份、月份以及日期的数字有明显限制,年份需要在1000到1999年之间,一年有十二个月,日期最多从一至三十一。其次每个月份的天数不同,二月份比较特殊,对于闰年和非闰年有较大区别,用if ((d.year % 4 == 0 && d.year % 100 != 0) || d.year % 400 == 0)来进行判断。对于月末,隔天日期可能改变月份使用d.day = d.day % day_month[d.month - 1]; d.month++;来判断,测试用例实验正确。题目二使用状态图法来设计测试用例,首先要对电梯所有状态进行判断,其次要考虑所有可能改变状态的输入事件,仔细考虑并绘制状态图,设计测试用例。
4.实验总结
对于状态图法设计测试用例不太熟悉,使用起来较为困难。绘制状态图可能考虑不周,存在缺陷。同时在设计题目一的测试用例时,将问题想的很复杂,仔细分析下来发现,没有自己想象的那么困难,首先判断是否为闰年,来判断二月份的天数以及对月末隔天月份的转换没有想象的那么复杂。