【软件测试】考虑闰年问题中的非法输入

  • 问题提出

    • 在上一篇中提到了闰年问题的实现以及测试,但是在上篇中并没有提及输入框中如果输入非法输入会发生什么问题
    • 观察如下,当我们在输入框中输入"ab"时:

    会出现下面java.lang.NumberFormatException:

java.lang.NumberFormatException: For input string: "ab"
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at task$Listener.handle(task.java:48)
    at task$Listener.handle(task.java:1)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(Unknown Source)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
    at com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source)
    at com.sun.javafx.event.EventUtil.fireEvent(Unknown Source)
    at javafx.event.Event.fireEvent(Unknown Source)
    at javafx.scene.Node.fireEvent(Unknown Source)
    at javafx.scene.control.Button.fire(Unknown Source)
    at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(Unknown Source)
    at com.sun.javafx.scene.control.skin.SkinBase$4.handle(Unknown Source)
    at com.sun.javafx.scene.control.skin.SkinBase$4.handle(Unknown Source)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(Unknown Source)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
    at com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source)
    at com.sun.javafx.event.EventUtil.fireEvent(Unknown Source)
    at javafx.event.Event.fireEvent(Unknown Source)
    at javafx.scene.Scene$MouseHandler.process(Unknown Source)
    at javafx.scene.Scene$MouseHandler.process(Unknown Source)
    at javafx.scene.Scene$MouseHandler.access$1900(Unknown Source)
    at javafx.scene.Scene.impl_processMouseEvent(Unknown Source)
    at javafx.scene.Scene$ScenePeerListener.mouseEvent(Unknown Source)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(Unknown Source)
    at com.sun.glass.ui.View.handleMouseEvent(Unknown Source)
    at com.sun.glass.ui.View.notifyMouse(Unknown Source)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.access$100(Unknown Source)
    at com.sun.glass.ui.win.WinApplication$3$1.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
  • 问题探索

    • 观察上一篇闰年问题的代码实现部分:

      • 闰年判定函数的实现

        private boolean isLeap( int year ) {
          if( year % 4 != 0 ) {
               return false;
            }
            else if( year % 100 != 0 ) {
               return true;
            }
            else if( year % 400 != 0 ) {
               return false;
            }
            else {
               return true;
            }
        }
      • 闰年函数的调用

        if( isLeap( Integer.parseInt( str ) ) ) {
            inf = "输入年份为闰年";
        }
        else {
            inf = "输入年份非闰年";
        }

        可以发现会出现这个问题是因为Integer.parseInt()这个函数

  • 问题分析
    • 当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常,说明作为参数的字符串有问题
    • Integer.parseInt()函数
      • public static int parseInt(String s) throws NumberFormatException
      • 将字符串参数作为带符号十进制整数来分析。除过第一个字符为 ASCII 字符中减号 ‘-‘ 表示的负数,字符串中的字符都必须是十进制数。
      • 参数: s字符串
      • 返回值: 十进制表示的整数
      • 抛出: NumberFormatException (若该字符串不包含一个可分析的整数)
  • 改进
    • 加入异常处理
    1. import javax.swing.JOptionPane;
      
      import javafx.application.Application;
      import javafx.event.ActionEvent;
      import javafx.event.EventHandler;
      import javafx.geometry.Pos;
      import javafx.scene.Scene;
      import javafx.scene.control.Button;
      import javafx.scene.control.Label;
      import javafx.scene.control.TextField;
      import javafx.scene.layout.HBox;
      import javafx.stage.Stage;
      
      public class task extends Application {
      
          public static void main(String[] args) {
              // TODO Auto-generated method stub
              task.launch( args );
          }
      
          private TextField textfield = new TextField();
      
          @Override
          public void start(Stage arg0) throws Exception {
              // TODO Auto-generated method stub
              arg0.setTitle( "Testing" );
      
              HBox hbox = new HBox( 8 );
              textfield.setPrefColumnCount( 25 );
              hbox.setAlignment( Pos.CENTER_LEFT );
              Button btn = new Button();
              btn.setText( "提交" );
              btn.setOnAction( new Listener() );
              hbox.getChildren().addAll( new Label( "  请输入年份: "), textfield, btn );
      
              arg0.setScene( new Scene( hbox, 460, 50 ));
              arg0.show();
          }
      
          public class Listener implements EventHandler<ActionEvent> {
      
              @Override
              public void handle(ActionEvent arg0) {
                  // TODO Auto-generated method stub
                  String str = textfield.getText();
                  String inf = "";
      
                  try{
                      if( isLeap( Integer.parseInt( str ) ) ) {
                          inf = "输入年份为闰年";
                      }
                      else {
                          inf = "输入年份非闰年";
                      }
                  }
                  catch (Exception e){
                      inf = "输入不合法";
                  }
      
                  JOptionPane.showMessageDialog( null, inf, "information",
                          JOptionPane.INFORMATION_MESSAGE );
              }
          }
      
          private boolean isLeap( int year ) {
              if( year % 4 != 0 ) {
                  return false;
              }
              else if( year % 100 != 0 ) {
                  return true;
              }
              else if( year % 400 != 0 ) {
                  return false;
              }
              else {
                  return true;
              }
          }
      }
  • 测试用例
