软件测试技术-随堂练习01答案
)
随堂练习01
1.FindBugs
A.查看 FindBugs发现的问题,一共有几类问题,各是什么含义将这几类问题翻译成中文;
答:
一共有以下三种类型的问题:
1.Bug: Invocation of toString on combination in code invokes toString on an array, which will generate a fairly useless result such as [C@16f047
2. Consider using to convert the array into a readable String that gives the contents of the array.
中文:在组合代码调用toString数组,这将产生一个相当无用的结果。考虑使用方法将数组转化成可读的字符串。
2.Bug: concatenates strings using + in a loop
(
The method seems to be building a String using concatenation in a loop. In each iteration, the String is converted to a
StringBuffer/StringBuilder, appended to, and converted back to a String. This can lead to a cost quadratic in the number of iterations, as the growing string is recopied in each iteration.
Better performance can be obtained by using a StringBuffer (or StringBuilder in Java explicitly.
中文:这个方法似乎是建立在一个循环中使用连接字符串。在每个迭代中,字符串转换为StringBuffer / StringBuilder,附加到,转换回一个字符串。这可能导致成本数量的二次迭代,在每个迭代字符串复制。
可以获得更好的性能通过使用StringBuffer显式(或StringBuilder Java 中)。
3.Bug: Unread field: field is never read. Consider removing it from the class.
中文:这个属性没有被读。
这个字段是不会被程序读的。考虑把它从类中移除。
~
B.如何解决FindBugs指出的问题请修改Sudoku程序,以改正所有FindBugs指出的问题。注意:同类错误仅需记录一次修改思想即可。
答:
1.使用将数组转换为字符串。
2.将String类型的该变量定义为StringBuffer类型的,并在循环体中用append()
方法替代+操作。
3.通过”查找”找出对应的属性的所有代码,并注释\删除。(或者调用print方法输
出该属性)
2.,
3.Junit
源程序:
package sale;
public class SaleMachine {
private int countOfBeer, countOfJuice, countOfFiveCents, countOfOneDollar;
private String[] typeOfGoods = {"Beer", "Juice"};
private String resultOfDeal;
》
public SaleMachine()
{
initial();
}
public void initial()
{//默认售货机
…
countOfBeer = 3;
countOfJuice = 3;
countOfFiveCents = 3;
countOfOneDollar = 3;
}
public SaleMachine(int fiveCents, int oneDollar, int numOfBeer, int numOfOrange)
//带参数的初始化售货机
!
{
countOfFiveCents = fiveCents;
countOfOneDollar = oneDollar;
countOfBeer = numOfBeer;
countOfJuice = numOfOrange;
}
public String currentState()
·
{//返回当前售货机状态
String state = "库存 \n" +
"啤酒: " + countOfBeer + "\n" +
"橙汁: " + countOfJuice + "\n" +
"五角硬币: " + countOfFiveCents + "\n" +
"一元硬币: " + countOfOneDollar;
return state;
}
\
public String buy(String type, int money)
//用户购买的方法。type是用户选择的产品,money是用户投币种类
{
if(money==50) //如果用户投入5角钱
{
if(typeOfGoods[0])) //如果用户选择啤酒
{
if(countOfBeer>0) //如果还有啤酒
,
{
countOfBeer--;
countOfFiveCents++;
resultOfDeal = "请取出饮料";
return resultOfDeal;
}
else
{
—
resultOfDeal = "目前该饮料已经售完";
return resultOfDeal;
}
}
else if (typeOfGoods[1])) //用户选择橙汁
{
if(countOfJuice > 0)
{
,
countOfJuice--;
countOfFiveCents++;
resultOfDeal = "请取出饮料";
return resultOfDeal;
}
else
{
resultOfDeal = "目前该饮料已经售完";
:
return resultOfDeal;
}
}
else
{
resultOfDeal = "目前不提供该饮料";
return resultOfDeal;
}
…
}
else if(money==100) //如果用户投入一元钱
{
if(countOfFiveCents > 0) //如果售货机有零钱
if(typeOfGoods[0])&&countOfBeer>0)//如果用户选择啤酒而且还有啤酒
{
|
countOfBeer--;
countOfFiveCents--;
countOfOneDollar++;
resultOfDeal = "请取饮料,并取回找钱";
return resultOfDeal;
}
else if (typeOfGoods[1])&&countOfJuice>0)//如果用户选择橙汁而且还有橙汁
{
-
countOfJuice --;
countOfFiveCents --;
countOfOneDollar ++;
resultOfDeal = "请取饮料,并取回找钱";
return resultOfDeal;
}
else
{
、
if(typeOfGoods[0])&&countOfBeer<=0)
{
resultOfDeal = "目前该饮料已经售完";
return resultOfDeal;
}
else if(typeOfGoods[1])&&countOfJuice<=0)
{
resultOfDeal = "目前该饮料已经售完";
#
return resultOfDeal;
}
else
{
resultOfDeal = "目前不提供该饮料";
return resultOfDeal;
}
}
<
}
else
resultOfDeal = "对不起,目前不能找钱,请投 5 角硬币";
return resultOfDeal;
}
}
`
resultOfDeal = "请投 5 角或者1 元的硬币";
return resultOfDeal;
}
}
测试程序
【
以下测试场景均基于上述程序:
*
《
测试场景:初始化五角/一元硬币/啤酒/橙汁都为4个,投币50,购买5次橙汁预期结果:显示“请取出饮料”*4 + "目前该饮料已经售完"
函数代码:public void test_50Orange4(){//售货机没有啤酒剩余,用户投币5角,选择啤酒
SaleMachine sm = new SaleMachine(4,4,4,4);
assertEquals("orange", 50), "请取出饮料");
assertEquals("orange", 50), "请取出饮料");
assertEquals("orange", 50), "请取出饮料");
assertEquals("orange", 50), "请取出饮料");
assertEquals("orange", 50), "目前该饮料已经售完");
}
测试结果:通过截图: