白盒测试实验
《软件测试技术 》实验报告 实验序号:03 实验项目名称:使用基本路径覆盖法测试自动售货机程序 一、实验目的及要求
理解并掌握分支和条件覆盖测试法,能够实际运用;
理解并掌握基本路径覆盖测试法,能够实际运用
使用Eclipse+JUnit+EclEmma进行单元测试。
二、实验设备(环境)及要求
, 开发环境:Eclipse v3.7及以上版本;JUnit v4.10及以上版本;文本编辑
软件。
, 硬件要求:CPU PIV 以上,256M 内存,1G 硬盘空间。
, 系统要求:Windows98/Me/XP/NT/2000,IE 5 以上。 三、实验内容与步骤
1. 下载并安装Eclipse+JUnit+EclEmma实验环境;
2. 通读自动售货机程序,并在Eclipse环境下运行该程序;
3. 设计自动售货机程序相关的分支覆盖测试用例并进行测试
4. 设计自动售货机程序相关的条件覆盖测试用例并进行测试。
5. 使用基本路径测试法设计测试用例;
, 绘制程序控制流图:
, 计算环路复杂度;
, 确定基本路径;
, 设计测试用例
6. 完整填写以下
编 输入值 输入值 状态 预期输出 实际情
号 况 Type money
各资001 Beer 5C Input Information
源剩Type: Beer; Money: 5 Cents; Change: 0
余
Current State
Beer: 5
Orange Juice: 6
5 Cents: 7
1 Dollar: 6
各资002 OrangeJuice 5C Input Information
源剩Type: OrangeJuice; Money: 5 Cents; Change: 0
余
Current State
Beer: 6
Orange Juice: 5
5 Cents: 7
1 Dollar: 6
没有003 Beer 1D Failure Information
啤酒 Beer Shortage
…
…
7. 编写JUnit测试用例,并运行程序,保证所有测试用例通过测试; 8. 使用EclEmma检测测试用例覆盖率,保证覆盖率达到100%。
四、程序调试与结果
1、分支覆盖测试(程序中的每一个分支都至少被执行一次)
编 输入值 输入值 状态 预期输出 实际情况
号 Type money
各资与预期一样 001 Beer 5C Input Information
源剩Type: Beer; Money: 5 Cents; Change: 0
余
Current State
Beer: 5
Orange Juice: 6
5 Cents: 7
1 Dollar: 6
Failure Information 没有与预期一样 002 Beer 5C
Beer Shortage 啤酒
各资与预期一样 003 OrangeJuice 5C Input Information
源剩Type: Beer; Money: 5 Cents; Change: 0
余
Current State
Beer: 6
Orange Juice: 5
5 Cents: 7
1 Dollar: 6
Failure Information 没有与预期不一004 OrangeJuice 5C
橙汁 OrangeJuice Shortage 样
Failure Information 各资与预期一样 005 Cola 5C
源均Type Error
有剩
余
各资与预期不一006 Beer 1D Input Information
源均样 Type: Beer; Money: 1 Dollar; Change: 5
有剩Cents
余
Current State
Beer:5
Orange Juice: 6
5 Cents: 5
1 Dollar: 7
没有与预期不一007 Beer 1D Failure Information 5角样 Change Shortage 零钱
各资与预期不一008 OrangeJuice 1D Input Information 源均样 Type: OrangeJuice; Money: 1 Dollar;
有剩Change: 5 Cents 余
Current State
Beer:6
Orange Juice: 5
5 Cents: 5
1 Dollar: 7
没有与预期不一009 OrangeJuice 1D Failure Information 橙汁 样 OrangeJuice Shortage
Failure Information 各资与预期一样 010 Cola 1D
源剩Type Error
余
没有与预期不一011 Beer 1D Failure Information 零钱 样 Change Shortage 各资与预期一样 012 OrangeJuice 4C Failure Information 源剩Money Error
余
2、条件覆盖测试(程序中的每一个条件至少有一次被满足)
测试条件:投入1元,选择啤酒,有啤酒,是否有零钱
Failure Information 与预期一样 各资005 Cola 5C
源均Type Error
有剩
余
各资与预期不一006 Beer 1D Input Information 源均样 Type: Beer; Money: 1 Dollar; Change: 5
有剩Cents
余
Current State
Beer:5
Orange Juice: 6
5 Cents: 5
1 Dollar: 7
3、基本路径测试法(覆盖程序中的所有可能的执行路径)
环路复杂度V(G)=区域数目=边界数目-节点数目+2=胖点节点数目+1=10
编 输入值 输入值 状态 预期输出 实际情况
号 Type money
各资与预期一样 001 Beer 5C Input Information
源剩Type: Beer; Money: 5 Cents; Change: 0
余
Current State
Beer: 5
Orange Juice: 6
5 Cents: 7
1 Dollar: 6
Failure Information 没有与预期一样 002 Beer 5C
Beer Shortage 啤酒
各资与预期一样 003 OrangeJuice 5C Input Information
源剩Type: Beer; Money: 5 Cents; Change: 0
余
Current State
Beer: 6
Orange Juice: 5
5 Cents: 7
1 Dollar: 6
Failure Information 没有与预期不一004 OrangeJuice 5C
橙汁 OrangeJuice Shortage 样
Failure Information 各资与预期一样 005 Cola 5C
源均Type Error
有剩
余
各资与预期不一006 Beer 1D Input Information
源均样 Type: Beer; Money: 1 Dollar; Change: 5
有剩Cents
余
Current State
Beer:5
Orange Juice: 6
5 Cents: 5
1 Dollar: 7
没有与预期不一007 Beer 1D Failure Information
5角样 Change Shortage 零钱
各资与预期不一008 OrangeJuice 1D Input Information 源均样 Type: OrangeJuice; Money: 1 Dollar;
有剩Change: 5 Cents 余
Current State
Beer:6
Orange Juice: 5
5 Cents: 5
1 Dollar: 7
没有与预期不一009 OrangeJuice 1D Failure Information 橙汁 样 OrangeJuice Shortage
Failure Information 各资与预期一样 010 Cola 1D
源剩Type Error
余
没有与预期不一011 Beer 1D Failure Information 零钱 样 Change Shortage 各资与预期一样 012 OrangeJuice 4C Failure Information 源剩Money Error
余
用有缺陷的代码测试结果:
修改代码后:
所有测试成功、使用EclEmma检测测试用例覆盖率达100%
五、分析与讨论
这次试验基于上次的试验,围绕白盒测试的基本路径覆盖法测试进行测试。 重点在于对测试用例的设计,试验中借助了程序流程控制图来设计用例。 在测试覆盖率时,由于在创建一个新的SaleMachine类的对象时,如果售货机各
资源都有剩余,则不需要写
只需默认的(因为SaleMachine类中有初始化函数)
否则,测试覆盖率只有90.6%。
六、教师评语 成绩
签名:
日期:
附件:
修改后的实现代码:
package test3;
public class SaleMachine {
private int countOfBeer, countOfOrangeJuice, countOfFiveCents,
countOfOneDollar;
private String[] typeOfGoods = {"Beer", "OrangeJuice"};
private String resultOfDeal;
public SaleMachine()
{
initial();
}
public void initial()
{
countOfBeer = 6;
countOfOrangeJuice = 6;
countOfFiveCents = 6;
countOfOneDollar = 6;
}
public SaleMachine(int fiveCents, int oneDollar, int numOfBeer, int
numOfOrange)
//便于测试的初始化函数
{
countOfFiveCents = fiveCents;
countOfOneDollar = oneDollar;
countOfBeer = numOfBeer;
countOfOrangeJuice = numOfOrange;
}
public String currentState()
{
String state = "Current State\n" +
"Beer: " + countOfBeer + "\n" +
"Orange Juice: " + countOfOrangeJuice + "\n" +
"5 Cents: " + countOfFiveCents + "\n" +
"1 Dollar: " + countOfOneDollar;
return state;
}
public String operation(String type, String money)
//type是用户选择的产品,money是用户投币种类
{
if(money.equalsIgnoreCase("5C")) //如果用户投入5角钱
{
if(type.equals(typeOfGoods[0])) //如果用户选择啤酒
{
if(countOfBeer>0) //如果还有啤酒
{
countOfBeer--;
countOfFiveCents++;
resultOfDeal = "Input Information \n" +
"Type: Beer; Money: 5 Cents; Change:
0\n\n" + currentState();
return resultOfDeal;
}
else
{
resultOfDeal = "Failure Information \n" + "Beer
Shortage";
return resultOfDeal;
}
}
else if (type.equals(typeOfGoods[1])) //用户选择橙汁
{
if(countOfOrangeJuice > 0)
{
countOfOrangeJuice--;
countOfFiveCents++;
resultOfDeal = "Input Information \n" +
"Type: OrangeJuice; Money: 5 Cents;
Change: 0\n\n" + currentState();
return resultOfDeal;
}
else
{
resultOfDeal = "Failure Information \n" + "OrangeJuice
Shortage";
return resultOfDeal;
}
}
else
{
resultOfDeal = "Failure Information \n" + "Type Error";
return resultOfDeal;
}
}
else if(money.equalsIgnoreCase("1D")) //如果用户投入一元钱
{
if(countOfFiveCents > 0) //如果用户有零钱
{
if(type.equals(typeOfGoods[0])&&countOfBeer>0)//如果用户选择啤酒而且还有啤酒
{
countOfBeer--;
countOfFiveCents--;
countOfOneDollar++;
resultOfDeal = "Input Information \n" +
"Type: Beer; Money: 1 Dollar; Change: 5 Cents\n\n" + currentState();
return resultOfDeal;
}
else if
(type.equals(typeOfGoods[1])&&countOfOrangeJuice>0)//如果用户选择橙汁而且还有橙汁
{
countOfOrangeJuice --;
countOfFiveCents --;
countOfOneDollar ++;
resultOfDeal = "Input Information \n" +
"Type: OrangeJuice; Money: 1 Dollar; Change: 5 Cents\n\n" + currentState();
return resultOfDeal;
}
else
{
if(type.equals(typeOfGoods[0])&&countOfBeer<=0)
{
resultOfDeal = "Failure Information \n" + "Beer Shortage";
return resultOfDeal;
}
else
if(type.equals(typeOfGoods[1])&&countOfOrangeJuice<=0)
{
resultOfDeal = "Failure Information \n" + "OrangeJuice Shortage";
return resultOfDeal;
}
else
{
resultOfDeal = "Failure Information \n" + "Type Error";
return resultOfDeal;
}
}
}
else
{
resultOfDeal = "Failure Information \n" + "Change Shortage";
return resultOfDeal;
}
}
resultOfDeal = "Failure Information \n" + "Money Error";
return resultOfDeal;
}
}
测试用例代码:
package test3;
import junit.framework.TestCase;
public class TestSaleMachine extends TestCase {
public void testOperation1() //路径1:用户投币5角,选择啤酒,售货机有啤酒。
{
SaleMachine saleMachine1 = new SaleMachine();
String expectedResult = "Input Information \n" +
"Type: Beer; Money: 5 Cents; Change: 0\n\n" +
"Current State\n" +
"Beer: 5\n" +
"Orange Juice: 6\n" +
"5 Cents: 7\n" +
"1 Dollar: 6";
assertEquals(expectedResult, saleMachine1.operation("Beer", "5C"));
}
public void testOperation3()//路径2:用户投币5角,选择啤酒,售货机没有啤酒剩余。
{
SaleMachine saleMachine2 = new SaleMachine(6,6,0,6);
String expectedResult = "Failure Information \n" + "Beer Shortage";
assertEquals(expectedResult,saleMachine2.operation("Beer", "5C"));
}
public void testOperation2() //路径3:用户投币5角,选择橙汁,售货机有橙汁。
{
SaleMachine saleMachine3 = new SaleMachine();
String expectedResult = "Input Information \n" +
"Type: OrangeJuice; Money: 5 Cents; Change: 0\n\n" +
"Current State\n" +
"Beer: 6\n" +
"Orange Juice: 5\n" +
"5 Cents: 7\n" +
"1 Dollar: 6";
assertEquals(expectedResult, saleMachine3.operation("OrangeJuice", "5C"));
}
public void testOperation4()//路径4:用户投币5角,选择橙汁,售货机没有橙汁。
{
SaleMachine saleMachine4 = new SaleMachine(6,6,6,0);
String expectedResult = "Failure Information \n" + "OrangeJuice Shortage";
assertEquals(expectedResult,saleMachine4.operation("OrangeJuice", "5C"));
}
public void testOperation5()//路径5:用户投币5角,选择cola,售货机而资源均有
剩余
{
SaleMachine saleMachine5 = new SaleMachine();
String expectedResult = "Failure Information \n" + "Type Error";
assertEquals(expectedResult,saleMachine5.operation("cola", "5C"));
}
public void testOperation6()//路径6:用户投入1元,选择啤酒,售货机有5角且有
啤酒
{
SaleMachine saleMachine6 = new SaleMachine();
String expectedResult = "Input Information \n" +
"Type: Beer; Money: 1 Dollar; Change: 5 Cents\n\n" +
"Current State\n" +
"Beer: 5\n" +
"Orange Juice: 6\n" +
"5 Cents: 5\n" +
"1 Dollar: 7";
assertEquals(expectedResult, saleMachine6.operation("Beer", "1D"));
}
public void testOperation7() //路径7:用户投币1元,选择啤酒,售货机没有啤酒
有5角。
{
SaleMachine saleMachine7 = new SaleMachine(6,6,0,6);
String expectedResult = "Failure Information \n" + "Beer Shortage";
assertEquals(expectedResult, saleMachine7.operation("Beer", "1D"));
}
public void testOperation8()//路径8:用户投币1元,选择橙汁,售货机有橙汁且有
5角币。
{
SaleMachine saleMachine8 = new SaleMachine();
String expectedResult = "Input Information \n" +
"Type: OrangeJuice; Money: 1 Dollar; Change: 5 Cents\n\n" +
"Current State\n" +
"Beer: 6\n" +
"Orange Juice: 5\n" +
"5 Cents: 5\n" +
"1 Dollar: 7";
assertEquals(expectedResult,saleMachine8.operation("OrangeJuice", "1D"));
}
public void testOperation9()//路径9:用户投币1元,选择橙汁,售货机没有橙汁有
5角
{
SaleMachine saleMachine9 = new SaleMachine(6,6,6,0);
String expectedResult = "Failure Information \n" + "OrangeJuice Shortage";
assertEquals(expectedResult,saleMachine9.operation("OrangeJuice", "1D"));
}
public void testOperation10()//路径10:用户投币1元,选择cola,售货机各资源都
有剩余
{
SaleMachine saleMachine10 = new SaleMachine();
String expectedResult = "Failure Information \n" + "Type Error";
assertEquals(expectedResult,saleMachine10.operation("cola", "1D"));
}
public void testOperation11()//路径11:用户投币1元,选择橙汁,售货机有橙汁没
有5角
{
SaleMachine saleMachine11 = new SaleMachine(0,6,6,6);
String expectedResult = "Failure Information \n" + "Change Shortage";
assertEquals(expectedResult,saleMachine11.operation("OrangeJuice", "1D"));
}
public void testOperation12()//路径12:用户投币1元非5角非1元,选择橙汁,售货
机各资源都有剩余
{
SaleMachine saleMachine12 = new SaleMachine();
String expectedResult = "Failure Information \n" + "Money Error";
assertEquals(expectedResult,saleMachine12.operation("OrangeJuice", "4C"));
}
}