2025.3.27
软件测试实验一:
一、 实验目的
1、 掌握黑盒测试的基础知识;
2、 掌握黑盒测试的检查内容及测试目的;
3、 掌握黑盒测试的几种基本测试方法:等价类划分方法、边界值分析方法、因果图法和决策表法;
二、 实验内容
1、设计函数实现输入日期显示星期几,并用等价类及边界值法测试
2、找零钱最佳组合
假设商店货品价格(R) 都不大于100元(且为整数),若顾客付款(P)在100元内,现有一个程序能在每位顾客付款后给出找零钱的最佳组合(找给顾客货币张数最少)。 假定此商店的货币面值只包括:50元(N50)、10元(N10)、 5元(N5)、1元(N1) 四种。
请结合等价类划分法和边界值分析法为上述程序设计 出相应的测试用例。
3、有一个饮料自动售货机(处理单价为5角钱)的控制处理软件,它的软件规格说明如下:
若投入5角钱的硬币,按下“橙汁”或“啤酒”的按钮,则相应的饮料就送出来。若投入1元钱的硬币,同样也是按“橙汁”或“啤酒”的按钮,则自动售货机在送出相应饮料的同时退回5角钱的硬币。
模拟程序如下:
用因果图法测试该程序,并撰写实验报告。
4、航空服务查询问题:根据航线,仓位,飞行时间查询航空服务。
假设一个中国的航空公司规定:
① 中国去欧美的航线所有座位都有食物供应,每个座位都可以播放电影。
② 中国去非欧美的国外航线都有食物供应,只有商务仓可以播放电影。
③ 中国国内的航班的商务仓有食物供应,但是不可以播放电影
④ 中国国内航班的经济仓只有当飞行时间大于2小时时才有食物供应,但是不可以播放电影。
请用程序实现上述功能,并用决策表法设计测试用例,再执行测试,撰写实验报告。
三、 实验步骤及结果
1、设计函数实现输入日期显示星期几,并用等价类及边界值法测试
实验步骤:
① 设计程序
package one;
import java.util.Scanner;
public class Day {
public static int which_week(int y, int m, int d){
return ((d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) % 7);
}
public static void main(String[] args) {
int year,month,day;
String[] week =new String[]{"一","二","三","四","五","六","日"};
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 == 4 || month == 6 || month == 9 || month == 11){
if (day > 30) {
System.out.println("输入日期无效");
return;
}
}
System.out.println("星期"+week[which_week(year,month,day)]);
}
}
② 划分等价类,得到等价类表。等价类表格式如下:
|
输入条件 |
有效等价类 |
唯一标识 |
无效等价类 |
唯一标识 |
|
年 |
1900到2050内的闰年 |
(1) |
Year<1900 |
(10) |
|
|
1900到2050内的平年 |
(2) |
Year>2050 |
(11) |
|
|
|
|
非数字 |
(12) |
|
月 |
1,3,5,7,8,10,12 |
(3) |
Month<1 |
(13) |
|
|
4,6,9,11 |
(4) |
Month>12 |
(14) |
|
|
2 |
(5) |
非数字 |
(15) |
|
日 |
1-28 |
(6) |
Day<1 |
(16) |
|
|
29 |
(7) |
Day>31 |
(17) |
|
|
30 |
(8) |
Year为闰年 且Month 为2时,Day>29 |
(18) |
|
|
31 |
(9) |
Year为平年 且Month 为2时,Day>28 |
(19) |
|
|
|
|
Month=4,6,9,11 时,Day>30 |
(20) |
|
|
|
|
非数字 |
(21) |
③ 运用等价类划分法设计测试用例,得到测试用例表。测试用例表格式如下:
|
序号 |
输入数据 |
覆盖等价类 |
输出 |
|
1 |
2024-3-31 |
1,3,9 |
星期日 |
|
2 |
2022-4-30 |
2,4,8 |
星期二 |
|
3 |
2023-2-20 |
1,5,6 |
星期一 |
|
4 |
2024-2-29 |
2,5,7 |
星期四 |
|
5 |
2022-3-0 |
2,3,16 |
输入日期无效 |
|
6 |
2022-3-32 |
2,3,17 |
输入日期无效 |
|
7 |
2020-2-30 |
1,5,18 |
输入日期无效 |
|
8 |
2022-2-29 |
2,5,19 |
输入日期无效 |
|
9 |
2023-6-31 |
2,3,20 |
输入日期无效 |
|
10 |
2023-6-a |
2,4,21 |
输入日期无效 |
|
11 |
2020-0-22 |
1,13,6 |
输入日期无效 |
|
12 |
2023-13-29 |
2,14,7 |
输入日期无效 |
|
13 |
2023-b-30 |
2,15,8 |
输入日期无效 |
|
14 |
1800-5-20 |
10,3,6 |
输入日期无效 |
|
15 |
2055-4-18 |
11,4,6 |
输入日期无效 |
|
16 |
C-5-29 |
12,3,7 |
输入日期无效 |
④ 运用边界值法设计测试用例。
|
序号 |
输入数据 |
覆盖等价类 |
输出 |
|
1 |
1900-1-1 |
1,3,6 |
星期一 |
|
2 |
2050-12-31 |
2,3,9 |
星期六 |
|
3 |
2023-2-28 |
2,5,6 |
星期二 |
|
4 |
2024-2-29 |
1,5,7 |
星期日 |
|
5 |
2025-3-31 |
2,3,9 |
星期一 |
|
6 |
2025-4-30 |
2,4,8 |
星期三 |
|
7 |
1900-2-30 |
1,5,8 |
输入日期无效 |
|
8 |
2050-2-29 |
2,5,7 |
输入日期无效 |
|
9 |
2025-4-31 |
2,4,9 |
输入日期无效 |
|
10 |
1900-2-31 |
1,5,9 |
输入日期无效 |
|
11 |
2050-2-30 |
2,5,8 |
输入日期无效 |
|
12 |
2050-2-31 |
2,5,9 |
输入日期无效 |
2、找零钱最佳组合
假设商店货品价格(R) 都不大于100元(且为整数),若顾客付款(P)在100元内,现有一个程序能在每位顾客付款后给出找零钱的最佳组合(找给顾客货币张数最少)。 假定此商店的货币面值只包括:50元(N50)、10元(N10)、 5元(N5)、1元(N1) 四种。
请结合等价类划分法和边界值分析法为上述程序设计 出相应的测试用例。
实验步骤:
① 设计程序
package one;
import java.util.Scanner;
public class money {
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;
}
if(price>100||price<0){
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 ( pay > 100 ){
System.out.println("无效输入");
return;
}
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<0 |
(3) |
|
|
|
|
R>100 |
(4) |
|
|
|
|
R非数字 |
(5) |
|
顾客付款 |
0<=P<=100 |
(2) |
P<0 |
(6) |
|
|
|
|
P>100 |
(7) |
|
|
|
|
P非数字 |
(8) |
|
|
|
|
R>P |
(9) |
③ 运用等价类划分法设计测试用例,得到测试用例表。测试用例表格式如下:
|
序号 |
输入数据 |
覆盖等价类 |
输出 |
|
1 |
R=83,P=97 |
1,2 |
10元1张,1元4张 |
|
2 |
R=30,P=-1 |
1,6 |
无效输入 |
|
3 |
R=30,P=120 |
1,7 |
无效输入 |
|
4 |
R=40,P=a |
1,8 |
输入支付金额无效 |
|
5 |
R=40,P=30 |
1,9 |
无效,顾客付款小于商品价格 |
|
6 |
R=-10,P=20 |
2,3 |
无效输入 |
|
7 |
R=130,P=50 |
2,4 |
无效输入 |
|
8 |
R=b,P=50 |
2,5 |
输入价格无效 |
④ 运用边界值法设计测试用例。
|
序号 |
输入数据 |
覆盖等价类 |
输出 |
|
1 |
R=60,P=90 |
1,2 |
10元3张 |
|
2 |
R=50,P=-1 |
1,6 |
无效输入 |
|
3 |
R=60,P=101 |
1,7 |
无效输入 |
|
4 |
R=-1,P=70 |
2,3 |
无效输入 |
|
5 |
R=101,P=80 |
2,4 |
无效输入 |
3、有一个饮料自动售货机(处理单价为5角钱)的控制处理软件,它的软件规格说明如下:
若投入5角钱的硬币,按下“橙汁”或“啤酒”的按钮,则相应的饮料就送出来。若投入1元钱的硬币,同样也是按“橙汁”或“啤酒”的按钮,则自动售货机在送出相应饮料的同时退回5角钱的硬币。
模拟程序如下:
用因果图法测试该程序,并撰写实验报告。
实验步骤:
①编写程序
package one;
import java.util.Scanner;
public class Drinks {
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 ){
System.out.println("请取饮料:橙汁");
}
else if ( button2 == 1 ){
System.out.println("请取饮料:啤酒,找零:五角");
}
else {
System.out.println("请取饮料:橙汁,找零:五角");
}
}
}
②分析原因与结果
|
原因 |
结果 |
|
C1:一元 |
E1:找零:五角 |
|
C2:五角 |
E2:请取饮料:啤酒 |
|
C3:啤酒 |
E3:请取饮料:橙汁 |
|
C4:橙汁 |
|
③画出因果图
④转化为决策表
|
选项规则 |
条件 |
|
|
|
|
动作 |
|
|
|
|
|
C1 |
C2 |
C3 |
C4 |
|
E1 |
E2 |
E3 |
不可能 |
|
1 |
1 |
1 |
1 |
1 |
|
|
|
|
√ |
|
2 |
1 |
1 |
1 |
0 |
|
|
|
|
√ |
|
3 |
1 |
1 |
0 |
1 |
|
|
|
|
√ |
|
4 |
1 |
0 |
1 |
1 |
|
|
|
|
√ |
|
5 |
0 |
1 |
1 |
1 |
|
|
|
|
√ |
|
6 |
1 |
1 |
0 |
0 |
|
|
|
|
√ |
|
7 |
1 |
0 |
1 |
0 |
1 |
√ |
√ |
|
|
|
8 |
0 |
1 |
1 |
0 |
1 |
|
√ |
|
|
|
9 |
1 |
0 |
0 |
1 |
1 |
√ |
|
√ |
|
|
10 |
0 |
1 |
0 |
1 |
1 |
|
|
√ |
|
|
11 |
0 |
0 |
1 |
1 |
|
|
|
|
√ |
|
12 |
0 |
0 |
0 |
1 |
|
|
|
|
√ |
|
13 |
0 |
0 |
1 |
0 |
|
|
|
|
√ |
|
14 |
0 |
1 |
0 |
0 |
|
|
|
|
√ |
|
15 |
1 |
0 |
0 |
0 |
|
|
|
|
√ |
|
16 |
0 |
0 |
0 |
0 |
|
|
|
|
√ |
⑤根据决策表设计测试用例,得到测试用例表
|
序号 |
投币(1代表一元,2代表五角) |
商品(1代表啤酒,2代表橙汁) |
输出 |
|
1 |
1 |
1 |
请取饮料:啤酒,找零:五角 |
|
2 |
1 |
2 |
请取饮料:橙汁,找零:五角 |
|
3 |
2 |
1 |
请取饮料:啤酒 |
|
4 |
2 |
2 |
请取饮料:橙汁 |
|
5 |
? |
1 |
不可能 |
|
6 |
? |
2 |
不可能 |
|
7 |
1 |
? |
不可能 |
|
8 |
2 |
? |
不可能 |
|
9 |
? |
? |
不可能 |
4、航空服务查询问题:根据航线,仓位,飞行时间查询航空服务。
假设一个中国的航空公司规定:
① 中国去欧美的航线所有座位都有食物供应,每个座位都可以播放电影。
② 中国去非欧美的国外航线都有食物供应,只有商务仓可以播放电影。
③ 中国国内的航班的商务仓有食物供应,但是不可以播放电影
④ 中国国内航班的经济仓只有当飞行时间大于2小时时才有食物供应,但是不可以播放电影。
请用程序实现上述功能,并用决策表法设计测试用例,再执行测试,撰写实验报告。
实验步骤:
① 编写程序
② 构造决策表
|
选项规则 |
条件 |
|
|
动作 |
|
|
|
|
航线(1代表欧美,2代表其他国外,3代表国内) |
舱位(1代表商务舱,2代表经济舱) |
飞行时间<=2(1代表是,2代表否) |
食物 |
电影 |
不可能 |
|
1 |
1 |
任意 |
任意 |
1 |
1 |
|
|
2 |
2 |
1 |
任意 |
1 |
1 |
|
|
3 |
2 |
2 |
任意 |
1 |
2 |
|
|
4 |
3 |
1 |
任意 |
1 |
2 |
|
|
5 |
3 |
2 |
2 |
1 |
2 |
|
|
6 |
3 |
2 |
2 |
2 |
2 |
|
|
7 |
0 |
任意 |
任意 |
|
|
√
|
|
8 |
任意 |
0 |
任意 |
|
|
√
|
|
9 |
任意 |
任意 |
0 |
|
|
√
|
|
10 |
0 |
0 |
任意 |
|
|
√
|
|
11 |
0 |
任意 |
0 |
|
|
√
|
|
12 |
任意 |
0 |
0 |
|
|
√
|
|
13 |
0 |
0 |
0 |
|
|
√
|
③ 根据决策表设计测试用例,得到测试用例表
|
序号 |
航线(1代表欧美,2代表其他国外,3代表国内) |
舱位(1代表商务舱,2代表经济舱) |
飞行时间 |
输出 |
|
1 |
1 |
1 |
1 |
享受服务:食物供应、播放电影 |
|
2 |
2 |
1 |
3 |
享受服务:食物供应、播放电影 |
|
3 |
2 |
1 |
3 |
享受服务:食物供应 |
|
4 |
3 |
1 |
1 |
享受服务:食物供应 |
|
5 |
3 |
1 |
3 |
享受服务:食物供应 |
|
6 |
3 |
1 |
1 |
享受服务:无 |
|
7 |
? |
1 |
2 |
输入无效 |
|
8 |
2 |
? |
3 |
输入无效 |
|
9 |
2 |
1 |
? |
输入无效 |
|
10 |
? |
? |
? |
输入无效 |
5、旅馆住宿系统中,旅馆业主可进行添加房间操作。
– 旅馆业主登录旅馆住宿系统后,可以请求添加房间;
– 待进入“房间管理”对话框,单击“添加”按钮可进行添加房间操作;
– 添加房间时,可以设定房间的房间编号、房间类型、房间描述信息;
– 添加房间信息不能缺失,若某一项未填写,要给出提示信息;
– 房间编号长度不超过5个字符;
– 房间描述长度不超过1000个字符;
– 房间信息不能重复,成功填写后,可进行保存或取消操作,之后返回“房间管理”对话框,结束添加房间流程。
实验步骤:
利用黑盒测试策略编写添加房间功能的测试用例。
|
测试用例编号 |
测试标题 |
前置条件 |
测试步骤 |
预期结果 |
测试数据 |
|
1 |
添加房间成功 |
旅馆业主登录旅馆住宿系统后,进入“房间管理”对话框 |
1. 填写房间编号(长度 ≤5 个字符) 2. 选择房间类型 3. 输入房间描述(长度 ≤1000 个字符) 4. 单击“添加”按钮 5. 单击“保存”按钮 |
1. 系统无错误提示 2. 房间信息成功保存 3. 返回房间管理对话框 |
房间编号:1,房间类型:单人间,房间描述:很好 |
|
2 |
房间编号缺失 |
旅馆业主登录旅馆住宿系统后,进入“房间管理”对话框 |
1. 不填写房间编号 2. 选择房间类型 3. 输入房间描述 4. 单击“添加”按钮 |
1. 系统提示“房间编号不能为空” 2. 返回房间管理对话框 |
房间编号:(空),房间类型:单人间,房间描述:很好 |
|
3 |
房间类型缺失 |
旅馆业主登录旅馆住宿系统后,进入“房间管理”对话框 |
1. 填写房间编号 2. 不选择房间类型 3. 输入房间描述 4. 单击“添加”按钮 |
1. 系统提示“房间类型不能为空” 2. 返回房间管理对话框 |
房间编号:1,房间类型:(空),房间描述:很好 |
|
4 |
房间描述缺失 |
旅馆业主登录旅馆住宿系统后,进入“房间管理”对话框 |
1. 填写房间编号 2. 选择房间类型 3. 不输入房间描述 4. 单击“添加”按钮 |
1. 系统提示“房间描述不能为空” 2. 返回房间管理对话框 |
房间编号:1,房间类型:单人间,房间描述:(空)
|
|
5 |
房间编号过长 |
旅馆业主登录旅馆住宿系统后,进入“房间管理”对话框 |
1. 填写房间编号(长度 >5 个字符) 2. 选择房间类型 3. 输入房间描述 4. 单击“添加”按钮 |
1. 系统提示“房间编号长度不能超过 5 个字符” 2. 返回房间管理对话框 |
房间编号:123456,房间类型:单人间,房间描述:很好 |
|
6 |
房间描述超长 |
旅馆业主登录旅馆住宿系统后,进入“房间管理”对话框 |
1. 填写房间编号 2. 选择房间类型 3. 输入房间描述(长度 >1000 个字符) 4. 单击“添加”按钮 |
1. 系统提示“房间描述长度不能超过 1000 个字符” 2. 返回房间管理对话框 |
房间编号:1,房间类型:单人间,房间描述:(1001 个字符) |
|
7 |
房间信息重复 |
旅馆业主登录旅馆住宿系统后,进入“房间管理”对话框,系统存在相同房间编号的房间 |
1. 填写已存在的房间编号 2. 选择房间类型 3. 输入房间描述 4. 单击“添加”按钮 |
1. 系统提示“房间信息重复,无法添加” 2. 返回房间管理对话框 |
房间编号:1(已存在),房间类型:单人间,房间描述:很好 |
实验思考
① 在实际的测试中,如何设计测试用例才能达到用最少的测试用例检测出最多的缺陷;
理解需求和功能:深入理解软件的功能和需求,明确每个功能点和边界条件,确保测试用例覆盖所有重要的功能场景。
使用多种测试方法结合:
等价类划分:将输入数据划分为有效和无效等价类,减少测试用例数量,同时覆盖所有可能的输入情况。
边界值分析:针对每个输入的边界值设计测试用例,能够检测出因边界问题导致的缺陷。
因果图法和决策表法:适用于复杂的逻辑关系,通过因果图和决策表生成测试用例,确保逻辑分支被充分覆盖。
优先级排序:根据功能的重要性和风险程度对测试用例进行优先级排序,优先执行高优先级的测试用例。
基于风险的测试设计:识别软件中可能存在的高风险缺陷,设计针对性的测试用例,提高缺陷检测效率。
② 在进行用例设计时,如何考虑软件测试用例的充分性和减少软件测试用例的冗余性;
充分性:
覆盖所有功能点:确保测试用例覆盖软件的所有功能模块和业务逻辑。
覆盖边界条件:包括输入的边界值、特殊值和异常值,确保软件在边界情况下的行为正确。
覆盖错误处理:设计测试用例验证软件在错误输入或异常情况下的处理能力。
减少冗余性:
避免重复覆盖:通过等价类划分,避免对同一等价类中的多个值进行重复测试。
合并相似用例:对于功能相似的测试用例,尽量合并为一个用例,减少测试用例数量。
使用正交测试设计:通过正交表设计测试用例,确保测试用例的组合覆盖所有可能的输入组合,同时避免冗余。
四、 个人体会
通过本次黑盒测试实验,我深刻体会到理论与实践相结合的重要性。实验中,我熟练掌握了等价类划分、边界值分析、因果图法和决策表法等黑盒测试方法,并能够灵活运用这些方法设计测试用例。在设计测试用例时,我意识到全面考虑各种输入情况的重要性,同时要避免测试用例的冗余,确保每个用例都有其独特的价值。团队协作在实验过程中发挥了重要作用,通过与同学的交流和讨论,我更好地理解了测试方法和技巧,也发现了更多潜在问题。此外,我认识到软件测试是一个不断发展和改进的过程,需要持续学习新的测试方法和技术,以适应复杂多变的软件开发需求。这次实验不仅提高了我的问题解决能力,还增强了我的质量意识,让我更加深刻地认识到测试在保障软件质量中的关键作用,为今后的软件开发和测试工作奠定了坚实的基础。

浙公网安备 33010602011771号