zoukankan      html  css  js  c++  java
  • 单元测试(第一阶段+部分第二阶段+部分第三阶段+部分第四阶段)


    ♣ 第一阶段目标

        能把计算的功能封装起来,通过测试程序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 }
    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 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 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 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(除法)

        软件测试是为了发现错误而执行程序的过程,或者说软件测试是根据软件开发各阶段的规格说明和程序内部结构而精心设计的一批测试用例(即输入数据及预期的输出结果),并利用这些测试用例去运行程序,以发现程序错误的过程。

        一般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更有兴趣了。
    • 我和队友首先在课余时间先商量具体的工作,然后在课堂时间编程,在课后我们一起到了图书馆一起工作,互相提醒对方。
    • 当完成程序的所有编写、测试、撰稿后,很有成就感。
    • 依然非常期待下一次的结对项目,因为在结对子项目中,我们可以彼此学习到很多,真的很多。

    结对工作过程:


     

  • 相关阅读:
    fread 和 read的区别
    Windows下的linux开发环境Cygwin的安装配置
    开机出现grub提示符后怎样进入系统?
    Matlab中函数句柄的优点
    UNIX环境高级编程的apue.h源码APUE
    装了一个ubuntu10.10,打印机不能添加了,
    迅雷上如何下载热映的电影大片~~
    我的linux 初始配置安装的东东,最好保存上一份,对于经常装linux的朋友
    HDU 1875 畅通工程再续
    HDU 1874 畅通工程续
  • 原文地址:https://www.cnblogs.com/ys1101/p/4466654.html
Copyright © 2011-2022 走看看