426
实验二白盒测试
一、实验目的
1、 掌握白盒测试的基础知识;
2、 掌握白盒测试的检查内容及测试目的;
3、 掌握黑盒测试的几种基本测试方法:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖、路径覆盖。
二、实验要求
1、 复习有关内容,理解白盒测试;
2、 掌握语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖、路径覆盖,并能设计出测试用例;
3、 对具体软件,能分别使用相应的白盒测试方法设计测试用例,并实施测试、分析测试结果。
三、实验内容
l 对实验一1、3题使用逻辑覆盖法进行测试用例设计。
一设计函数实现输入日期显示星期几
1. 语句覆盖
测试用例表
| 测试用例编号 | 输入日期 | 预期输出 | 
| SC1 | 2025-04-20 | 星期日(Sunday) | 
| SC2 | 2025-02-29 | 无效日期 | 
| SC3 | 2000-02-29 | 星期二(Tuesday) | 
| SC4 | 非法格式(如abc) | 错误提示 | 
2. 判定覆盖
确保程序中的每个判定语句的真假分支都被执行。
测试用例信息表
| 测试用例编号 | 输入日期 | 测试判定条件 | 预期输出 | 
| DC1 | 2025-04-20 | 合法日期为真 | 星期日 | 
| DC2 | 2025-02-29 | 合法日期 为假 | 无效日期 | 
| DC3 | 2000-02-29 | 是否闰年 为真 | 星期二 | 
| DC4 | 2001-02-28 | 是否闰年 为假 | 星期三 | 
| DC5 | 非法格式(如abc) | 分隔符判断为假 | 错误提示 | 
3. 条件覆盖
确保程序中的每个条件的可能结果都被执行。
测试用例表
| 测试用例编号 | 输入日期 | 测试条件 | 预期输出 | 
| CC1 | 2000-02-29 | year % 4 == 0 为真 | 星期二 | 
| CC2 | 2000-02-29 | year % 100 != 0 为假 | 星期二 | 
| CC3 | 2000-02-29 | year % 400 == 0 为真 | 星期二 | 
| CC4 | 1900-02-28 | year % 4 == 0 为真 | 星期二 | 
| CC5 | 1900-02-28 | year % 100 != 0 为假 | 星期二 | 
| CC6 | 1900-02-28 | year % 400 == 0 为假 | 星期二 | 
| CC7 | 2004-02-29 | year % 4 == 0 为真 | 星期五 | 
| CC8 | 2004-02-29 | year % 100 != 0 为真 | 星期五 | 
| CC9 | 2004-02-29 | year % 400 == 0 为假 | 星期五 | 
流程图
三有一个饮料自动售货机(处理单价为5角钱)的控制处理软件,它的软件规格说明如下:
若投入5角钱的硬币,按下“橙汁”或“啤酒”的按钮,则相应的饮料就送出来。若投入1元钱的硬币,同样也是按“橙汁”或“啤酒”的按钮,则自动售货机在送出相应饮料的同时退回5角钱的硬币。
1. 语句覆盖
测试用例表
| 测试用例编号 | 输入硬币 | 按钮选择 | 预期输出 | 
| SC1 | 5角 | 橙汁 | 送出橙汁 | 
| SC2 | 5角 | 啤酒 | 送出啤酒 | 
| SC3 | 1元 | 橙汁 | 送出橙汁并退回5角 | 
| SC4 | 1元 | 啤酒 | 送出啤酒并退回5角 | 
| SC5 | 非法硬币 | 任意按钮 | 无动作并提示无效硬币 | 
2. 判定覆盖
测试用例信息表
| 测试用例编号 | 输入硬币 | 按钮选择 | 测试判定条件 | 预期输出 | 
| DC1 | 5角 | 橙汁 | 判断投入硬币为5角为真 | 送出橙汁 | 
| DC2 | 1元 | 橙汁 | 判断投入硬币为1元为真 | 送出橙汁并退回5角 | 
| DC3 | 非法硬币 | 任意按钮 | 判断投入硬币合法为假 | 无动作并提示无效硬币 | 
| DC4 | 5角 | 无效按钮 | 判断按钮选择有效为假 | 无动作并提示无效选择 | 
3. 条件覆盖
测试用例表
| 测试用例编号 | 输入硬币 | 按钮选择 | 测试条件 | 预期输出 | 
| CC1 | 5角 | 橙汁 | 投入硬币为5角为真 | 送出橙汁 | 
| CC2 | 1元 | 橙汁 | 投入硬币为1元为真 | 送出橙汁并退回5角 | 
| CC3 | 非法硬币 | 任意按钮 | 投入硬币合法为假 | 无动作并提示无效硬币 | 
| CC4 | 5角 | 无效按钮 | 按钮选择有效为假 | 无动作并提示无效选择 | 
流程图
l 对实验一2、4题使用基本路径法进行测试用例设计。
二假设商店货品价格(R) 都不大于100元(且为整数),若顾客付款(P)在100元内,现有一个程序能在每位顾客付款后给出找零钱的最佳组合(找给顾客货币张数最少)。 假定此商店的货币面值只包括:50元(N50)、10元(N10)、 5元(N5)、1元(N1) 四种。
控制流图
基本路径法测试用例设计
测试用例信息表
| 测试用例编号 | 价格 R | 付款 P | 预期输出(N50, N10, N5, N1) | 覆盖路径 | 
| TC1 | 95 | 100 | (1, 0, 0, 0) | 1→2→3→4→5→6→7 | 
| TC2 | 101 | 100 | "无效输入" | 1→2→3→7 | 
| TC3 | 50 | 49 | "无效输入" | 1→2→3→4→7 | 
| TC4 | 'a' | 100 | "输入必须为整数" | 1→2→7 | 
| TC5 | 45 | 100 | (1, 0, 1, 0) | 1→2→3→4→5→6→7 | 
| TC6 | 99 | 100 | (0, 0, 0, 1) | 1→2→3→4→5→6→7 | 
| TC7 | 1 | 100 | (1, 1, 0, 0) | 1→2→3→4→5→6→7 | 
4、航空服务查询问题:根据航线,仓位,飞行时间查询航空服务。
假设一个中国的航空公司规定:
① 中国去欧美的航线所有座位都有食物供应,每个座位都可以播放电影。
② 中国去非欧美的国外航线都有食物供应,只有商务仓可以播放电影。
③ 中国国内的航班的商务仓有食物供应,但是不可以播放电影
④ 中国国内航班的经济仓只有当飞行时间大于2小时时才有食物供应,但是不可以播放电影。
控制流图
基本路径法测试用例设计
测试用例信息表
| 测试用例编号 | 航线类型 | 舱位类型 | 飞行时间 | 预期输出(食物供应,电影服务) | 覆盖路径 | 
| TC1 | 国际欧美 | 商务舱 | 超过两小时 | 有,有 | 1→2→3→11→12 | 
| TC2 | 国际非欧美 | 经济舱 | 两小时以内 | 有,无 | 1→2→4→7→11→12 | 
| TC3 | 国内 | 经济舱 | 超过两小时 | 有,无 | 1→2→5→9→10→11→12 | 
| TC4 | 国内 | 商务舱 | 超过两小时 | 有,无 | 1→2→5→8→11→12 | 
| TC5 | 国际欧美 | 经济舱 | 两小时以内 | 有,有 | 1→2→3→11→12 | 
| TC6 | 国际非欧美 | 商务舱 | 超过两小时 | 有,有 | 1→2→4→6→11→12 | 
| TC7 | 国内 | 经济舱 | 两小时以内 | 无,无 | 1→2→5→9→10→11→12 | 
l 5、
程序伪代码
注意: 1)参数表中EMPTAB 为职员表,DEPTTAB为部门表;
2 ) ESIZE为职员表长度,DSIZE为部门表长度;
3)ERRCODE为出错码
MAXSALERS = 0;
ERRCODE = 0;
if(ESIZE <= 0 || DSIZE <= 0)
ERRCODE = 1;
else
{
for(i = 1; i < DSIZE ; i++) //选出各部门中最大的销售额值
if(SALES[i] > MAXSALES)
MAXSALES = SALES[i];
for(j = 1; j < DSIZE; j++) //循环找出销售额最大的部门
if(SALES[j] == MAXSALES)
{
FOUND = false;
for(int k = 1; k < ESIZE ; k++) //检查销售额最大部门的所有人员
if(EMPTAB.DEPT(k) == DEPTTAB.DEPT(j))
{
FOUND = true;
if(SALARY(k) >= 15000.00 or JOB(k) = 'M') //满足条件的人员加工资
SALARY(k) = SALARY(k) + 100.00;
else
SALARY(k) = SALARY(k) + 200.00;
}
if(FOUND == false)
ERRCODE == 2;
}
}
采用判定覆盖、条件覆盖对该程序进行用例设计
流程图
判定覆盖和条件覆盖测试用例设计
判定覆盖
测试用例编号 描述 输入条件 输出结果(ERRCODE) 覆盖路径
TC1 输入表为空 ESIZE = 0,DSIZE = 0 1 1→2→3→10→11
TC2 正常输入,最大部门有职员 ESIZE > 0,DSIZE > 0 0 1→2→3→4→5→6→7→8→9→10→11
TC3 最大部门无职员 ESIZE > 0,DSIZE > 0 2 1→2→3→4→5→6→7→8→9→10→11
测试用例信息表
| 测试用例编号 | 描述 | 输入条件 | 输出结果(ERRCODE) | 
| TC1 | 输入表为空 | ESIZE = 0,DSIZE = 0 | 1 | 
| TC2 | 正常输入,最大部门有职员 | ESIZE > 0,DSIZE > 0 | 0 | 
| TC3 | 最大部门无职员 | ESIZE > 0,DSIZE > 0 | 2 | 
条件覆盖
测试用例编号 描述 输入条件 输出结果(ERRCODE) 覆盖路径
TC4 薪资 ≥ 15000.00 SALARY[k] ≥ 15000.00 0 1→2→3→4→5→6→7→8→9→10→11
TC5 职位为经理 (M) JOB[k] = 'M' 0 1→2→3→4→5→6→7→8→9→10→11
TC6 薪资 < 15000.00 且职位非经理 SALARY[k] < 15000.00,JOB[k] ≠ 'M' 0
测试用例信息表
| 测试用例编号 | 描述 | 输入条件 | 输出结果(ERRCODE) | 
| TC4 | 薪资 ≥ 15000.00 | SALARY[k] ≥ 15000.00 | 0 | 
| TC5 | 职位为经理 (M) | JOB[k] = 'M' | 0 | 
| TC6 | 薪资 < 15000.00 且职位非经理 | SALARY[k] < 15000.00,JOB[k] ≠ 'M' | 0 | 
五、实验体会:
1. 遇到的问题
理解需求问题,一开始对于实验的具体要求和目标理解不够深入,导致在设计测试用例时方向有偏差,走了弯路。逻辑梳理问题,在分析程序逻辑时,对于一些复杂的条件判断和循环结构理解不够透彻,难以准确地构建控制流图和流程图。工具使用问题,不熟悉绘图工具的操作,绘制流程图时遇到了一些困难,如节点布局不合理、连线不清晰等,影响了图表的美观性和可读性。测试用例设计问题,在设计判定覆盖和条件覆盖的测试用例时,难以确保所有条件组合都被覆盖,存在遗漏的风险,设计出的测试用例不够全面。
2. 问题解决方法
深入分析逻辑,通过仔细阅读代码,使用调试工具单步执行程序,观察程序的执行流程和变量变化,结合手动画流程图的方式,逐步梳理清楚程序的逻辑结构,准确构建控制流图和流程图。学习工具使用,在网上查找绘图工具的使用教程,通过实践操作熟悉工具的各项功能,不断调整和优化流程图的布局,使其更加清晰、美观和符合规范。采用系统方法设计测试用例,学习和应用测试用例设计的系统方法,如判定表、等价类划分等,结合程序逻辑,全面分析所有可能的条件组合和路径,确保测试用例覆盖充分。
3. 收获
专业知识提升,通过本次实验,对程序测试的方法和流程有了更深入的理解,掌握了控制流图、流程图的绘制以及判定覆盖和条件覆盖的基本概念和应用场景,进一步巩固了软件工程的相关知识。问题解决能力增强,在遇到问题时,学会了通过多种途径查找资料、分析原因并寻找解决方案,提高了独立解决问题的能力,培养了严谨的思维习惯和耐心。工具使用熟练度提高,熟悉了绘图工具的使用,能够更熟练地运用工具表达自己的想法和成果,提高了工作效率,为今后的学习和工作提供了有力的支持。
 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号