单元测试(更新版)


 

♦ 第一阶段目标

    能把计算的功能封装起来,通过测试程序API接口测试其简单的加法功能。

♣ 第二阶段目标

    通过测试程序API接口测试其简单的加法、减法、乘法、除法功能。并能看到代码覆盖率。

♥ 第三阶段目标

    通过测试程序API接口测试对于各种参数的支持。并能看到代码覆盖率。

♠ 第四阶段目标

    通过增量修改改进程序,完成对各种错误情况的处理

 


 

® 开发环境: Eclipse 

® 结对伙伴:

      姓名     学号            博客地址
余雅诗(领航员) 201306114453 http://www.cnblogs.com/ys1101/
方俊杰(驾驶员) 201306114417 http://www.cnblogs.com/imfjj/

 


 

源程序:

 

  1 package operation;
  2 
  3 import java.awt.Dimension;
  4 import java.awt.EventQueue;
  5 import java.awt.Toolkit;
  6 import java.awt.event.ActionEvent;
  7 import java.awt.event.ActionListener;
  8 import java.awt.event.KeyEvent;
  9 import java.awt.event.KeyListener;
 10 import java.text.DecimalFormat;
 11 import java.util.Random;
 12 
 13 import javax.swing.JFrame;
 14 import javax.swing.JLabel;
 15 import javax.swing.JTextField;
 16 import javax.swing.JButton;
 17 import javax.swing.SwingConstants;
 18 
 19 public class Test implements ActionListener, KeyListener {
 20 
 21     private JFrame frame;
 22     private JTextField textField;
 23     private JTextField textField_1;
 24     private JTextField textField_2;
 25     private JTextField textField_3;
 26     private JTextField textField_4;
 27     private JTextField textField_5;
 28     private JTextField textField_6;
 29     private JTextField textField_7;
 30     private JButton btnNewButton;
 31     private JButton btnNewButton_1;
 32     private DecimalFormat df;
 33     private Random r = new Random();
 34 
 35     private int five = 0;// 判断运算符
 36     private static double a;
 37     private static double b;
 38     private JTextField textField_8;
 39     private JTextField textField_9;
 40     private JTextField textField_10;
 41     private JTextField textField_11;
 42     private static int num;
 43     private static int right;
 44     private static int mistake;
 45 
 46     /**
 47      * Launch the application.
 48      */
 49     public static void main(String[] args) {
 50         EventQueue.invokeLater(new Runnable() {
 51             public void run() {
 52                 try {
 53                     Test window = new Test();
 54                     window.frame.setVisible(true);
 55                 } catch (Exception e) {
 56                     e.printStackTrace();
 57                 }
 58             }
 59         });
 60     }
 61 
 62     /**
 63      * Create the application.
 64      */
 65     public Test() {
 66         initialize();
 67     }
 68 
 69     /**
 70      * Initialize the contents of the frame.
 71      */
 72     public static boolean isNumeric(String number) {
 73         for (int i = number.length(); --i >= 0;) {
 74 
 75             if (!Character.isDigit(number.charAt(i)) && number.charAt(i) != '.') {
 76                 return false;
 77             }
 78         }
 79         return true;
 80     }
 81 
 82     private void initialize() {
 83 
 84         df = new DecimalFormat(".##");// 保留两位
 85         five = r.nextInt(3);
 86         int rand = r.nextInt(3);
 87         int ran = r.nextInt(3);
 88         if (rand % 2 == 0)
 89             a = r.nextDouble() * 1000 * (-1);
 90         else
 91             a = r.nextDouble() * 1000;
 92         if (ran % 2 == 0)
 93             b = r.nextDouble() * 1000 * (-1);
 94         else
 95             b = r.nextDouble() * 1000;
 96 
 97         String as = df.format(a);
 98         a = Double.parseDouble(as);
 99         String ab = df.format(b);
100         b = Double.parseDouble(ab);
101         frame = new JFrame();
102         Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
103         frame.setSize(500, 500);
104         frame.setLocation((screenSize.width - 500) / 2,
105                 (screenSize.height - 500) / 2);
106         frame.getContentPane().setLayout(null);
107 
108         JLabel label = new JLabel("\u9898\u76EE");
109         label.setBounds(10, 10, 54, 15);
110         frame.getContentPane().add(label);
111 
112         textField = new JTextField();
113         textField.setBounds(46, 7, 66, 21);
114         frame.getContentPane().add(textField);
115         textField.setColumns(10);
116         textField.setText(String.valueOf(a));
117 
118         textField_1 = new JTextField();
119         textField_1.setBounds(139, 7, 33, 21);
120         frame.getContentPane().add(textField_1);
121         textField_1.setColumns(10);
122         if (five == 0)
123             textField_1.setText("+");
124         else if (five == 1)
125             textField_1.setText("-");
126         else if (five == 2)
127             textField_1.setText("*");
128         else if (five == 3)
129             textField_1.setText("/");// 随机产生第一次进去的运算符号
130 
131         textField_2 = new JTextField();
132         textField_2.setBounds(207, 7, 66, 21);
133         frame.getContentPane().add(textField_2);
134         textField_2.setColumns(10);
135         textField_2.setText(String.valueOf(b));
136 
137         JLabel lblNewLabel = new JLabel("    =");
138         lblNewLabel.setBounds(283, 10, 31, 15);
139         frame.getContentPane().add(lblNewLabel);
140 
141         textField_3 = new JTextField();
142         textField_3.setBounds(322, 7, 66, 21);
143         frame.getContentPane().add(textField_3);
144         textField_3.setColumns(10);
145 
146         JLabel label_1 = new JLabel("\u7B54\u6848");
147         label_1.setBounds(10, 52, 54, 15);
148         frame.getContentPane().add(label_1);
149 
150         textField_4 = new JTextField();
151         textField_4.setEditable(false);
152         textField_4.setBounds(46, 49, 66, 21);
153         frame.getContentPane().add(textField_4);
154         textField_4.setColumns(10);
155 
156         textField_5 = new JTextField();
157         textField_5.setEditable(false);
158         textField_5.setBounds(140, 49, 33, 21);
159         frame.getContentPane().add(textField_5);
160         textField_5.setColumns(10);
161 
162         textField_6 = new JTextField();
163         textField_6.setEditable(false);
164         textField_6.setBounds(207, 49, 66, 21);
165         frame.getContentPane().add(textField_6);
166         textField_6.setColumns(10);
167 
168         JLabel lblNewLabel_1 = new JLabel("    =");
169         lblNewLabel_1.setBounds(283, 52, 31, 15);
170         frame.getContentPane().add(lblNewLabel_1);
171 
172         textField_7 = new JTextField();
173         textField_7.setEditable(false);
174         textField_7.setBounds(322, 49, 66, 21);
175         frame.getContentPane().add(textField_7);
176         textField_7.setColumns(10);
177 
178         btnNewButton = new JButton("\u9000\u51FA");
179         btnNewButton.setBounds(173, 211, 93, 23);
180         frame.getContentPane().add(btnNewButton);
181 
182         btnNewButton_1 = new JButton("\u4E0B\u4E00\u9898");
183         btnNewButton_1.setBounds(398, 6, 76, 23);
184         frame.getContentPane().add(btnNewButton_1);
185         btnNewButton.addActionListener(this);
186 
187         JLabel label_2 = new JLabel("\u60C5\u51B5");
188         label_2.setBounds(10, 106, 54, 15);
189         frame.getContentPane().add(label_2);
190 
191         textField_8 = new JTextField();
192         textField_8.setEditable(false);
193         textField_8.setBounds(46, 103, 66, 21);
194         frame.getContentPane().add(textField_8);
195         textField_8.setColumns(10);
196 
197         textField_9 = new JTextField();
198         textField_9.setBounds(46, 134, 66, 21);
199         frame.getContentPane().add(textField_9);
200         textField_9.setColumns(10);
201 
202         JLabel lblNewLabel_2 = new JLabel("\u9898\u91CF");
203         lblNewLabel_2.setBounds(10, 140, 26, 15);
204         frame.getContentPane().add(lblNewLabel_2);
205 
206         JLabel label_3 = new JLabel("\u6B63\u786E\u91CF");
207         label_3.setBounds(139, 137, 39, 15);
208         frame.getContentPane().add(label_3);
209 
210         textField_10 = new JTextField("0");
211         textField_10.setEditable(false);
212         textField_10.setBounds(207, 137, 66, 21);
213         frame.getContentPane().add(textField_10);
214         textField_10.setColumns(10);
215 
216         JLabel lblNewLabel_3 = new JLabel("\u9519\u8BEF\u91CF");
217         lblNewLabel_3.setBounds(322, 137, 39, 15);
218         frame.getContentPane().add(lblNewLabel_3);
219 
220         textField_11 = new JTextField("0");
221         textField_11.setEditable(false);
222         textField_11.setBounds(398, 134, 66, 21);
223         frame.getContentPane().add(textField_11);
224         textField_11.setColumns(10);
225         btnNewButton_1.addActionListener(this);
226     }
227 
228     @Override
229     public void keyPressed(KeyEvent arg0) {
230         // TODO Auto-generated method stub
231 
232         if (arg0.getKeyCode() == KeyEvent.VK_ENTER) {
233             textField_4.setText(textField.getText());
234             textField_5.setText(textField_1.getText());
235             textField_6.setText(textField_2.getText());
236         }
237     }
238 
239     @Override
240     public void keyReleased(KeyEvent e) {
241         // TODO Auto-generated method stub
242 
243     }
244 
245     @Override
246     public void keyTyped(KeyEvent e) {
247         // TODO Auto-generated method stub
248 
249     }
250 
251     @Override
252     public void actionPerformed(ActionEvent e) {
253         // TODO Auto-generated method stub
254         if (textField_9.getText().equals("")) {
255             
256             if (e.getSource() == btnNewButton)
257             {
258                 System.exit(0);
259             }
260             textField_8.setText("题量为空!");
261 
262         }
263 
264         else if (num < Integer.parseInt(textField_9.getText())) 
265         {
266             if (e.getSource() == btnNewButton)
267             {
268                 System.exit(0);
269             }
270 
271             else  if (e.getSource() == btnNewButton_1) 
272             {
273                 textField_4.setText(textField.getText());
274                 textField_5.setText(textField_1.getText());
275                 textField_6.setText(textField_2.getText());
276 
277                 if (textField_1.getText().equals("+")
278                         || textField_1.getText().equals("-")
279                         || textField_1.getText().equals("*")
280                         || textField_1.getText().equals("/"))
281                 {
282                     if (textField_3.getText().equals(""))
283                     {
284                         textField_8.setText("答案为空");
285                         textField_7.setText(null);
286                         textField_4.setText(null);
287                         textField_5.setText(null);
288                         textField_6.setText(null);
289                     } 
290                     else
291                     {
292                         if (textField_1.getText().equals("+")) 
293                         {
294                             Additive add = new Additive(
295                                     Double.parseDouble(textField.getText()),
296                                     Double.parseDouble(textField_2.getText()));// 构造对象
297                             double c = add.Get_AaddB();
298                             String cs = df.format(c);
299                             c = Double.parseDouble(cs);
300                             System.out.print("cs=" + cs + "c=" + c);
301                             textField_7.setText(String.valueOf(c));
302                             System.out.println("\n加法代码覆盖为100%\n");
303                         } 
304                         else if (textField_1.getText().equals("-"))
305                         {
306                             Subduction sub = new Subduction(
307                                     Double.parseDouble(textField.getText()),
308                                     Double.parseDouble(textField_2.getText()));
309 
310                             double c = sub.Get_AsbuB();
311                             String cs = df.format(c);
312                             c = Double.parseDouble(cs);
313 
314                             textField_7.setText(String.valueOf(c));
315                             System.out.println("\n减法代码覆盖为100%\n");
316                         } 
317                         else if (textField_1.getText().equals("*"))
318                         {
319                             Multiplication mul = new Multiplication(
320                                     Double.parseDouble(textField.getText()),
321                                     Double.parseDouble(textField_2.getText()));
322 
323                             double c = mul.Get_AmulB();
324                             String cs = df.format(c);
325                             c = Double.parseDouble(cs);
326                             textField_7.setText(String.valueOf(c));
327                             System.out.println("\n乘法代码覆盖为100%\n");
328                         } 
329                         else if (textField_1.getText().equals("/")) 
330                         {
331                             Division div = new Division(
332                                     Double.parseDouble(textField.getText()),
333                                     Double.parseDouble(textField_2.getText()));
334 
335                             if (div.Get_b() != 0) 
336                             {
337                                 double c = div.Get_AmulB();
338                                 String cs = df.format(c);
339                                 c = Double.parseDouble(cs);
340                                 textField_7.setText(String.valueOf(c));
341                                 System.out.println("\n除法代码覆盖为100%\n");
342 
343                             }
344 
345                             else 
346                             {
347                                 textField_8.setText("分母不能为" + 0 + "\n");
348                                 textField_7.setText(null);
349                                 textField_4.setText(null);
350                                 textField_5.setText(null);
351                                 textField_6.setText(null);
352                             }
353 
354                         }
355                         if (this.isNumeric(textField_3.getText())) 
356                         {
357                             if (Double.parseDouble(textField_3.getText()) == Double
358                                     .parseDouble(textField_7.getText())) 
359                             {
360                                 textField_8.setText("答对了");
361                                 right++;
362                                 textField_10.setText(String.valueOf(right));
363                             } 
364                             else 
365                             {
366                                 textField_8.setText("答错了");
367                                 mistake++;
368                                 textField_11.setText(String.valueOf(mistake));
369 
370                             }
371                         } 
372                         else
373                             textField_8.setText("答案无效");
374 
375                     }
376 
377                 } 
378                 else 
379                 {
380                     textField_8.setText("符号无效");
381                     textField_7.setText(null);
382                     textField_4.setText(null);
383                     textField_5.setText(null);
384                     textField_6.setText(null);
385                 }
386 
387                 five = r.nextInt(4);// 重新设置运算
388                 int rand = r.nextInt(3);
389                 int ran = r.nextInt(3);
390                 if (rand % 2 == 0)
391                     a = r.nextDouble() * 1000 * (-1);
392                 else
393                     a = r.nextDouble() * 1000;
394                 if (ran % 2 == 0)
395                     b = r.nextDouble() * 1000 * (-1);
396                 else
397                     b = r.nextDouble() * 1000;
398 
399                 String as = df.format(a);
400                 a = Double.parseDouble(as);
401                 String ab = df.format(b);
402                 b = Double.parseDouble(ab);
403                 textField.setText(String.valueOf(a));
404                 if (five == 0)
405                     textField_1.setText("+");
406                 else if (five == 1)
407                     textField_1.setText("-");
408                 else if (five == 2)
409                     textField_1.setText("*");
410                 else if (five == 3)
411                     textField_1.setText("/");// 随机产生第一次进去的运算符号
412 
413                 textField_2.setText(String.valueOf(b));
414 
415                 textField_3.setText(null);
416                 num++;
417                 if (num == Integer.parseInt(textField_9.getText())) 
418                 {
419                     textField_8.setText("已完成答题");
420                 }
421 
422             }
423 
424         }
425 
426         
427 
428     }
429     
430 }
Test
 1 package operation;
 2 
 3 import java.text.DecimalFormat;
 4 import java.util.Random;
 5 import java.util.Scanner;
 6 
 7 public class Additive {
 8     
 9     private static double a;
10     private static double b;
11     Scanner in=new Scanner(System.in);
12     public Additive(double c,double d)
13     {
14         this.a=c;
15         this.b=d;
16     }
17     public double Get_AaddB()
18     {    
19     return a+b;
20 
21     }
22     public double Get_a()
23     {
24         return a;
25     }
26     public double Get_b()
27     {
28         return b;
29     }
30     
31     
32 
33     
34     
35 
36 }
Additive(加法)
 1 package operation;
 2 
 3 import static org.junit.Assert.*;
 4 
 5 import org.junit.Test;
 6 
 7 public class AdditiveTest {
 8     @Test
 9     public void testGet_AaddB() {
10         Additive add=new Additive(3,4);
11         double a=add.Get_AaddB();
12         assertEquals(7, (int)a); 
13     }
14 }
AdditiveTest(加法测试)
 1 package operation;
 2 
 3 import java.util.Scanner;
 4 
 5  class Subduction {
 6     private static double a;
 7     private static double b;
 8     Scanner in=new Scanner(System.in);
 9     public Subduction(double a,double b)
10     {
11         this.a=a;
12         this.b=b;
13     }
14     public double Get_AsbuB()
15     {
16     return a-b;
17     }
18     public double Get_a()
19     {
20         return a;
21     }
22     public double Get_b()
23     {
24         return b;
25     }
26 
27 }
Subduction(减法)
 1 package operation;
 2 
 3 import static org.junit.Assert.*;
 4 
 5 import org.junit.Test;
 6 
 7 public class SubductionTest {
 8 
 9     @Test
10     public void testGet_AsbuB() {
11         Subduction sub=new Subduction(10,5);
12         double a=sub.Get_AsbuB();
13         assertEquals(5, (int)a); 
14     }
15 
16 }
SubductionTest(减法测试)
 1 package operation;
 2 
 3 import java.util.Scanner;
 4 
 5 public class Multiplication {
 6     private static double a;
 7     private static double b;
 8     Scanner in=new Scanner(System.in);
 9     public Multiplication(double a,double b)
10     {
11         this.a=a;
12         this.b=b;
13     }
14     public double Get_AmulB()
15     {
16         
17     
18     
19     return a*b;
20     }
21     public double Get_a()
22     {
23         return a;
24     }
25     public double Get_b()
26     {
27         return b;
28     }
29     
30 
31 }
Multiplication(乘法)
 1 package operation;
 2 
 3 import static org.junit.Assert.*;
 4 
 5 import org.junit.Test;
 6 
 7 public class MultiplicationTest {
 8 
 9     @Test
10     public void testGet_AmulB() {
11         Multiplication mul=new Multiplication(5,5);
12         double a=mul.Get_AmulB();
13         assertEquals(25, (int)a); 
14     }
15 
16 }
MultiplicationTest(乘法测试)
 1 package operation;
 2 
 3 import java.util.Scanner;
 4 
 5 public class Division {
 6     private static double a;
 7     private static double b;
 8     Scanner in=new Scanner(System.in);
 9     public Division(double a,double b)
10     {
11         this.a=a;
12         this.b=b;
13     }
14     public double Get_AmulB()
15     {
16         return a/b;
17     }
18     public double Get_b()
19     {
20         return b;
21     }
22     public double Get_a()
23     {
24         return a;
25     }
26 
27 }
Division(除法)
 1 package operation;
 2 
 3 import static org.junit.Assert.*;
 4 
 5 import org.junit.Test;
 6 
 7 public class DivisionTest {
 8 
 9     @Test
10     public void testGet_AmulB() {
11          Division div=new  Division(30,5);
12          double a=div.Get_AmulB();
13          assertEquals(6, (int)a); 
14     
15     }
16 }
DivisionTest(除法测试)

 


 

    这次的更新主要是:

  • 在第一次版本的基础上加了单元测试的调试,测试结果符合预想,错误数跟失误数都为0。

