黑盒测试
实验一 黑盒测试
一、实验目的
1、 掌握黑盒测试的基础知识;
2、 掌握黑盒测试的检查内容及测试目的;
3、 掌握黑盒测试的几种基本测试方法:等价类划分方法、边界值分析方法、因果图法、决策表法和场景法;
二、实验要求
1、 复习有关内容,理解黑盒测试;
2、 掌握等价类划分、边界值分析方法、因果图法和决策表法,并能设计出测试用例;
3、 对具体软件,能分别使用相应的黑盒测试方法设计测试用例,并实施测试、分析测试结果。
三、实验内容
1、设计函数实现输入日期显示星期几,并用等价类及边界值法测试
实验步骤:
① 设计程序
package ruanjianceshi;
import java.util.Scanner;
public class day {
public static int which_week(int y, int m, int d){
int w = ((d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) % 7) +1;
return w;
}
public static void main(String[] args) {
int year,month,day;
Scanner scanner = new Scanner(System.in);
System.out.println("请输入年");
try {
year = scanner.nextInt();
} catch (Exception e){
System.out.println("输入日期无效");
return;
}
System.out.println("请输入月");
try {
month = scanner.nextInt();
} catch (Exception e){
System.out.println("输入日期无效");
return;
}
System.out.println("请输入日");
try {
day = scanner.nextInt();
} catch (Exception e){
System.out.println("输入日期无效");
return;
}
if (year < 1900 || year > 2050){
System.out.println("输入日期无效");
return;
}
if (month < 1 || month > 12){
System.out.println("输入日期无效");
return;
}
if (day < 1 || day > 31){
System.out.println("输入日期无效");
return;
}
if (year % 4 == 0 && month == 2 && day > 29){
System.out.println("输入日期无效");
return;
}
if (year % 4 != 0 && month == 2 && day > 28){
System.out.println("输入日期无效");
return;
}
if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10){
if (day >31){
System.out.println("输入日期无效");
return;
}
}
if (month == 4 || month == 6 || month == 9 || month == 11){
if (day > 30) {
System.out.println("输入日期无效");
return;
}
}
int week = which_week(year,month,day);
System.out.println("星期"+week);
}
}
② 划分等价类,得到等价类表。等价类表格式如下:
输入条件 |
有效等价类 |
唯一标识 |
无效等价类 |
唯一标识 |
年 |
0001-9999的闰年 |
1 |
年份<1900 |
10 |
|
0001-9999的平年 |
2 |
年份>2050 |
11 |
|
|
|
其他输入 |
12 |
月 |
1,3,5,7,8,10,12 |
3 |
月份<1 |
13 |
|
4,6,9,11 |
4 |
月份>12 |
14 |
|
2 |
5 |
其他输入 |
15 |
日 |
1-28 |
6 |
天数<1 |
16 |
|
29 |
7 |
年份为闰年 且月份 为2时,天数>29
|
17 |
|
30 |
8 |
年份为平年 且月份 为2时,天数>28
|
18 |
|
31 |
9 |
月份=1,3,5,7,8,10,12时31<天数 |
19 |
|
|
|
月份=4,6,9,11时天数>30 |
20 |
|
|
|
天数>31 |
21 |
|
|
|
其他输入 |
22 |
③ 运用等价类划分法设计测试用例,得到测试用例表。测试用例表格式如下:
序号 |
输入数据 |
覆盖等价类 |
输出 |
1 |
2009,12,2 |
2,3,6 |
星期三 |
2 |
2003,4,29 |
2,4,8 |
星期五 |
3 |
2004,2,29 |
1,5,7 |
星期二 |
4 |
2003,3,30 |
1,3,9 |
星期三 |
5 |
1899,3,1 |
10,3,6 |
输入日期无效 |
6 |
2051,3,1 |
11,3,6 |
输入日期无效 |
7 |
2004,0,2 |
1,12,6 |
输入日期无效 |
8 |
2004,13,2 |
1,13,6 |
输入日期无效 |
9 |
2004,3,0 |
1,3,14 |
输入日期无效 |
10 |
2004,3,32 |
1,3,15 |
输入日期无效 |
11 |
2004,2,30 |
1,5,16 |
输入日期无效 |
12 |
2003,2,29 |
2,5,17 |
输入日期无效 |
13 |
2004,4,31 |
1,4,18 |
输入日期无效 |
④ 运用边界值法设计测试用例。
序号 |
输入数据 |
输出 |
1 |
1900,3,3 |
星期六 |
2 |
1901,3,2 |
星期六 |
3 |
1950,3,2 |
星期六 |
4 |
2050,5,6 |
星期三 |
5 |
2049,8,9 |
星期六 |
6 |
1950,1,9 |
星期三 |
7 |
1950,2,9 |
星期六 |
8 |
1950,11,9 |
星期六 |
9 |
1950,12,9 |
星期一 |
10 |
1964,5,1 |
星期五 |
11 |
1968,7,2 |
星期五 |
12 |
1968,7,30 |
星期五 |
13 |
1968,7,31 |
星期六 |
2、找零钱最佳组合
假设商店货品价格(R) 都不大于100元(且为整数),若顾客付款(P)在100元内,现有一个程序能在每位顾客付款后给出找零钱的最佳组合(找给顾客货币张数最少)。 假定此商店的货币面值只包括:50元(N50)、10元(N10)、 5元(N5)、1元(N1) 四种。
请结合等价类划分法和边界值分析法为上述程序设计 出相应的测试用例。
实验步骤:
同上题
package ruanjianceshi;
import java.util.Scanner;
public class zhaolingqian {
public static void main(String[] args) {
int N50 = 0,N10 = 0,N5 = 0,N1=0;
double price,pay,value;
Scanner scanner = new Scanner(System.in);
System.out.println("请输入商品价格");
try {
price = scanner.nextDouble();
} catch (Exception e){
System.out.println("输入价格无效");
return;
}
System.out.println("请输入顾客支付金额");
try {
pay = scanner.nextDouble();
} catch (Exception e){
System.out.println("输入支付金额无效");
return;
}
if (price > pay){
System.out.println("无效,顾客付款小于商品价格");
return;
}
if ( price>100 || pay > 100 || pay < 0 || price < 0){
System.out.println("无效输入");
return;
}
else {
value = pay - price;
if (value / 50 >= 1){
N50 = (int) (value / 50);
value = value - 50 * N50;
}
if (value / 10 >= 1){
N10 = (int) (value / 10);
value = value - 10 * N10;
}
if (value / 5 >= 1){
N5 = (int) (value / 5);
value = value - 5 * N5;
}
N1 = (int) (value);
}
System.out.println("1元" + N1 + "张");
System.out.println("5元" + N5 + "张");
System.out.println("10元" + N10 + "张");
System.out.println("50元" + N50 + "张");
}
}
②划分等价类
输入条件 |
有效等价类 |
唯一标识 |
无效等价类 |
唯一标识 |
商品价钱 |
0<=R<=100且是整数 |
1 |
R>100 |
3 |
|
|
|
R<0 |
4 |
|
|
|
R不为整数 |
5 |
付款 |
P>R,P<=100 |
2 |
P<R |
6 |
|
|
|
P>100 |
7 |
等价测试用例:
序号 |
输入数据 |
覆盖等价类 |
输出 |
1 |
R=250 |
3 |
请输入正确金额 |
2 |
R=-9 |
4 |
请输入正确金额 |
3 |
R=50,P=168 |
1,7 |
请输入正确金额 |
4 |
R=50,P=11 |
1,6 |
请输入正确金额 |
5 |
R=65.7 |
5 |
请输入合法数字 |
6 |
R=50,P=89 |
1,2 |
3张10元,1张五元,4张1元 |
边界值测试用例:
序号 |
输入数据(R,P) |
输出 |
1 |
150,50 |
消费金额超出支付金额 |
2 |
199,150 |
消费金额超出支付金额 |
3 |
45,60 |
3张5元 |
4 |
1,60 |
1张50元,1张五元,4张1元 |
5 |
0,50 |
1张50元 |
6 |
50,100 |
1张50元 |
7 |
49,99 |
1张50元 |
8 |
50,1 |
消费金额超出支付金额 |
9 |
50,0 |
消费金额超出支付金额 |
3、有一个饮料自动售货机(处理单价为5角钱)的控制处理软件,它的软件规格说明如下:
若投入5角钱的硬币,按下“橙汁”或“啤酒”的按钮,则相应的饮料就送出来。若投入1元钱的硬币,同样也是按“橙汁”或“啤酒”的按钮,则自动售货机在送出相应饮料的同时退回5角钱的硬币。
模拟程序如下:
用因果图法测试该程序,并撰写实验报告。
实验步骤:
①编写程序
package ruanjianceshi;
import java.util.Scanner;
public class yinliaoshouhuo {
public static void main(String[] args) {
int button1,button2;
Scanner scanner = new Scanner(System.in);
System.out.println("请投币(一元请输入1,五角请输入2)");
try {
button1 = scanner.nextInt();
if (button1 != 1 && button1 != 2){
System.out.println("输入无效");
return;
}
} catch (Exception e){
System.out.println("输入无效");
return;
}
System.out.println("请选择商品(啤机请输入1,橙汁请输入2)");
try {
button2 = scanner.nextInt();
if (button2 != 1 && button2 != 2){
System.out.println("输入无效");
return;
}
} catch (Exception e){
System.out.println("输入无效");
return;
}
if (button1 == 2 && button2 == 1 ){
System.out.println("请取走您的啤酒");
}
else if (button1 == 2 && button2 == 2 ){
System.out.println("请取走您的橙汁");
}
else if (button1 == 1 && button2 == 1 ){
System.out.println("请取走您的啤酒,将找零五角");
}
else if (button1 == 1 && button2 == 2 ){
System.out.println("请取走您的橙汁,将找零五角");
}
}
}
②分析原因与结果,与同学交换程序测试。
原因有投入一元、投入五角、橙汁、啤酒
结果有找回五角、出橙汁、出啤酒
③画出因果图
④转化为决策表
⑤根据决策表设计测试用例,得到测试用例表
1.一元硬币 2.五角硬币 3.不投
1.橙汁 2.啤酒 3.不选
序号 |
输入 |
输出 |
1 |
1,2 |
啤酒,五角硬币 |
2 |
2,1 |
出橙汁 |
3 |
3,1 |
无效数据 |
4 |
1,5 |
无效数据 |
5 |
2,2 |
出啤酒 |
6 |
1,2 |
出啤酒,五角硬币 |
4、航空服务查询问题:根据航线,仓位,飞行时间查询航空服务。
假设一个中国的航空公司规定:
① 中国去欧美的航线所有座位都有食物供应,每个座位都可以播放电影。
② 中国去非欧美的国外航线都有食物供应,只有商务仓可以播放电影。
③ 中国国内的航班的商务仓有食物供应,但是不可以播放电影
④ 中国国内航班的经济仓只有当飞行时间大于2小时时才有食物供应,但是不可以播放电影。
请用程序实现上述功能,并用决策表法设计测试用例,再执行测试,撰写实验报告。
实验步骤:
① 编写程序,与同学交换程序测试。
package ruanjianceshi;
import java.util.Scanner;
public class hangkong {
public static void query(int b1,int b2,int b3){
if (b1 == 1){
System.out.println("享受服务:食物供应、播放电影");
return;
}
if (b1 == 2 && b2 == 1){
System.out.println("享受服务:食物供应、播放电影");
return;
}
if (b1 == 2 && b2 == 2){
System.out.println("享受服务:食物供应");
return;
}
if (b1 == 3 && b2 == 1){
System.out.println("享受服务:食物供应");
return;
}
if (b1 == 3 && b2 == 2 && b3 == 2){
System.out.println("享受服务:食物供应");
return;
}
else
System.out.println("享受服务:无");
}
public static void main(String[] args) {
int button1,button2,button3;
System.out.println("欢迎使用航空服务查询系统");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入您的航线(欧美请输入1,国外非欧美请输入2,国内请输入3)");
try {
button1 = scanner.nextInt();
if (button1 != 1 && button1 != 2 && button1 !=3){
System.out.println("输入无效");
return;
}
} catch (Exception e){
System.out.println("输入无效");
return;
}
System.out.println("请输入您的舱位(商务舱请输入1,经济舱请输入2)");
try {
button2 = scanner.nextInt();
if (button2 != 1 && button2 != 2){
System.out.println("输入无效");
return;
}
} catch (Exception e){
System.out.println("输入无效");
return;
}
System.out.println("请输入您的飞行时间(两小时以内请输入1,超过两小时请输入2)");
try {
button3 = scanner.nextInt();
if (button3 != 1 && button3 != 2){
System.out.println("输入无效");
return;
}
} catch (Exception e){
System.out.println("输入无效");
return;
}
query(button1,button2,button3);
}
}
② 构造决策表
等价类 |
编号 |
等价类 |
编号 |
等价类 |
编号 |
欧美航线 |
M1 |
商务舱 |
D1
|
飞行时间小于2h |
Y1 |
国外非欧美航线 |
M2 |
经济舱 |
D2 |
飞行时间大于2h |
Y2 |
国内航线 |
M3 |
|
|
|
|
条件桩 |
动作桩 |
C1:M1,M2,M3之一 |
A1:播放电影 |
C2:D1,D2,之一 |
A2:食物供应 |
C3:Y1,Y2之一 |
|
决策表
③ 根据决策表设计测试用例,得到测试用例表
编号 |
航线 |
舱位 |
飞行时间 |
输出 |
1 |
国内航线 |
经济舱 |
大于等于2h |
播放电影,食物供应 |
2 |
国外非欧美航线 |
商务舱 |
小于2h/大于等于2h |
播放电影,食物供应 |
3 |
国外非欧美航线 |
经济舱 |
小于2h/大于等于2h |
食物供应 |
4 |
国内航线 |
商务舱 |
小于2h/大于等于2h |
食物供应 |
5 |
国内航线 |
经济舱 |
小于2h |
|
6 |
国外欧美航线 |
商务舱 |
两小时以内 |
食物供应、播放电影 |
5、旅馆住宿系统中,旅馆业主可进行添加房间操作。
– 旅馆业主登录旅馆住宿系统后,可以请求添加房间;
– 待进入“房间管理”对话框,单击“添加”按钮可进行添加房间操作;
– 添加房间时,可以设定房间的房间编号、房间类型、房间描述信息;
– 添加房间信息不能缺失,若某一项未填写,要给出提示信息;
– 房间编号长度不超过5个字符;
– 房间描述长度不超过1000个字符;
– 房间信息不能重复,成功填写后,可进行保存或取消操作,之后返回“房间管理”对话框,结束添加房间流程。
实验步骤:
利用黑盒测试策略编写添加房间功能的测试用例。
输入条件 |
等价类 |
唯一标识 |
非等价类 |
唯一标识 |
房间编号 |
0<长度<=5 |
1 |
长度>5,空 |
4 |
房间描述 |
0<长度<=1000 |
2 |
长度>1000,空 |
5 |
房间类型 |
非空 |
3 |
空 |
6 |
测试用例
序号 |
输入数据(房间编号,房间描述,房间类型) |
覆盖等价类 |
输出 |
1 |
0057,好,商业用房 |
1,2,3 |
添加成功 |
2 |
Null,好,商业用房 |
4,2,3 |
房间信息不能为空 |
3 |
0057,Null,商业用房 |
1,5,3 |
房间信息不能为空 |
4 |
0057,好,Null |
1,2,6 |
房间信息不能为空 |
四、实验思考
1、在实际的测试中,如何设计测试用例才能达到用最少的测试用例检测出最多的缺陷;
运用边界值分析确保测试用例覆盖边界条件,运用等价类划分减少重复测试,优先测试高风险和高优先级的功能或模块。
2、在进行用例设计时,如何考虑软件测试用例的充分性和减少软件测试用例的冗余性;
充分性:每个需求要有对应的用例进行覆盖,确保软件测试覆盖软件的所有功能,对软件的性能特征设置测试用例,验证软件的安全性。
冗余性:进行等价类划分和边界值分析,选择有代表性的测试用例进行测试,减少冗余的测试,关注边界条件,减少不必要的重复测试。根据经验进行猜测。
3、本次实验遇到的难点、如何解决的及体会。
难点:等价类的划分容易出现错误,测试用例繁杂。
解决:多进行联系,掌握关键点。
体会:黑盒测试是一种在不了解内部结构或实现细节的情况下对软件进行测试的方法。使用广泛,独立性强,易于理解和实施。