编号 输入 预测输出
1 1963 输入年份非闰年
2 1964 输入年份为闰年
3 1900 输入年份非闰年
4 2000 输入年份为闰年
5 "" 输入不合法
6 "ab;d" 输入不合法
  • 测试结果

                      

  • JAVA中int,String的类型转换

    • int -> String

      • i = Integer.parseInt(s);

        • public static int parseInt(String s) throws NumberFormatException
        • 参数: 字符串s
        • 返回值: 十进制整数
        • 抛出: NumberFormatException
        • 直接使用静态方法,不会产生多余的对象,但会抛出异常
      • i = Integer.valueOf(s).intValue();
        • public static Integer valueOf(String s) throws NumberFormatException
        • 参数: 字符串s
        • 返回值: Integer对象
        • 抛出:NumberFormatException
        • 会抛出异常同时会多产生一个对象
    • String -> int
      • s = i + "";

        • 会产生两个String对象
      • s = String.valueof(i);
        • 直接使用String类的静态方法,之产生一个对象
时间: 2024-11-04 13:46:58

【软件测试】考虑闰年问题中的非法输入的相关文章

JAVA闰年测试与解决非法输入

问题实现 实现一个闰年测试的JAVA代码如下: package leapyear; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextFi

关于软件测试(4):闰年输入的判断以及非法输入的处理测试

针对这周的软件测试课程,讲解了非法输入的不正当处理会对程序造成不必要的损失,因此通过简单的闰年检测程序来处理关于闰年测试的非法输入. 一.需求分析 要求输入框输入年份,点击按钮,出现提示.并能有效的处理任何输入 二.测试用例 内容 取值 预期结果 被400整除 2000 是闰年 被100整除但不被400整除 1900 不是闰年 被4整除且不被100整除 1904 是闰年 不被4整除 1901 不是闰年 非数字字符 abc 非法输入 负数 -1234 非法输入 小数 2000.5 非法输入 空字符

【软件测试】闰年问题(不考虑非法输入)

问题描述 输入年份,输出输入年份是否为闰年(不考虑非法输入) 一个年份是闰年的条件是: 该年份能被4整除但是不能被100整除或 该年份能被400整除 代码实现 import javax.swing.JOptionPane; import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.geometry.Pos; impo

闰年测试(非法输入的判断)

1. 问题描述: 输入一个年份,判断其是否为闰年,若为非法输入则给出提示 2. 问题分析: 闰年的判断: 1)输入一个年份,若它能被400整除,则它是闰年:若它能被4整除,且它不能被100整除,则它是闰年 由此判断,若它是闰年,则输出“该年是闰年”:否则,则输出“该年不是闰年” 2)若为非法输入,给出提示,则输出“输入不合法” 3. 测试用例: 编号 输入 期望输出 1 2004 该年是闰年 2    2000 该年是闰年 3 1900 该年不是闰年 4 200,. 输入不合法 4. 测试结果:

关于闰年测试中非法输入的处理

在软件测试技术课当中我们进行了关于闰年的测试,闰年的测试方法如下所示: public static boolean isLeapYear(int year)        {             if (year % 400 == 0)                return true;             if (year % 100 == 0)                return false;             if (year % 4 == 0)         

[软件测试学习]考虑到测试的代码编写/int.parse的非法输入—由一个简单的c#闰年检测程序说起

一个简单的C#的闰年检测程序 1.闰年检测的函数编写 当提起检测平年闰年时候,第一反应写出的代码 1 public static bool isLeapYear(int year){ 2 return ((year % 4 == 0 && year % 100 != 0)||(year % 400 == 0)) 3 } 但是这个并不易于测试和出现错后的修改,更改代码如下 1 public static bool isLeapYear(int year){ 2 bool check = ne

软件测试第四周--闰年问题的非法输入处理

闰年的判断条件: ①.普通年能被4整除且不能被100整除的为闰年.②.世纪年能被400整除的是闰年③.对于数值很大的年份,这年如果能整除3200,并且能整除172800则是闰年.如172800年是闰年,86400年不是闰年 测试用例: 编号 输入 输出 1 2004 此年是闰年 2 2008 此年是闰年 3 2000 此年是闰年 4 1999 此年非闰年 5 1998 此年非闰年 6 -1200 非法输入 基本逻辑:#include<stdio.h>void main(){ int year,

闰年的非法输入的问题

1.问题描述 输入年份,判断其是否为闰年. 2.判断条件 1)能被4整除且不能被100整除的为闰年. 2)能被100整除且被400整除的为闰年. 3.等价类划分 编号 有效等价类 编号 无效等价类 1 能被400整除 3 能被100整除不能被4整除   2 能被4整除不能被100整除 4 不能被4整除 5 非法输入(包括负数) 4.测试用例 编号 输入 覆盖等价类 输出 1 1600 1 1600是闰年 2 2012 2 2012是闰年 3 1700 3 1700非闰年 4 2014 4 201

软件测试------判断闰年的输入框

1.题目要求 坐在最后一排看的不是很清楚,貌似老师给了个能判断闰年的输入框,然后问大家输入abcd会怎么样,结果是报错了. 我们的任务是把这个判断闰年的输入框搞出来并且让这个系统可以handle非法的输入. 2.实现方法 实现方法再续前缘(html+servlet),关键代码如下: 1 PrintWriter out = response.getWriter(); 2 String tmp = request.getParameter("year"); 3 out.println(&q