♣ 第一阶段目标
能把计算的功能封装起来,通过测试程序和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 5 public class Test implements ActionListener, KeyListener { 6 7 private JFrame frame; 8 private JTextField textField; 9 private JTextField textField_1; 10 private JTextField textField_2; 11 private JTextField textField_3; 12 private JTextField textField_4; 13 private JTextField textField_5; 14 private JTextField textField_6; 15 private JTextField textField_7; 16 private JButton btnNewButton; 17 private JButton btnNewButton_1; 18 private DecimalFormat df; 19 private Random r=new Random(); 20 21 private int five=0;//判断运算符 22 private static double a; 23 private static double b; 24 private JTextField textField_8; 25 26 /** 27 * Launch the application. 28 */ 29 public static void main(String[] args) { 30 EventQueue.invokeLater(new Runnable() { 31 public void run() { 32 try { 33 Test window = new Test(); 34 window.frame.setVisible(true); 35 } catch (Exception e) { 36 e.printStackTrace(); 37 } 38 } 39 }); 40 } 41 42 /** 43 * Create the application. 44 */ 45 public Test() { 46 initialize(); 47 } 48 49 /** 50 * Initialize the contents of the frame. 51 */ 52 public static boolean isNumeric(String number) { 53 for (int i = number.length(); --i >= 0;) { 54 55 if (!Character.isDigit(number.charAt(i))&&number.charAt(i)!='.') { 56 return false; 57 } 58 } 59 return true; 60 } 61 private void initialize() { 62 63 df=new DecimalFormat(".##");//保留两位 64 five=r.nextInt(3); 65 a=r.nextDouble()*100; 66 b=r.nextDouble()*100; 67 68 String as=df.format(a); 69 a=Double.parseDouble(as); 70 String ab=df.format(b); 71 b=Double.parseDouble(ab); 72 frame = new JFrame(); 73 frame.setTitle("u5C0Fu5B66u751Fu7B80u6613u56DBu5219u8FD0u7B97--uFF08u5355u5143u6D4Bu8BD5u7BC7uFF09"); 74 Dimension screenSize =Toolkit.getDefaultToolkit().getScreenSize(); 75 frame.setSize(500, 300 ); 76 frame.setLocation((screenSize.width-500 )/2, (screenSize.height-500)/2); 77 frame.getContentPane().setLayout(null); 78 79 JLabel label = new JLabel("u9898u76EE"); 80 label.setBounds(10, 10, 54, 15); 81 frame.getContentPane().add(label); 82 83 textField = new JTextField(); 84 textField.setBounds(46, 7, 66, 21); 85 frame.getContentPane().add(textField); 86 textField.setColumns(10); 87 textField.setText(String.valueOf(a)); 88 89 textField_1 = new JTextField(); 90 textField_1.setBounds(139, 7, 33, 21); 91 frame.getContentPane().add(textField_1); 92 textField_1.setColumns(10); 93 if(five==0) 94 textField_1.setText("+"); 95 else if(five==1) 96 textField_1.setText("-"); 97 else if(five==2) 98 textField_1.setText("*"); 99 else if(five==3) 100 textField_1.setText("/");//随机产生第一次进去的运算符号 101 102 textField_2 = new JTextField(); 103 textField_2.setBounds(207, 7, 66, 21); 104 frame.getContentPane().add(textField_2); 105 textField_2.setColumns(10); 106 textField_2.setText(String.valueOf(b)); 107 108 JLabel lblNewLabel = new JLabel(" ="); 109 lblNewLabel.setBounds(283, 10, 31, 15); 110 frame.getContentPane().add(lblNewLabel); 111 112 textField_3 = new JTextField(); 113 textField_3.setBounds(322, 7, 66, 21); 114 frame.getContentPane().add(textField_3); 115 textField_3.setColumns(10); 116 117 JLabel label_1 = new JLabel("u7B54u6848"); 118 label_1.setBounds(10, 52, 54, 15); 119 frame.getContentPane().add(label_1); 120 121 textField_4 = new JTextField(); 122 textField_4.setEditable(false); 123 textField_4.setBounds(46, 49, 66, 21); 124 frame.getContentPane().add(textField_4); 125 textField_4.setColumns(10); 126 127 textField_5 = new JTextField(); 128 textField_5.setEditable(false); 129 textField_5.setBounds(140, 49, 33, 21); 130 frame.getContentPane().add(textField_5); 131 textField_5.setColumns(10); 132 133 textField_6 = new JTextField(); 134 textField_6.setEditable(false); 135 textField_6.setBounds(207, 49, 66, 21); 136 frame.getContentPane().add(textField_6); 137 textField_6.setColumns(10); 138 139 JLabel lblNewLabel_1 = new JLabel(" ="); 140 lblNewLabel_1.setBounds(283, 52, 31, 15); 141 frame.getContentPane().add(lblNewLabel_1); 142 143 textField_7 = new JTextField(); 144 textField_7.setEditable(false); 145 textField_7.setBounds(322, 49, 66, 21); 146 frame.getContentPane().add(textField_7); 147 textField_7.setColumns(10); 148 149 btnNewButton = new JButton("u9000u51FA"); 150 btnNewButton.setBounds(173, 211, 93, 23); 151 frame.getContentPane().add(btnNewButton); 152 153 btnNewButton_1 = new JButton("u4E0Bu4E00u9898"); 154 btnNewButton_1.setBounds(398, 6, 76, 23); 155 frame.getContentPane().add(btnNewButton_1); 156 btnNewButton.addActionListener(this); 157 158 JLabel label_2 = new JLabel("u60C5u51B5"); 159 label_2.setBounds(10, 106, 54, 15); 160 frame.getContentPane().add(label_2); 161 162 textField_8 = new JTextField(); 163 textField_8.setEditable(false); 164 textField_8.setBounds(46, 103, 428, 21); 165 frame.getContentPane().add(textField_8); 166 textField_8.setColumns(10); 167 btnNewButton_1.addActionListener(this); 168 frame.setResizable(false); 169 } 170 171 172 173 @Override 174 public void keyPressed(KeyEvent arg0) { 175 // TODO Auto-generated method stub 176 177 if (arg0.getKeyCode() == KeyEvent.VK_ENTER) 178 { 179 textField_4.setText(textField.getText()); 180 textField_5.setText(textField_1.getText()); 181 textField_6.setText(textField_2.getText()); 182 } 183 } 184 185 @Override 186 public void keyReleased(KeyEvent e) { 187 // TODO Auto-generated method stub 188 189 } 190 @Override 191 public void keyTyped(KeyEvent e) { 192 // TODO Auto-generated method stub 193 194 195 } 196 @Override 197 public void actionPerformed(ActionEvent e) { 198 // TODO Auto-generated method stub 199 if(e.getSource()==btnNewButton_1) 200 { 201 textField_4.setText(textField.getText()); 202 textField_5.setText(textField_1.getText()); 203 textField_6.setText(textField_2.getText()); 204 205 if(textField_1.getText().equals("+")||textField_1.getText().equals("-")||textField_1.getText().equals("*")||textField_1.getText().equals("/")) 206 { 207 if(textField_3.getText().equals("")) 208 { 209 textField_8.setText("答案为空"); 210 textField_7.setText(null); 211 textField_4.setText(null); 212 textField_5.setText(null); 213 textField_6.setText(null); 214 } 215 else 216 { 217 if(textField_1.getText().equals("+")) 218 { 219 Additive add=new Additive(Double.parseDouble(textField.getText()),Double.parseDouble(textField_2.getText()));//构造对象 220 double c=add.Get_AaddB(); 221 String cs=df.format(c); 222 c=Double.parseDouble(cs); 223 System.out.print("cs="+cs+"c="+c); 224 textField_7.setText(String.valueOf(c)); 225 } 226 else if(textField_1.getText().equals("-")) 227 { 228 Subduction sub=new Subduction(Double.parseDouble(textField.getText()),Double.parseDouble(textField_2.getText())); 229 230 double c=sub.Get_AsbuB(); 231 String cs=df.format(c); 232 c=Double.parseDouble(cs); 233 234 textField_7.setText(String.valueOf(c)); 235 } 236 else if(textField_1.getText().equals("*")) 237 { 238 Multiplication mul=new Multiplication(Double.parseDouble(textField.getText()),Double.parseDouble(textField_2.getText())); 239 240 double c=mul.Get_AmulB(); 241 String cs=df.format(c); 242 c=Double.parseDouble(cs); 243 textField_7.setText(String.valueOf(c)); 244 } 245 else if(textField_1.getText().equals("/")) 246 { 247 Division div=new Division(Double.parseDouble(textField.getText()),Double.parseDouble(textField_2.getText())); 248 if(div.Get_b()!=0) 249 { 250 double c=div.Get_AmulB(); 251 String cs=df.format(c); 252 c=Double.parseDouble(cs); 253 254 textField_7.setText(String.valueOf(c)); 255 256 } 257 258 else 259 { 260 261 textField_8.setText("分母不能为"+0+" "); 262 textField_7.setText(null); 263 textField_4.setText(null); 264 textField_5.setText(null); 265 textField_6.setText(null); 266 } 267 268 } 269 //if(!textField_1.getText().equals("/")) 270 if(this.isNumeric(textField_3.getText())) 271 { 272 273 if(Double.parseDouble(textField_3.getText())==Double.parseDouble(textField_7.getText())) 274 { 275 textField_8.setText("答对了"); 276 } 277 else 278 textField_8.setText("答错了"); 279 } 280 else 281 textField_8.setText("答案无效"); 282 283 } 284 285 286 287 } 288 else 289 { 290 textField_8.setText("符号无效"); 291 textField_7.setText(null); 292 textField_4.setText(null); 293 textField_5.setText(null); 294 textField_6.setText(null); 295 } 296 297 298 299 five=r.nextInt(4);//重新设置运算 300 a=r.nextDouble()*100; 301 b=r.nextDouble()*100; 302 303 String as=df.format(a); 304 a=Double.parseDouble(as); 305 String ab=df.format(b); 306 b=Double.parseDouble(ab); 307 textField.setText(String.valueOf(a)); 308 if(five==0) 309 textField_1.setText("+"); 310 else if(five==1) 311 textField_1.setText("-"); 312 else if(five==2) 313 textField_1.setText("*"); 314 else if(five==3) 315 textField_1.setText("/");//随机产生第一次进去的运算符号 316 317 textField_2.setText(String.valueOf(b)); 318 319 320 321 textField_3.setText(null); 322 323 } 324 else if(e.getSource()==btnNewButton) 325 { 326 System.exit(0); 327 } 328 329 } 330 331 }
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 }
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 }
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 }
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 }
软件测试是为了发现错误而执行程序的过程,或者说软件测试是根据软件开发各阶段的规格说明和程序内部结构而精心设计的一批测试用例(即输入数据及预期的输出结果),并利用这些测试用例去运行程序,以发现程序错误的过程。
一般Bug有3种类型:症状(Sympton)、程序错误(Fault)、根本原因(Root cause)。
症状(Sympton)即从用户的角度看,软件出了什么问题。 例如在小学生简易四则运算中,当用户输入了某些字符后,程序错误退出,这属于用户报告,即一个Windows应用程序有时在启动时报错,程序不能运行。我们这次程序并没有出现该类Bug,如果出现了,并不代表程序有多难,而是说明我们还不够细心。
程序错误(Fault)从代码的角度看,是代码的什么错误导致了软件的问题。例如,代码在用户答题的答案框中输入非法字符的话,系统就会访问到非法的内存地址,这个时候一个子窗口的handle为空,导致程序访问了非法内存地址,此为代码错误。
根本原因(Root cause)是错误的根源,即导致代码错误的根本原因。例如,代码并没有确保用户答题的答案框是否有输入数值,如果没有的话,则发生在调用子类之前时就调用,因此子类的变量有时在访问时为空,导致上面提到的错误。
测试项目名称 | 小学生简易四则运算--(单元测试篇) | |||
测试人员 | 方俊杰、余雅诗 | 编制日期 | 2015年4月29日 | |
功能特性 | 封装;支持加减乘数算法;支持小数、负数;具备界面;具备报错处理 | |||
用例编号 | 输入数据 | 预期输出 | 实际输出 | 测试状态 |
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 | 答案无效 |
测试结果分析 | 与预期结果一致 |
运行结果:
1:; 2:; 3:;
4:; 5:; 6:;
7:; 8:; 9:;
10:; 11:; 12:;
13:; 14:; 15:;
16:; 17:; 18:。
收获与感悟:
( 在这一次结对子小项目中 )
- 我主要充当领航员的作用,我的同伴充当着驾驶员的作用,有时我们也互相交换着彼此的角色。
- 我的同伴主要是对程序进行编码,然后由我来提出见解、后期调试、撰写文档。
- 这一次的结对子中,我们一开始组员有4个,有时候我们一起讨论,然后我们分别两两结对,经过讨论后,最后决议出队友成员。
- 这一次的结对,无疑比上一次(即第一次)轻松了很多,因为彼此熟悉了,并有了结对子的经验。
- 其实,之前学习JAVA的时候,只是略懂封装的概念,很少去操作,也没有像这一次这样仔细的进行单元测试和调试测试用例,这一次的学习,让我更深入的接触了学习JAVA的细节,对JAVA更有兴趣了。
- 我和队友首先在课余时间先商量具体的工作,然后在课堂时间编程,在课后我们一起到了图书馆一起工作,互相提醒对方。
- 当完成程序的所有编写、测试、撰稿后,很有成就感。
- 依然非常期待下一次的结对项目,因为在结对子项目中,我们可以彼此学习到很多,真的很多。
结对工作过程: