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模拟真实用户场景,设计测试用例时,模拟真实用户的行为和操作场景较为困难。例如在旅馆住宿系统中,考虑用户在不同情况下添加房间的行为。

解决方法:

深入理解需求和功能,系统学习测试设计技术,掌握等价类划分、边界值分析、因果图法和决策表法等测试设计方法,合理运用它们设计测试用例。

体会:

测试设计的重要性,精心设计的测试用例可以高效地发现缺陷,保证软件质量。本次实验加深了对测试用例设计技术的理解和应用。理论与实践结合,将黑盒测试理论应用于实际程序测试,提高了测试效率和缺陷发现能力,体会到理论指导实践的重要性。持续改进测试方法,测试是一个不断学习和改进的过程,需要根据实际项目需求和经验,不断优化测试方法和用例设计。

posted @ 2025-04-27 23:42  混沌武士丞  阅读(14)  评论(0)    收藏  举报