5.1 实验五 四则运算单元测试
实验五
一、结对伙伴:
陈江焕 博客:http://www.cnblogs.com/c-19/
二、分工
首先我们两个合作将含有界面的源程序中核心代码抽取出来封装成一个类,并建立单元测试进行测试;
然后由陈江焕负责白盒测试中条件覆盖组合,我负责测试用例表;
最后我们两个合作共同完成黑盒测试。
三、白盒单元测试:
1、实验环境:Eclipse集成开发环境+JUnit4测试框架+java
2、测试用例表:
测试项目名称 |
四则运算单元测试 |
|||
测试人员 |
林惠映、陈江焕 |
编制日期 |
2015年4月29 |
|
功能特性 |
JUnit4是著名的单元测试框架,在JUnit4中所有的测试用例采用@Annotation标注,使用@Test标签标注测试方法,建立一个简单的测试Unit中各个运算的用例,点击run运行单元测试后就会出现JUnit的运行器,并给出运行次数、错误以及故障次数的提示,并且@Test该标注不能删,否则其测试情况将不会出现,当用代码写出了相应的测试后,fail(“尚未实现”)标志要屏蔽,否则测试情况会给出错误提示 |
|||
用例编号 |
输入数据(a,b,num) |
预期输出(a,b,Res) |
实际输出(a,b,Res) |
测试状态 |
1 |
(2,3,0) |
(2,3,5) |
(2,3,5) |
测试正确 |
2 |
(4,2,1) |
(4,2,2) |
(4,2,2) |
测试正确 |
3 |
(1,2,,2) |
(1,2,2) |
(1,2,2) |
测试正确 |
4 |
(8,2,3) |
(8,2,4) |
(8,2,4) |
测试正确 |
3、条件分支覆盖情况:
4、源程序中含界面的核心计算代码:
if (bj == B2) { int a, b, num, i = 1; if (i < count) { T3.setText(null);//当按钮按下一题时就将T3与T4的内容更新 T4.setText(null); num = (int) (Math.random() * 5); a = (int) (Math.random() * 200) - 100; b = (int) (Math.random() * 200) - 100; i++; if (num == 0) { if (a < 0 && b < 0) { T2.setText("(" + a + ")" + "+(" + b + ")="); } else if (a < 0 && b > 0) { T2.setText("(" + a + ")" + "+" + b + "="); } else if (a > 0 && b < 0) { T2.setText(a + "+(" + b + ")="); } else { T2.setText(a + "+" + b + "="); } c = a + b; } else if (num == 1) { if (a < 0 && b < 0) { T2.setText("(" + a + ")" + "-(" + b + ")="); } else if (a < 0 && b > 0) { T2.setText("(" + a + ")" + "-" + b + "="); } else if (a > 0 && b < 0) { T2.setText(a + "-(" + b + ")="); } else { T2.setText(a + "-" + b + "="); } c = a - b; } else if (num == 2) { if (a < 0 && b < 0) { T2.setText("(" + a + ")" + "*(" + b + ")="); } else if (a < 0 && b > 0) { T2.setText("(" + a + ")" + "*" + b + "="); } else if (a > 0 && b < 0) { T2.setText(a + "*(" + b + ")="); } else { T2.setText(a + "*" + b + "="); } c = a * b; } else if (num == 3&&b!=0) { if (a < 0 && b < 0) { T2.setText("(" + a + ")" + "/(" + b + ")="); } else if (a < 0 && b > 0) { T2.setText("(" + a + ")" + "/" + b + "="); } else if (a > 0 && b < 0) { T2.setText(a + "/(" + b + ")="); } else { T2.setText(a + "/" + b + "="); } d= (float)a/(float)b; BigDecimal bg = new BigDecimal(d); d1 =(float)bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); }
5、将核心代码封装成一个类用于单元测试:
import java.util.*; public class Unit { int num,a,b,c; public Unit() { num = (int) (Math.random() * 5); a = (int) (Math.random() * 200) - 100;//-100~100 b = (int) (Math.random() * 200) - 100;//-100~100 if (num == 0)//num为0时,是加法运算 { add(a,b); } else if (num == 1) //num为1表示减法运算 { jian(a,b); } else if (num == 2) { //num为2表示乘法运算 chen(a,b); } else if (num == 3&&b!=0) { //num为3表示除法运算,并且要考虑除数不能为0的情况,因此b!=0 chu(a,b); } } public static int add(int a,int b) { return a+b; } public static int jian(int a,int b) { return a-b; } public static int chen(int a,int b) { return a*b; } public static int chu(int a,int b) { return a/b; } }
6、 单元测试用例代码:
1 import static org.junit.Assert.*; 2 import org.junit.Before; 3 import org.junit.Test; 4 public class UnitTest { 5 Unit unit; 6 public void setUp() throws Exception { 7 unit=new Unit(); 8 } 9 @Test 10 public void testAdd() { 11 int res=unit.add(2, 3); 12 assertEquals(5,res); 13 //fail("尚未实现"); 14 } 15 @Test 16 public void testJian() { 17 int res=unit.jian(4, 2); 18 assertEquals(2,res); 19 //fail("尚未实现"); 20 } 21 @Test 22 public void testChen() { 23 int res=unit.chen(1, 2); 24 assertEquals(2,res); 25 //fail("尚未实现"); 26 } 27 @SuppressWarnings("deprecation") 28 @Test 29 public void testChu() { 30 int res=unit.chu(8,2); 31 assertEquals(4,res); 32 //fail("尚未实现"); 33 } 34 //处理除0异常,即当除数为0的情况 35 @Test(expected = ArithmeticException.class) 36 public void chuzero(){ 37 unit.chu(1,0); 38 39 } 40 41 }
测试结果:
7、测试结果分析:
在单元测试中写入我们所要测试的测试代码,并给出测试用例,在所给测试用例的情况下,如果预期结果与实际结果相一致(即测试情况均为绿色打钩通过),则代表测试结果通过,否则则表示程序有错;测试结果用函数assetEquals();
四、黑盒测试
1、当输入答案为字符时,会出现异常
解决办法:
源代码
B1.addActionListener(new ActionListener() { //按钮B1表示确定 public void actionPerformed(ActionEvent e) { Object bj = e.getSource(); // 获得事件源 if (bj == B1) { if (d1== Float.parseFloat(T3.getText()) || c == Float.parseFloat(T3.getText()) || s ==Float.parseFloat(T3.getText())) { T4.setText("恭喜你,答对了"); t=t+1; sum=sum+20;//每答对一题加20分 } else { T4.setText("抱歉,你答错了"); f=f+1; } } } });
在源代码的第四行即if()后面一个布尔变量
boolean flag = false;与try,在12行后面加catch语句以及判断语句
catch(Exception g)
{
flag=true;
}
if(flag)
{
JOptionPane.showMessageDialog(null,"输入结果不能为字符,请输入数字!");
}
运行结果:
2、输入的题目个数为负数时,系统没给出提示
源代码8:
Object bj = e.getSource(); // 获得事件源 if (bj == B3) { try{ //如果输入字符,抛出异常,提示错误 count = Integer.parseInt(T1.getText()); //将文本中获取的字符串转换为整型 } catch(Exception f) { flag=true; } if(flag) { JOptionPane.showMessageDialog(null,"输入有误,请输入数字!"); } if(count>5) { JOptionPane.showMessageDialog(null, "题目个数不能超过五个!请重新输入。"); }
解决办法:
在上面的源代码8的第13行加一个if()判断语句,
if(count<0)
{
JOptionPane.showMessageDialog(null,"不能输入负数,请输入整型!");
}
运行结果:
五、出现的程序问题及解决:
写完测试代码后没有删掉fail(”尚未实现”)语句,所以使得测试出来的结果均为错误;因此词句一定要删;
写完核心代码与测试代码后进行测试,测试结果有问题,经检查,所定义的函数得要是静态类型,并要由一个返回类型
标注@Test不能删掉
AssertEquals()支持boolean,long,int等类型变量
六、心得总结
分工很重要,分工分好了,可以大大提高效率并可以学到许多东西,并且在合作当中要多与合作伙伴交流,讨论,这样才能共同进步,才能学到知识。