实验一 黑盒测试法——等价类划分法
实验目的:1.掌握等价类划分的
2.掌握按等价类方法设计测试用例
实验内容:
1、请用等价类划分法为三角形问题划分等价类,并设计相应的测试用例,测试下面三角形问题程序,找出缺陷并改正,给出缺陷报告。
#include "iostream.h"
void main(){
int a,b,c;
cout<<"请输入三角形的三条边(界于1-100之间)"<
>a>>b>>c;
if(a<=1||a>=100)cout<<"a的值超过允许的范围!";
if(b<=1||b>=100)cout<<"b的值超过允许的范围!";
if(c<=1||c>=100)cout<<"c的值超过允许的范围!";
if(a+b>c||a+c>b||b+c>a)cout<<"a,b,c的值不能构成三角形!";
if(a==b&&b==c)cout<<"是等边三角形!";
if(a==b||b==c||a==c)cout<<"是等边三角形!";
if(a<>b&&b<>c&&c<>a)cout<<"一般三角形!";
}
三角形问题:划分等价类
有效等价类
号码
无效等价类
号码
输
入
条
件
输入三个整数
整数
1
a为非整数
一边为非整数 b为非整数
c为非整数
a,b为非整数
两边为非整数 b,c为非整数
a,c为非整数
三边a,b,c均为非整数
12
13
14
15
16
17
18
三个数
2
只给a
只给一边 只给b
只给c
只给a,b
只给两边 只给b,c
只给a,c
给出三个以上
19
20
21
22
23
24
25
非零数
3
a为0
一边为零 b为0
c为0
a,b为0
两边为零 b,c为0
a,c为0
三边a,b,c均为0
26
27
28
29
30
31
32
正数
4
a<0
一边<0 b<0
c<0
a<0且b<0
二边<0 a<0且c<0
b<0且c<0
三边均<0:a<0且b<0且c<0
33
34
35
36
37
38
39
输
出
条
件
构成一般三角形
a+b>c
b+c>a
a+c>b
5
6
7
a+b分析 基本设计□ 详细设计□ 设计式样理解□ 编程 □数据库设计
□ 环境配置□ 其它 ( )
缺陷描述
程序无法正常执行
预期结果
程序能运行,并且有运行的结果
重现步骤
备注
打开vc++6.0,运行以下源代码。
#include "iostream.h"
void main(){
int a,b,c;
cout<<"请输入三角形的三条边(界于1-100之间)"<
>a>>b>>c;
if(a<=1||a>=100)cout<<"a的值超过允许的范围!";
if(b<=1||b>=100)cout<<"b的值超过允许的范围!";
if(c<=1||c>=100)cout<<"c的值超过允许的范围!";
if(a+b>c||a+c>b||b+c>a)cout<<"a,b,c的值不能构成三角形!";
if(a==b&&b==c)cout<<"是等边三角形!";
if(a==b||b==c||a==c)cout<<"是等边三角形!";
if(a<>b&&b<>c&&c<>a)cout<<"一般三角形!";
}
发现错误,无法执行。
以下部分由BUG修改人填写
缺陷修改描述
将if语句的“<>”改成“!=”
测试人
修正人
确认人
修正日期
年 月 日
缺陷编号
2
用例编号
1
缺陷类型
代码错误
严重级别
严重
优先级
优先
缺陷状态
New
测试阶段
单元 □ 集成 □ 系统 □ 验收 □ 其它( )
可重现性
是 □否
BUG原因
□需求分析 基本设计□ 详细设计□ 设计式样理解□ 编程 □数据库设计
□ 环境配置□ 其它 ( )
缺陷描述
输入正确的三个数,不能进行正确的判断三角形的类型
预期结果
是一般三角形!
重现步骤
备注
1、 在VC++6.0中运行源程序
输入数据如图所示:
以下部分由BUG修改人填写
缺陷修改描述
将以下代码
if(a+b>c||a+c>b||b+c>a)cout<<"a,b,c的值不能构成三角形!";
改成
if(a+bb&&b<>c&&c<>a)cout<<"一般三角形!";
改为:
if((a>0&&a<=100)&&(b>0&&b<=100)&&(c>0&&c<=100))
{
if(a!=b&&b!=c&&c!=a)cout<<"一般三角形!";
}
测试人
修正人
确认人
修正日期
年 月 日
缺陷编号
5
用例编号
40~45
缺陷类型
严重级别
严重
优先级
优先
缺陷状态
New
测试阶段
单元 □ 集成 □ 系统 □ 验收 □ 其它( )
可重现性
是 □否
BUG原因
□需求分析 基本设计□ 详细设计□ 设计式样理解□ 编程 □数据库设计
□ 环境配置□ 其它 ( )
缺陷描述
输入不能构成三角形的有效数据,不能判定是否为三角形
预期结果
不能构成三角形
重现步骤
备注
在VC++6.0中运行源程序
输入数据如图所示:
以下部分由BUG修改人填写
缺陷修改描述
将以下代码:
if(a<>b&&b<>c&&c<>a)cout<<"一般三角形!";
改为:
if((a>0&&a<=100)&&(b>0&&b<=100)&&(c>0&&c<=100))
{
if((a!=b&&b!=c&&c!=a)&&(a+b>c&&a+c>b&&b+c>a))cout<<"一般三角形!";
}
测试人
修正人
确认人
修正日期
年 月 日
缺陷编号
6
用例编号
13~19
缺陷类型
严重级别
严重
优先级
优先
缺陷状态
New
测试阶段
单元 □ 集成 □ 系统 □ 验收 □ 其它( )
可重现性
是 □否
BUG原因
□需求分析 基本设计□ 详细设计□ 设计式样理解□ 编程 □数据库设计
□ 环境配置□ 其它 ( )
缺陷描述
只输入三角形的一边或两边,程序进入等待的状态,没有提示。
预期结果
给出提示判断是否为有效的输入
重现步骤
备注
在VC++6.0中运行源程序
输入数据如图所示:
以下部分由BUG修改人填写
缺陷修改描述
测试人
修正人
确认人
修正日期
年 月 日
2、某城市电话号码由三部分组成,分别是:
1) 地区码:以0开头的三位或者四位数字(包括0);
2) 电话号码:以非0、非1开头的七位或者八位数字。
假定被测程序能接受一切符合上述规定的电话号码, 拒绝所有不符合规定的电话号码。要求:
(1)请选择适当的黑盒测试方法,写出选择该方法的原因,并使用该方法的步骤,给出测试用例表。
(2)如果所生成的测试用例不够全面,请考虑用别的测试方法生成一些补充的测试用例。
解:(1)采用等阶类划分法,因为等阶类划分把输入域分成若干部分,然后从每个部分选取少数代表性的数据当做测试用例。
(2)步骤:划分等阶类,列出等阶类表,确定测试用例。
等价类表:
输入条件
有效等价类
号码
无效等价类
号码
地区码
0
以0开头的3位数
以0开头的4位数
1
2
3
非数字字符
非0开头的3位数
非0开头的4位数
0开头且少于3位数字
0开头且多于4位数字
非0开头且少于3位数
非0开头且多于4位数
6
7
8
9
10
11
12
电话号码
非0、非1开头的7位数
非0、非1开头的8位数
4
5
有非数字字符
少于7位数
多于8位数
起始位为0
起始位为1
13
14
15
16
17
测试用例表:
用例ID
测试数据
期望结果
覆盖等价类
地区码
电话号码
1
0
2235688
接受(有效)
1,4
2
0
22347789
接受(有效)
1,5
3
087
2235688
接受(有效)
2,4
4
087
22347789
接受(有效)
2,5
5
0234
2235688
接受(有效)
3,4
6
0234
22347789
接受(有效)
3,5
7
04A3
2235688
拒绝(无效)
6
8
122
2235688
拒绝(无效)
7
9
1223
2235688
拒绝(无效)
8
10
02
2235688
拒绝(无效)
9
11
02234
2235688
拒绝(无效)
10
12
12
2235688
拒绝(无效)
11
13
12345
2235688
拒绝(无效)
12
14
078
2334AA4
拒绝(无效)
13
15
078
234567
拒绝(无效)
14
16
078
723467890
拒绝(无效)
15
17
078
0234455
拒绝(无效)
16
18
078
1234546
拒绝(无效)
17
3、请尝试编写NextDate函数,考虑闰年,2月等特殊情况,并划分等价类,按强一般等价类划分法设计测试用例,并进行测试,要求给出部分测试用例截图,撰写测试报告(模版见附录3)。
测试报告
一、实验目的
1.掌握等价类划分的方法
2.掌握按等价类方法设计测试用例
二、实验内容
2.1实验问题描述:
请尝试编写NextDate函数,考虑闰年,2月等特殊情况,并划分等价类,按强一般等价类划分法设计测试用例,并进行测试,要求给出部分测试用例截图
2.2测试环境与配置:
在xp系统下运行VC++6.0的Win32控制台应用程序,执行c++源程序。
2.3源程序:
2.1测试程序源代码
#include
using namespace std;
void NextDate(int year,int month,int day);
void main()
{
int year=0,month=0,day=0;
NextDate(year,month,day);
}
void NextDate(int year,int month,int day)
{
cout<<"请输入年份:"<>year;
while(!(year>=1811 && year<=2013))
{
cout<<"年份超过界限,请重新输入"<>year;
}
cout<<"请输入月份:"<>month;
while (month>12||month<1)
{
cout<<"月份输入有误,请重新输入"<>month;
}
cout<<"请输入日期:"<>day;
while (day>31||day<1)
{
cout<<"日期输入有误,请重新输入"<>day;
}
if((year%4==0 && year%100!=0) || (year%400==0)) //检查闰年;
{
int i=0;
i=day-29;
while(month==2&&i>0)
{
cout<<"本月是闰月,请在1-29之间从新输入日期"<>day;
}
if(month==2&&day==29)
{
month=3;
day=1;
}
else day++;
}
else day++;
//月底计算;
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
if (day==32)
{
month++;
day=1;
cout<<"明天是:"<12}
D6= {日期.:日期<1}
D7= {日期:日期>31}
Y3= {年:年<1812}
Y4= {年:年>2012}
3.2测试用例设计
用例ID
月份
日期
年
预期输出
1
4
10
2001
2001年4月11日
2
4
10
2004
2004年4月11日
3
4
28
2001
2001年4月29日
4
4
28
2004
2004年4月29日
5
4
29
2001
2001年4月30日
6
4
29
2004
2004年4月30日
7
4
30
2001
2001年5月1日
8
4
30
2004
2004年5月1日
9
4
31
2001
无效输入
10
4
31
2004
无效输入
11
1
10
2001
2001年1月11日
12
1
10
2004
2004年1月11日
13
1
28
2001
2001年1月29日
14
1
28
2004
2004年1月29日
15
1
29
2001
2001年1月30日
16
1
29
2004
2004年1月30日
17
1
30
2001
2001年1月31日
18
1
30
2004
2004年1月31日
19
1
31
2001
2001年2月1日
20
1
31
2004
2004年2月1日
21
12
10
2001
2001年12月11日
22
12
10
2004
2004年12月11日
23
12
28
2001
2001年12月29日
24
12
28
2004
2004年12月29日
25
12
29
2001
2001年12月30日
26
12
29
2004
2004年12月30日
27
12
30
2001
2001年12月31日
28
12
30
2004
2004年12月31日
29
12
31
2001
2002年1月1日
30
12
31
2004
2005年1月1日
31
2
10
2001
2001年2月11日
32
2
10
2004
2004年2月11日
33
2
28
2001
2001年3月1日
34
2
28
2004
2004年2月29日
35
2
29
2001
无效输入
36
2
29
2004
2004年3月1日
37
2
30
2001
无效输入
38
2
30
2004
无效输入
39
2
31
2001
无效输入
40
2
31
2004
无效输入
四、测试结果及缺陷分析
4.1测试执行情况与记录
测试用例编号
输入
输出
1
2001/4/10
2001/4/11
2
2001/2/28
2001/3/1
3
2004/2/29
2004/3/1
4
1800/1/23
年份超过界限,请重新输入
5
2200/3/2
年份超过界限,请重新输入
6
2001/0/3
月份输入有误,请重新输入
7
2001/13/3
月份输入有误,请重新输入
8
2001/3/-21
日期输入有误,请重新输入
9
2001/3/40
日期输入有误,请重新输入
10
abu
程序进入死循环
11
2001/2/30
2001/2/31
12
2004/2/30
本月是闰月,请在1-29之间从新输入日期
4.2缺陷统计与分析
在选取的12个用例中,有两例发现程序有缺陷,测试用例11不符合题目给定要求。
分析:在正常情况下,输入日期为平年的2月29时,程序应报错。正常情况下当输入非数值数据时,应该要有所提示,避免程序进入死循环。
五、测试结论与心得体会
5.1测试结论
测试执行只是针对部分用例进行测试,尚有未考虑充分之处,留待以后发现错误时进行纠正。从测试结果来看,还应该对程序纠错性方面进行改进,如测试10情况下,程序进入死循环状态,说明程序鲁棒性不好。
测试目标完成
测试未通过,不可进行交付。
5.2心得体会
从这次的软件缺陷分析实验中,我学到了很多知识,懂得怎么样去写好一份测试报告,当我们要对某个程序进行缺陷分析时,首先要考虑的是要用什么样的测试方法去测试这个程序,才能尽可能多地去发现程序存在的缺陷,确定方法之后还要考虑如何去选取测试用例,如何选取好的测试用例,这是我们必须要思考的,因为好的测试用例可以很好地程序中的错误,而不是盲目地去测试,那样只会事倍功半,达不到想要的效果。
六、附录
部分用例测试截图