软件测试02
实验二白盒测试
一、实验目的
1、 掌握白盒测试的基础知识;
2、 掌握白盒测试的检查内容及测试目的;
3、 掌握黑盒测试的几种基本测试方法:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖、路径覆盖。
二、实验要求
1、 复习有关内容,理解白盒测试;
2、 掌握语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖、路径覆盖,并能设计出测试用例;
3、 对具体软件,能分别使用相应的白盒测试方法设计测试用例,并实施测试、分析测试结果。
三、实验内容
l 对实验一1、3题使用逻辑覆盖法进行测试用例设计。
l 对实验一2、4题使用基本路径法进行测试用例设计。
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;
}
}
采用判定覆盖、条件覆盖对该程序进行用例设计
四、实验结果:
(1) 基本路径法绘制出控制流图,逻辑覆盖法绘制出流程图
(2) 设计测试用列表
l 对实验一1、3题使用逻辑覆盖法进行测试用例设计。
实验一:
流程图如下图1:
图1
逻辑覆盖法
|
语句覆盖 |
||||
|
输入 |
测试路径 |
测试结果 |
||
|
Year |
Month |
Day |
||
|
a |
11 |
30 |
1-2-3-17 |
输入日期无效 |
|
2023 |
3 |
28 |
1-2-3-4-5-6-7-8-9-10-11-12-13-14-15-16-17 |
星期一 |
|
条件覆盖/条件覆盖/判定条件覆盖/条件组合覆盖 |
||||
|
输入 |
测试路径 |
测试结果 |
||
|
Year |
Month |
Day |
||
|
a |
11 |
30 |
1-2-3-17 |
输入日期无效 |
|
2001 |
a |
12 |
1-2-3-4-5-17 |
输入日期无效 |
|
2022 |
9 |
b |
1-2-3-4-5-6-7-17 |
输入日期无效 |
|
3000 |
10 |
1 |
1-2-3-4-5-6-7-8-17 |
输入日期无效 |
|
2020 |
14 |
4 |
1-2-3-4-5-6-7-8-9-17 |
输入日期无效 |
|
2021 |
1 |
32 |
1-2-3-4-5-6-7-8-9-10-17 |
输入日期无效 |
|
2008 |
2 |
30 |
1-2-3-4-5-6-7-8-9-10-11-17 |
输入日期无效 |
|
2009 |
2 |
29 |
1-2-3-4-5-6-7-8-9-10-11-12-17 |
输入日期无效 |
|
2022 |
1 |
32 |
1-2-3-4-5-6-7-8-9-10-11-12-13-17 |
输入日期无效 |
|
2023 |
6 |
31 |
1-2-3-4-5-6-7-8-9-10-11-12-13-14-17 |
输入日期无效 |
|
2023 |
3 |
28 |
1-2-3-4-5-6-7-8-9-10-11-12-13-14-15-16-17 |
星期一 |
|
路径覆盖 |
||||
|
输入 |
测试路径 |
测试结果 |
||
|
Year |
Month |
Day |
||
|
a |
11 |
30 |
1-2-3-17 |
输入日期无效 |
|
2001 |
a |
12 |
1-2-3-4-5-17 |
输入日期无效 |
|
2022 |
9 |
b |
1-2-3-4-5-6-7-17 |
输入日期无效 |
|
3000 |
10 |
1 |
1-2-3-4-5-6-7-8-17 |
输入日期无效 |
|
2020 |
14 |
4 |
1-2-3-4-5-6-7-8-9-17 |
输入日期无效 |
|
2021 |
1 |
32 |
1-2-3-4-5-6-7-8-9-10-17 |
输入日期无效 |
|
2008 |
2 |
30 |
1-2-3-4-5-6-7-8-9-10-11-17 |
输入日期无效 |
|
2009 |
2 |
29 |
1-2-3-4-5-6-7-8-9-10-11-12-17 |
输入日期无效 |
|
2021 |
1 |
32 |
1-2-3-4-5-6-7-8-9-10-11-12-13-17 |
输入日期无效 |
|
2022 |
4 |
31 |
1-2-3-4-5-6-7-8-9-10-11-12-13-14-17 |
输入日期无效 |
|
2023 |
3 |
28 |
1-2-3-4-5-6-7-8-9-10-11-12-13-14-15-16-17 |
星期一 |
运行截图如下图2:
图2
实验三:
伪代码如下:
if (coin == 0.5) {
// 投入 5 角
if (drink == "橙汁") {
dispense("橙汁")
change = 0
} else if (drink == "啤酒") {
dispense("啤酒")
change = 0
}
} else if (coin == 1.0) {
// 投入 1 元
if (drink == "橙汁") {
dispense("橙汁")
change = 0.5
} else if (drink == "啤酒") {
dispense("啤酒")
change = 0.5
}
}
程序图如下图3:
图3
控制流图如图4:
图4
测试用例 表如下:
|
语句覆盖/判定覆盖/条件覆盖判定条件覆盖/条件组合覆盖 |
|||
|
输入 |
测试路径 |
测试结果 |
|
|
Button1 |
Button2 |
||
|
e |
1 |
1-2-3-10 |
输入无效 |
|
2 |
1 |
1-2-3-4-5-6-11-9 |
取走啤酒 |
|
2 |
2 |
1-2-3-4-5-6-7-12-9 |
取走橙汁 |
|
1 |
1 |
1-2-3-4-5-6-7-8-13-9 |
取走啤酒,找零五角 |
|
1 |
2 |
1-2-3-4-5-6-7-8-14-9 |
取走橙汁,找零五角 |
|
路径覆盖 |
|||
|
输入 |
测试路径 |
测试结果 |
|
|
Button1 |
Button2 |
||
|
e |
1 |
1-2-3-10 |
输入无效 |
|
2 |
1 |
1-2-3-4-5-6-11-9 |
取走啤酒 |
|
2 |
2 |
1-2-3-4-5-6-7-12-9 |
取走橙汁 |
|
1 |
1 |
1-2-3-4-5-6-7-8-13-9 |
取走啤酒,找零五角 |
|
1 |
2 |
1-2-3-4-5-6-7-8-14-9 |
取走橙汁,找零五角 |
|
1 |
e |
1-2-3-5-10 |
输入无效 |
测试用例运行如图5:
图5
l 对实验一2、4题使用基本路径法进行测试用例设计。
实验二:
伪代码如下:
change = P - R
N50 = change / 50 // 取整
r1 = change % 50
N10 = r1 / 10 // 取整
r2 = r1 % 10
N5 = r2 / 5 // 取整
N1 = r2 % 5
控制流图
图6
计算复杂度V(G)
判定节点数+1=5
测试用例如下:
|
基本路径法(5) |
|||
|
输入 |
测试路径 |
测试结果 |
|
|
商品价格 |
支付金额 |
||
|
e |
99 |
1-2-7 |
输入无效 |
|
99 |
a |
1-2-3-7 |
输入无效 |
|
32 |
999 |
1-2-3-4-7 |
输入无效 |
|
20 |
10 |
1-2-3-4-5-7 |
输入无效 |
|
30 |
64 |
1-2-3-4-5-6 |
1元4张 5元0张 10元3张 50元0张 |
运行测试如下图7:
图7
实验四:
程序中的主要决策路径有:
航线选择(欧美、国外非欧美、国内)
舱位选择(商务舱、经济舱)
飞行时间(两小时以内、超过两小时)
基本路径法绘制出控制流图:
图8
计算复杂度V(G)
判定节点数(8)+1=9
测试用例如下:
|
基本路径法(9) |
||||
|
输入 |
测试路径 |
测试结果 |
||
|
航线 |
舱位 |
飞行时间 |
||
|
e |
1 |
2 |
1-2-10 |
输入无效 |
|
1 |
e |
2 |
1-2-3-10 |
输入无效 |
|
1 |
2 |
e |
1-2-3-4-10 |
输入无效 |
|
1 |
2 |
2 |
1-2-3-4-5-11 |
食物供应,播放电影 |
|
2 |
1 |
1 |
1-2-3-4-5-6-12 |
食物供应,播放电影 |
|
2 |
2 |
1 |
1-2-3-4-5-6-7-13 |
食物供应 |
|
3 |
1 |
2 |
1-2-3-4-5-6-7-8-14 |
食物供应 |
|
3 |
2 |
2 |
1-2-3-4-5-6-7-8-9-15 |
食物供应 |
|
3 |
2 |
1 |
1-2-3-4-5-6-7-8-9-16 |
无 |
运行测试如下图6:
图9
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;
}
}
逻辑覆盖法绘制出流程图如下图:
测试用列表:
1.输入表格
Employee Table
|
NAME |
JOB CODE |
DEPT |
Salary |
|
A |
E |
1 |
10000 |
|
B |
E |
1 |
9000 |
|
C |
M |
1 |
16000 |
|
D |
E |
1 |
15000 |
|
E |
E |
2 |
15000 |
|
F |
E |
2 |
15000 |
Department Table
|
DEPT |
SALES |
|
1 |
50000 |
|
2 |
30000 |
输出为0
2.输入表格
Employee Table
|
NAME |
JOB CODE |
DEPT |
Salary |
|
|
|
|
|
Department Table
|
DEPT |
SALES |
|
|
|
输出为1
3.输入表格
Employee Table
|
NAME |
JOB CODE |
DEPT |
Salary |
|
A |
E |
2 |
15000 |
|
B |
E |
2 |
15000 |
Department Table
|
DEPT |
SALES |
|
1 |
50000 |
|
2 |
30000 |
输出为2
条件覆盖
1.输入表格
Employee Table
|
NAME |
JOB CODE |
DEPT |
Salary |
|
A |
E |
1 |
10000 |
|
B |
E |
1 |
9000 |
|
C |
M |
1 |
16000 |
|
D |
E |
1 |
15000 |
|
E |
E |
2 |
15000 |
|
F |
E |
2 |
15000 |
Department Table
|
DEPT |
SALES |
|
1 |
50000 |
|
2 |
30000 |
输出为0
2.输入表格
Employee Table
|
NAME |
JOB CODE |
DEPT |
Salary |
|
A |
E |
1 |
12000 |
Department Table
|
DEPT |
SALES |
|
|
|
输出为1
3.输入表格
Employee Table
|
NAME |
JOB CODE |
DEPT |
Salary |
|
A |
E |
2 |
15000 |
|
B |
E |
2 |
15000 |
Department Table
|
DEPT |
SALES |
|
1 |
50000 |
|
2 |
30000 |
测试用例程序验证如下图:
五、实验体会:
遇到的问题:
循环结构(如for(i=1; i<DSIZE; i++))的边界条件容易被忽略,需注意DSIZE=1时循环不执行的情况。
条件组合覆盖时,需确保逻辑或(||)的两个条件分别取真,避免仅覆盖其中一个条件。
解决方法:
对循环变量的取值范围进行详细分析,设计DSIZE=1和DSIZE=2的用例。
针对SALARY(k) >= 15000 || JOB(k)='M',分别设计仅满足其中一个条件的用例,确保两个条件的独立性。
收获:
深刻理解白盒测试中判定覆盖与条件覆盖的差异:判定覆盖关注判断整体,条件覆盖关注每个子条件。
掌握了如何通过边界值和等价类设计有效测试用例,覆盖程序中的关键逻辑路径和错误处理分支。
认识到伪代码阅读和逻辑分解的重要性,需逐层分析循环、条件判断和变量状态变化。

浙公网安备 33010602011771号