加法测试:

 

减法测试:

 

乘法测试:

 

除法测试:

  • 添加了题目随机数的范围((-1000)— 1000 )。

  • 添加了代码覆盖率(主要通过分别在四道算法的代码最后添加了一句:System.out.println("\n加法代码覆盖为100%\n");System.out.println("\n减法代码覆盖为100%\n");System.out.println("\n乘法代码覆盖为100%\n");System.out.println("\n除法代码覆盖为100%\n");)

  • 添加了题量的判断,对于异常处理的情况均在界面中的“情况”文本框中显示了。

 

 


 

测试用例(黑盒测试)
测试项目名称  小学生简易四则运算--(单元测试篇)
测试人员 方俊杰、余雅诗 编制日期 2015年5月8日
功能特性  封装;支持加减乘数算法;支持小数、负数;具备界面;具备报错处理
用例编号 输入数据 预期输出 实际输出 测试状态
1  (22.25 , p , 45.57)  67.82  NULL  符号无效
2  (1.25 , + , 2.57)  3.82  3.82   答对了
3  (87.84 , + , 17.99)  50.33  105.83  答错了
4  (5.7 , + , 53.98)  NULL  NULL  答案为空
5  (39.59 , + , 97.87)  op  137.46  答案无效
6  (3 , - , 3)  0.0  0.0  答对了
7 (7.25 , - , 78.22)  23.87  -70.97  答错了
8  (31.74 , - , 81.93)  NULL  -50.19  答案为空
9  (67.18 , - , 50.95)  p  16.23  答案无效
10  (88.21 , * , 67.32)  5938.3  5938.30  答对了
11  (56.46 , * , 69.8)  1024.5  3940.91  答错了
12  (41.38 , * , 93.33)  NULL  3862.0  答案为空
13  (3.18 , * , 93.47)  jj  297.23  答案无效
14  (67.04 , / , 0)  0  NULL  分母不能为0
15  (18.43 , / , 1)  18.43  18.43  答对了
16  (56.82 , / , 1)  56.81  56.82  答错了
17  (42.35 , / , 72.3)  NULL  0.59  答案为空
18  (60.44 , / , 47.37)  ys  1.28  答案无效
测试结果分析     与预期结果一致

 


 

 

 结对工作过程:

收获与感悟:

 (  在这一次结对子小项目中  )

  • 我主要充当领航员的作用,我的同伴充当着驾驶员的作用,有时我们也互相交换着彼此的角色。
  • 我的同伴主要是对程序进行编码,然后由我来提出见解、后期调试、撰写文档。
  • 这次主要是对上一次结对项目的补充,让我们发现了我们之前所理解的“单元测试”与实际的“单元测试”是两个概念,经过调整后,最后还是学会了。
  • 这次作业比较轻松,因为是改进自己团队已经做了一部分的项目,针对自己团队的思路,比较容易修改。
  • 我和队友首先在课余时间先商量具体的工作,然后在课堂时间编程,在课后我们一起到了图书馆一起工作,互相提醒对方。
  • 当完成程序的所有编写、测试、撰稿后,很有成就感。
  • 希望自己在下次的结对子项目中能够有实力充当“驾驶员”的角色。
  • 依然非常期待下一次的结对项目,因为在结对子项目中,我们都可以互补优缺。

 


 

posted @ 2015-05-08 16:17  Y-Kaci  阅读(755)  评论(8编辑  收藏  举报