4.27
实验一 黑盒测试
一、实验目的
1、 掌握黑盒测试的基础知识;
2、 掌握黑盒测试的检查内容及测试目的;
3、 掌握黑盒测试的几种基本测试方法:等价类划分方法、边界值分析方法、因果图法和决策表法;
二、实验要求
1、 复习有关内容,理解黑盒测试;
2、 掌握等价类划分、边界值分析方法、因果图法和决策表法,并能设计出测试用例;
3、 对具体软件,能分别使用相应的黑盒测试方法设计测试用例,并实施测试、分析测试结果。
三、实验内容
1、设计函数实现输入日期显示星期几,并用等价类及边界值法测试
实验步骤:
① 设计程序
def is_leap_year(year):
"""判断是否为闰年"""
return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)
def is_valid_date(year, month, day):
"""验证日期是否合法"""
if year < 1 or month < 1 or month > 12 or day < 1:
return False
month_days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
if is_leap_year(year):
month_days[1] = 29
return day <= month_days[month - 1]
def get_weekday(year, month, day):
"""计算星期几"""
if not is_valid_date(year, month, day):
return "无效日期"
# 处理1月和2月
if month < 3:
month += 12
year -= 1
q = day
m = month
K = year % 100
J = year // 100
h = (q + (13 * (m + 1) // 5) + K + (K // 4) + (J // 4) + 5 * J) % 7
weekdays = ['Saturday', 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
return weekdays[h]
# 主程序:处理用户输入
while True:
date_str = input("请输入日期(格式:年-月-日,例如2023-10-10):").strip()
# 处理常见分隔符(-, /, 空格)
for sep in ['-', '/', ' ']:
if sep in date_str:
parts = date_str.split(sep)
break
else:
print("错误:日期格式不正确,请使用 - / 或空格分隔")
continue
if len(parts) != 3:
print("错误:必须包含年月日三个部分")
continue
try:
year = int(parts[0])
month = int(parts[1])
day = int(parts[2])
except ValueError:
print("错误:日期必须为数字")
continue
result = get_weekday(year, month, day)
print(f"{year}年{month}月{day}日是 {result}")
Break
② 划分等价类,得到等价类表。等价类表格式如下:
|
输入条件 |
有效等价类 |
唯一标识 |
无效等价类 |
唯一标识 |
|
年份 |
正整数 |
V1 |
非正整数或非数字 |
IV1 |
|
月份 |
1-12的整数 |
V2 |
<1 或 >12 的整数或非数字 |
IV2 |
|
日期(非2月) |
1≤day≤对应月份最大天数 |
V3-1 |
<1 或 >最大天数 |
IV3-1 |
|
日期(2月平年) |
1≤day≤28 |
V3-2 |
<1 或 >28 |
IV3-2 |
|
日期(2月闰年) |
1≤day≤29 |
V3-3 |
<1 或 >29 |
IV3-3 |
③ 运用等价类划分法设计测试用例,得到测试用例表。测试用例表格式如下:
|
序号 |
输入数据 |
覆盖等价类 |
输出 |
|
1 |
(2023, 10, 10) |
V1, V2, V3-1 |
Tuesday |
|
2 |
(2023, 2, 28) |
V1, V2, V3-2 |
Tuesday |
|
3 |
(2020, 2, 29) |
V1, V2, V3-3 |
Saturday |
|
4 |
(0, 10, 10) |
IV1 |
无效日期 |
|
5 |
(2023, 13, 5) |
IV2 |
无效日期 |
|
6 |
(2023, 4, 31) |
IV3-1 |
无效日期 |
|
7 |
(2023, 2, 29) |
IV3-2 |
无效日期 |
|
8 |
(2020, 2, 30) |
IV3-3 |
无效日期 |
|
9 |
(2023, 5, 0) |
IV3-1 |
无效日期 |
④ 运用边界值法设计测试用例。
边界值测试用例表
|
序号 |
输入数据 |
预期输出 |
|
1 |
(1, 1, 1) |
Monday |
|
2 |
(2023, 12, 31) |
Sunday |
|
3 |
(2020, 2, 29) |
Saturday |
|
4 |
(2023, 4, 30) |
Sunday |
|
5 |
(2023, 0, 15) |
无效日期 |
|
6 |
(2023, 13, 5) |
无效日期 |
|
7 |
(2023, 1, 0) |
无效日期 |
|
8 |
(2023, 1, 32) |
无效日期 |
|
9 |
(2023, 4, 31) |
无效日期 |
|
10 |
(2023, 2, 29) |
无效日期 |
|
11 |
(2020, 2, 30) |
无效日期 |
2、找零钱最佳组合
假设商店货品价格(R) 都不大于100元(且为整数),若顾客付款(P)在100元内,现有一个程序能在每位顾客付款后给出找零钱的最佳组合(找给顾客货币张数最少)。 假定此商店的货币面值只包括:50元(N50)、10元(N10)、 5元(N5)、1元(N1) 四种。
请结合等价类划分法和边界值分析法为上述程序设计 出相应的测试用例。
实验步骤:
① 设计程序
def calculate_change(R, P):
# 输入验证
if not (isinstance(R, int) and isinstance(P, int)):
return "输入必须为整数"
if R < 1 or R > 100:
return "无效输入"
if P < R or P > 100:
return "无效输入"
change = P - R
n50 = change // 50
change %= 50
n10 = change // 10
change %= 10
n5 = change // 5
change %= 5
n1 = change
return (n50, n10, n5, n1)
# 测试示例
print(calculate_change(95, 100))
print(calculate_change(1, 100))
print(calculate_change(50, 49))
② 划分等价类,得到等价类表。等价类表格式如下:
|
输入条件 |
有效等价类 |
唯一标识 |
无效等价类 |
唯一标识 |
|
商品价格 |
1 ≤ R ≤ 100 |
V1 |
R < 1 或 R > 100 |
IV1 |
|
付款金额 |
R ≤ P ≤ 100 |
V2 |
P < R 或 P > 100 |
IV2 |
|
找零金额 |
0 ≤ P-R ≤ 99 |
V3 |
P-R < 0 或 P-R > 99 |
IV3 |
|
货币面值组合 |
能用50/10/5/1元最优组合覆盖 |
V4 |
包含非50/10/5/1元的其他面值 |
IV4 |
③ 运用等价类划分法设计测试用例,得到测试用例表。测试用例表格式如下:
有效输入测试表
|
序号 |
输入 (R, P) |
找零金额 |
预期输出 (N50, N10, N5, N1) |
覆盖等价类 |
边界值标记 |
|
1 |
(50, 50) |
0 |
(0, 0, 0, 0) |
V1, V2, V3 |
找零=0 |
|
2 |
(99, 100) |
1 |
(0, 0, 0, 1) |
V1, V2, V3 |
找零=1 |
|
3 |
(96, 100) |
4 |
(0, 0, 0, 4) |
V4 |
1元分界 |
|
4 |
(95, 100) |
5 |
(0, 0, 1, 0) |
V4 |
5元分界 |
|
5 |
(90, 100) |
10 |
(0, 1, 0, 0) |
V4 |
10元分界 |
|
6 |
(50, 100) |
50 |
(1, 0, 0, 0) |
V4 |
50元分界 |
|
7 |
(1, 100) |
99 |
(1,4,1,4) |
V3, V4 |
找零=99 |
|
8 |
(30, 85) |
55 |
(1,0,1,0) |
V4 |
组合优化 |
无效测试用例表
|
序号 |
输入 (R, P) |
预期输出 |
覆盖等价类 |
错误原因 |
|
9 |
(0, 50) |
"无效输入" |
IV1 |
R < 1 |
|
10 |
(101, 100) |
"无效输入" |
IV1 |
R > 100 |
|
11 |
(50, 49) |
"无效输入" |
IV2 |
P < R |
|
12 |
(50, 101) |
"无效输入" |
IV2 |
P > 100 |
|
13 |
(50, 50.5) |
"输入必须为整数" |
IV4 |
非整数输入 |
|
14 |
("a", 100) |
"输入必须为整数" |
IV4 |
非数字输入 |
④ 运用边界值法设计测试用例。
测试目标与边界值示例表
|
测试目标 |
边界值示例 |
说明 |
|
找零金额最小值 |
P-R = 0 |
无需找零 |
|
找零金额最大值 |
P-R = 99 |
最大找零金额 |
|
面值临界点 |
1元/5元/10元/50元分界点 |
例如:4元(需1元)、5元(需5元) |
|
商品价格临界值 |
R=1, R=100 |
最小/最大商品价格 |
|
付款金额临界值 |
P=R, P=100 |
最小/最大付款金额 |
3、有一个饮料自动售货机(处理单价为5角钱)的控制处理软件,它的软件规格说明如下:
若投入5角钱的硬币,按下“橙汁”或“啤酒”的按钮,则相应的饮料就送出来。若投入1元钱的硬币,同样也是按“橙汁”或“啤酒”的按钮,则自动售货机在送出相应饮料的同时退回5角钱的硬币。
用因果图法测试该程序,并撰写实验报告。
实验步骤:
①编写程序
import tkinter as tk
class VendingMachine:
def __init__(self, root):
self.root = root
self.root.title("饮料自动售货机")
self.balance = 0 # 当前余额(单位:角)
self.status_text = tk.StringVar()
self.status_text.set("请投币(5角或1元)")
# 界面布局
tk.Label(root, text="饮料售货机", font=("Arial", 16)).grid(row=0, columnspan=3)
# 投币按钮
tk.Button(root, text="投5角", command=lambda: self.insert_coin(5)).grid(row=1, column=0)
tk.Button(root, text="投1元", command=lambda: self.insert_coin(10)).grid(row=1, column=1)
# 饮料选择按钮
self.oj_btn = tk.Button(root, text="橙汁", state=tk.DISABLED, command=self.dispense_oj)
self.oj_btn.grid(row=2, column=0)
self.beer_btn = tk.Button(root, text="啤酒", state=tk.DISABLED, command=self.dispense_beer)
self.beer_btn.grid(row=2, column=1)
# 状态显示
tk.Label(root, textvariable=self.status_text).grid(row=3, columnspan=3)
def insert_coin(self, amount):
"""处理投币"""
self.balance += amount
self.status_text.set(f"已投币:{self.balance//10}元{self.balance%10}角")
self.oj_btn.config(state=tk.NORMAL)
self.beer_btn.config(state=tk.NORMAL)
def dispense(self, drink):
"""处理出货逻辑"""
if self.balance >= 5:
change = self.balance - 5
self.status_text.set(f"出货{drink}" + (f",找零{change}角" if change >0 else ""))
self.balance = 0
self.oj_btn.config(state=tk.DISABLED)
self.beer_btn.config(state=tk.DISABLED)
else:
self.status_text.set("余额不足,请继续投币")
def dispense_oj(self):
self.dispense("橙汁")
def dispense_beer(self):
self.dispense("啤酒")
if __name__ == "__main__":
root = tk.Tk()
vm = VendingMachine(root)
root.mainloop()
②分析原因与结果
原因(输入条件):
C1:投入5角硬币
C2:投入1元硬币
C3:点击橙汁按钮
C4:点击啤酒按钮
结果节点:
E1:橙汁送出
E2:啤酒送出
E3:找零5角
因果关系:
C1 → E1(投入5角硬币后,橙汁按钮可点击)
C1 → E2(投入5角硬币后,啤酒按钮可点击)
C2 → E1(投入1元硬币后,橙汁按钮可点击)
C2 → E2(投入1元硬币后,啤酒按钮可点击)
C3 ∧ (C1 ∨ C2) → E3(投入硬币且点击橙汁按钮时,橙汁送出)
C4 ∧ (C1 ∨ C2) → E4(投入硬币且点击啤酒按钮时,啤酒送出)
C2 ∧ (C3 ∨ C4) → E5(投入1元硬币且点击饮料按钮时,找零5角)
(C3 ∨ C4) ∧ (C1 ∨ C2) → E6(出货后状态显示“请投币”)
(C3 ∨ C4) ∧ (C1 ∨ C2) → E7(出货后按钮不可点击)
③画出因果图
④转化为决策表
|
|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
|
五角按钮 |
1 |
1 |
0 |
0 |
1 |
1 |
- |
- |
|
一元按钮 |
0 |
0 |
1 |
1 |
0 |
1 |
- |
- |
|
橙汁按钮 |
1 |
0 |
1 |
0 |
- |
- |
1 |
0 |
|
啤酒按钮 |
0 |
1 |
0 |
1 |
- |
- |
0 |
1 |
|
出啤酒 |
0 |
1 |
0 |
1 |
0 |
0 |
0 |
0 |
|
出橙汁 |
1 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
|
找回五角钱 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
⑤根据决策表设计测试用例,得到测试用例表
测试用例表
|
测试用例编号 |
输入条件(C1:投入5角,C2:投入1元,C3:点击橙汁,C4:点击啤酒) |
预期结果(E1:橙汁送出,E2:啤酒送出,E3:找零5角) |
|
测试用例1 |
C1=1,C2=0,C3=1,C4=0 |
E1=1,E2=0,E3=0 |
|
测试用例2 |
C1=1,C2=0,C3=0,C4=1 |
E1=0,E2=1,E3=0 |
|
测试用例3 |
C2=1,C1=0,C3=1,C4=0 |
E1=1,E2=0,E3=1 |
|
测试用例4 |
C2=1,C1=0,C3=0,C4=1 |
E1=0,E2=1,E3=1 |
|
测试用例5 |
C1=1,C2=0,C3=0,C4=0 |
E1=0,E2=0,E3=0 |
|
测试用例6 |
C2=1,C1=0,C3=0,C4=0 |
E1=0,E2=0,E3=0 |
|
测试用例7 |
C1=0,C2=0,C3=1,C4=0 |
E1=0,E2=0,E3=0 |
|
测试用例8 |
C1=0,C2=0,C3=0,C4=1 |
E1=0,E2=0,E3=0 |
4、航空服务查询问题:根据航线,仓位,飞行时间查询航空服务。
假设一个中国的航空公司规定:
① 中国去欧美的航线所有座位都有食物供应,每个座位都可以播放电影。
② 中国去非欧美的国外航线都有食物供应,只有商务仓可以播放电影。
③ 中国国内的航班的商务仓有食物供应,但是不可以播放电影
④ 中国国内航班的经济仓只有当飞行时间大于2小时时才有食物供应,但是不可以播放电影。
请用程序实现上述功能,并用决策表法设计测试用例,再执行测试,撰写实验报告。
实验步骤:
① 编写程序
import tkinter as tk
from tkinter import messagebox
class AirlineService:
def __init__(self, route, cabin_class, flight_duration_category):
self.route = route # "国际欧美", "国际非欧美", "国内"
self.cabin_class = cabin_class # "商务舱", "经济舱"
self.flight_duration_category = flight_duration_category # "两小时以内", "超过两小时"
def get_services(self):
food_available = False
movie_available = False
# 根据规则判断是否有食物供应和电影服务
if self.route == "国际欧美":
food_available = True
movie_available = True
elif self.route == "国际非欧美":
food_available = True
if self.cabin_class == "商务舱":
movie_available = True
elif self.route == "国内":
if self.cabin_class == "商务舱":
food_available = True
elif self.cabin_class == "经济舱":
if self.flight_duration_category == "超过两小时":
food_available = True
movie_available = movie_available and (self.route != "国内")
return {
"food": food_available,
"movie": movie_available
}
class Application(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.master = master
self.pack()
self.create_widgets()
def create_widgets(self):
# 设置窗口标题和大小
self.master.title("航空服务查询问题")
self.master.geometry("400x350")
# 航线选择
self.route_frame = tk.LabelFrame(self, text="航线:")
self.route_frame.pack(fill="x", padx=10, pady=5)
self.route_var = tk.StringVar()
self.route_var.set("国际欧美")
self.route_eu_usa_rb = tk.Radiobutton(self.route_frame, text="欧美", variable=self.route_var, value="国际欧美")
self.route_eu_usa_rb.pack(side="left", padx=20)
self.route_non_eu_usa_rb = tk.Radiobutton(self.route_frame, text="国外非欧美", variable=self.route_var,
value="国际非欧美")
self.route_non_eu_usa_rb.pack(side="left")
self.route_domestic_rb = tk.Radiobutton(self.route_frame, text="国内", variable=self.route_var, value="国内")
self.route_domestic_rb.pack(side="left", padx=20)
# 仓位选择
self.cabin_frame = tk.LabelFrame(self, text="舱位:")
self.cabin_frame.pack(fill="x", padx=10, pady=5)
self.cabin_var = tk.StringVar()
self.cabin_var.set("商务舱")
self.cabin_business_rb = tk.Radiobutton(self.cabin_frame, text="商务舱", variable=self.cabin_var,
value="商务舱")
self.cabin_business_rb.pack(side="left", padx=20)
self.cabin_economy_rb = tk.Radiobutton(self.cabin_frame, text="经济舱", variable=self.cabin_var, value="经济舱")
self.cabin_economy_rb.pack(side="left")
# 飞行时间选择
self.flight_time_frame = tk.LabelFrame(self, text="飞行时间:")
self.flight_time_frame.pack(fill="x", padx=10, pady=5)
self.flight_time_var = tk.StringVar()
self.flight_time_var.set("两小时以内")
self.flight_time_short_rb = tk.Radiobutton(self.flight_time_frame, text="两小时以内",
variable=self.flight_time_var, value="两小时以内")
self.flight_time_short_rb.pack(side="left", padx=20)
self.flight_time_long_rb = tk.Radiobutton(self.flight_time_frame, text="超过两小时",
variable=self.flight_time_var, value="超过两小时")
self.flight_time_long_rb.pack(side="left")
# 查询结果
self.result_frame = tk.LabelFrame(self, text="航空服务:")
self.result_frame.pack(fill="x", padx=10, pady=10)
self.result_var = tk.StringVar()
self.result_var.set("")
self.result_entry = tk.Entry(self.result_frame, textvariable=self.result_var, width=40, state='readonly')
self.result_entry.pack(pady=5)
# 查询和退出按钮
self.button_frame = tk.Frame(self)
self.button_frame.pack(fill="x", padx=10, pady=10)
self.query_button = tk.Button(self.button_frame, text="查询", command=self.query_service)
self.query_button.pack(side="left", padx=20)
self.exit_button = tk.Button(self.button_frame, text="退出", command=self.master.quit)
self.exit_button.pack(side="right", padx=20)
def query_service(self):
route = self.route_var.get()
cabin = self.cabin_var.get()
flight_time = self.flight_time_var.get()
service = AirlineService(route, cabin, flight_time).get_services()
food_text = "有" if service["food"] else "无"
movie_text = "有" if service["movie"] else "无"
result_text = f"食物供应: {food_text}, 电影服务: {movie_text}"
self.result_var.set(result_text)
# 创建并启动窗口
root = tk.Tk()
app = Application(master=root)
app.mainloop()
② 构造决策表
|
|
1 |
2 |
3 |
4 |
5 |
6 |
|
欧美 |
1 |
0 |
0 |
0 |
0 |
0 |
|
国外非欧美 |
0 |
1 |
1 |
0 |
0 |
0 |
|
国内 |
0 |
0 |
0 |
1 |
1 |
1 |
|
商务舱 |
- |
1 |
0 |
1 |
0 |
0 |
|
经济舱 |
- |
0 |
1 |
0 |
1 |
1 |
|
两小时以内 |
- |
- |
- |
- |
0 |
1 |
|
两小时以外 |
- |
- |
- |
- |
1 |
0 |
|
播放电影 |
1 |
1 |
0 |
0 |
0 |
0 |
|
食物供应 |
1 |
1 |
1 |
1 |
1 |
0 |
③ 根据决策表设计测试用例,得到测试用例表
航班服务用例表
|
用例号 |
航线 |
舱位 |
飞行时间 |
预期食物 |
预期电影 |
|
1 |
国际欧美 |
商务舱 |
两小时以内 |
是 |
是 |
|
2 |
国际欧美 |
经济舱 |
超过两小时 |
是 |
是 |
|
3 |
国际非欧美 |
商务舱 |
两小时以内 |
是 |
是 |
|
4 |
国际非欧美 |
经济舱 |
超过两小时 |
是 |
否 |
|
5 |
国内 |
商务舱 |
两小时以内 |
是 |
否 |
|
6 |
国内 |
经济舱 |
超过两小时 |
是 |
否 |
|
7 |
国内 |
经济舱 |
两小时以内 |
否 |
否 |
5、旅馆住宿系统中,旅馆业主可进行添加房间操作。
– 旅馆业主登录旅馆住宿系统后,可以请求添加房间;
– 待进入“房间管理”对话框,单击“添加”按钮可进行添加房间操作;
– 添加房间时,可以设定房间的房间编号、房间类型、房间描述信息;
– 添加房间信息不能缺失,若某一项未填写,要给出提示信息;
– 房间编号长度不超过5个字符;
– 房间描述长度不超过1000个字符;
– 房间信息不能重复,成功填写后,可进行保存或取消操作,之后返回“房间管理”对话框,结束添加房间流程。
实验步骤:
利用黑盒测试策略编写添加房间功能的测试用例。
程序
import tkinter as tk
from tkinter import messagebox
class HotelManagementSystem:
def __init__(self, master):
self.master = master
self.master.title("旅馆住宿系统 - 房间管理")
# 模拟数据库,存储已存在的房间信息
self.existing_rooms = [
{"number": "101", "type": "单人间", "description": "标准单人间"},
{"number": "102", "type": "双人间", "description": "标准双人间"}
]
self.create_widgets()
def create_widgets(self):
# 房间编号
tk.Label(self.master, text="房间编号:").grid(row=0, column=0, sticky=tk.W, padx=10, pady=5)
self.room_number = tk.Entry(self.master)
self.room_number.grid(row=0, column=1, padx=10, pady=5)
# 房间类型
tk.Label(self.master, text="房间类型:").grid(row=1, column=0, sticky=tk.W, padx=10, pady=5)
self.room_type = tk.Entry(self.master)
self.room_type.grid(row=1, column=1, padx=10, pady=5)
# 房间描述
tk.Label(self.master, text="房间描述:").grid(row=2, column=0, sticky=tk.W, padx=10, pady=5)
self.room_description = tk.Text(self.master, height=5, width=30)
self.room_description.grid(row=2, column=1, padx=10, pady=5)
# 按钮
self.save_button = tk.Button(self.master, text="保存", command=self.save_room)
self.save_button.grid(row=3, column=0, padx=10, pady=10)
self.cancel_button = tk.Button(self.master, text="取消", command=self.cancel)
self.cancel_button.grid(row=3, column=1, padx=10, pady=10)
def validate_input(self):
# 获取输入
number = self.room_number.get().strip()
room_type = self.room_type.get().strip()
description = self.room_description.get("1.0", tk.END).strip()
# 验证是否为空
if not number:
messagebox.showwarning("输入错误", "房间编号不能为空")
return False
if not room_type:
messagebox.showwarning("输入错误", "房间类型不能为空")
return False
if not description:
messagebox.showwarning("输入错误", "房间描述不能为空")
return False
# 验证长度
if len(number) > 5:
messagebox.showwarning("输入错误", "房间编号长度不能超过5个字符")
return False
if len(description) > 1000:
messagebox.showwarning("输入错误", "房间描述长度不能超过1000个字符")
return False
# 验证是否重复
for room in self.existing_rooms:
if room["number"] == number and room["type"] == room_type and room["description"] == description:
messagebox.showwarning("输入错误", "房间信息已存在")
return False
return True
def save_room(self):
if self.validate_input():
number = self.room_number.get().strip()
room_type = self.room_type.get().strip()
description = self.room_description.get("1.0", tk.END).strip()
# 添加到现有房间列表(模拟数据库操作)
self.existing_rooms.append({"number": number, "type": room_type, "description": description})
messagebox.showinfo("成功", "房间添加成功")
self.room_number.delete(0, tk.END)
self.room_type.delete(0, tk.END)
self.room_description.delete("1.0", tk.END)
def cancel(self):
self.room_number.delete(0, tk.END)
self.room_type.delete(0, tk.END)
self.room_description.delete("1.0", tk.END)
# 创建并启动窗口
root = tk.Tk()
app = HotelManagementSystem(root)
root.mainloop()
划分等价类,得到等价类表。等价类表格式如下:
等价类测试用例表
|
等价类ID |
描述 |
输入条件 |
有效/无效 |
|
EC1 |
房间编号有效 |
长度1-5个字符 |
有效 |
|
EC2 |
房间编号无效 |
长度超过5个字符 |
无效 |
|
EC3 |
房间类型有效 |
至少一个字符 |
有效 |
|
EC4 |
房间类型无效 |
空字符串 |
无效 |
|
EC5 |
房间描述有效 |
长度1-1000个字符 |
有效 |
|
EC6 |
房间描述无效 |
长度超过1000个字符 |
无效 |
|
EC7 |
房间信息有效 |
房间信息不重复 |
有效 |
|
EC8 |
房间信息无效 |
房间信息重复 |
无效 |
|
EC9 |
信息完整有效 |
所有字段都填写 |
有效 |
|
EC10 |
信息不完整无效 |
至少一个字段未填写 |
无效 |
测试用例
测试用例表
|
测试用例ID |
等价类ID组合 |
输入数据 |
预期结果 |
|
TC1 |
EC1, EC3, EC5, EC7, EC9 |
所有字段正确填写 |
提示添加成功,返回房间管理界面 |
|
TC2 |
EC2 |
房间编号为6个字符 |
提示“房间编号长度不能超过5个字符” |
|
TC3 |
EC4 |
房间类型为空 |
提示“房间类型不能为空” |
|
TC4 |
EC6 |
房间描述超过1000字符 |
提示“房间描述长度不能超过1000字符” |
|
TC5 |
EC8 |
添加已经存在的房间信息 |
提示“房间信息已存在” |
|
TC6 |
EC10 |
缺少房间编号 |
提示“房间编号不能为空” |
|
TC7 |
EC10 |
缺少房间类型 |
提示“房间类型不能为空” |
|
TC8 |
EC10 |
缺少房间描述 |
提示“房间描述不能为空” |
四、实验思考
1. 如何设计测试用例才能达到用最少的测试用例检测出最多的缺陷
1优先覆盖关键功能和业务逻辑,识别系统的核心功能和用户最常用的路径,确保这些部分得到充分测试。例如在旅馆住宿系统中,房间信息的添加和验证是关键操作,应重点设计相关测试用例。2采用等价类划分和边界值分析,通过等价类划分减少测试用例数量,同时用边界值分析覆盖极端情况。比如在日期函数测试中,选择每个等价类的典型值和边界值进行测试,可有效减少冗余测试。3基于风险设计测试用例,识别系统中容易出错或关键的部分,优先设计针对这些区域的测试用例。例如在自动售货机程序中,投入不同硬币和选择饮料的组合是关键业务逻辑,应重点测试。
2. 如何考虑软件测试用例的充分性和减少软件测试用例的冗余性
确保测试用例覆盖所有需求和功能点,根据软件规格说明,确保每个功能和需求都有对应的测试用例。例如在航空服务查询程序中,覆盖所有航线、仓位和飞行时间组合。避免重复的测试条件和场景,设计测试用例时,去除重复的测试条件和场景。例如在旅馆住宿系统中,避免设计多个仅输入数据不同的用例。使用测试设计技术优化用例,采用等价类划分、边界值分析、因果图法和决策表法等技术,优化测试用例设计,确保用例充分且不冗余。例如在饮料自动售货机程序中,通过因果图法和决策表法设计精简但覆盖全面的测试用例。
3. 本次实验遇到的难点及体会
难点:
1准确划分等价类和识别边界值,需要深入理解软件需求和功能,才能准确划分等价类和确定边界值。例如在日期函数中,确定不同月份和年的边界值较为复杂。
2设计合理的测试用例组合,确保测试用例覆盖所有可能的输入组合和场景是一项挑战。例如在航空服务查询和旅馆住宿系统中,涉及多个输入条件和组合。
3模拟真实用户场景,设计测试用例时,模拟真实用户的行为和操作场景较为困难。例如在旅馆住宿系统中,考虑用户在不同情况下添加房间的行为。
解决方法:
深入理解需求和功能,系统学习测试设计技术,掌握等价类划分、边界值分析、因果图法和决策表法等测试设计方法,合理运用它们设计测试用例。
体会:
测试设计的重要性,精心设计的测试用例可以高效地发现缺陷,保证软件质量。本次实验加深了对测试用例设计技术的理解和应用。理论与实践结合,将黑盒测试理论应用于实际程序测试,提高了测试效率和缺陷发现能力,体会到理论指导实践的重要性。持续改进测试方法,测试是一个不断学习和改进的过程,需要根据实际项目需求和经验,不断优化测试方法和用例设计。
浙公网安备 33010602011771号