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号
浙公网安备 33010602011771号