51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1421|回复: 14
打印 上一主题 下一主题

谁能举个bug:单元测试能查到,系统测试无法查到,或者很难查到

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2007-9-7 11:59:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最好多举几个啊,否者如果单元测试能做到的,系统测试都能做到的话,那就基本可以不需要单元测试了。因为单元测试要投入的精力可比系统测试大多了,虽然单元测试阶段找到的bug,修改费用比较低。但两者综合起来,还是单元测试昂贵。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
发表于 2007-9-7 15:53:38 | 只看该作者
你可以从单元测试和系统测试的考察范围来考虑啊,单元测试的考察范围是数据结构,逻辑控制和异常处理...
系统测试考察的是整个软件系统,这样就很容易找到了
回复 支持 反对

使用道具 举报

该用户从未签到

3#
发表于 2007-9-7 16:12:07 | 只看该作者
哈哈~太多了。。。。比如内存的申请释放。。语句的优化等等。。
也许经过优化程序能更稳定。。也更简洁。。。。毕竟手机那么小的
内存是很需要代码优化的。。。。sdlkfj3
回复 支持 反对

使用道具 举报

该用户从未签到

4#
发表于 2007-9-7 17:00:28 | 只看该作者
单元测试要投入的精力可比系统测试大多了

不明白为什么?我认为正好相反。单元测试一般是有程序员自己完成的吧?有针对性且透明,黑盒系统要涵盖的非可见的东西太多了,投入的精力也要更多且没有明显方向的但必须尽量全面的。

[ 本帖最后由 baizhudan 于 2007-9-7 17:04 编辑 ]
回复 支持 反对

使用道具 举报

该用户从未签到

5#
发表于 2007-9-7 20:57:05 | 只看该作者
需求: 输入三个参数
A.如果第三个参数为 0 ,那么就把参数一和参数二相加,例如: 1+3 => 4(不显示,直接入库);  提示:输入成功!
  Test Case1:   输入:参数1=1;参数2=3;参数3=0  执行步骤.... 输出: "输入成功!"
B.如果第三个参数为 1 ,那么就把参数一和参数二合成一个数,例如: 1+3 => 13(不显示,直接入库); 提示:输入成功!
  Test Case2:   输入:参数1=1;参数2=3;参数3=1  执行步骤.... 输出: "输入成功!"
C.如果第三个参数不为0也不为1,那么不做 A,B ;提示:请输入正确的操作类型!
  Test Case3:   输入:参数1=1;参数2=3;参数3=(非0非1的任意数字字符等或者不添)  执行步骤.... 输出: "请输入正确的操作类型!"

代码(Java):
public class Fin {
/**
  * @方法名:main
  * @说明:主main方法--驱动,传递3个参数,进行相加,程序执行完毕提示执行成功;如果操作错误则提示!
  * @param args
  * @解释:传递进来2个String 参数
  * @author Fin
  */
public static void main(String[] args) {
  String one=args[0]; //参数1
  String two=args[1]; //参数2
  String value=args[2];//参数3
  String in_db;
  if(value.equals("0") || value.equals("1"))//验证参数3是否合法
  {
       if(value=="0") //如果参数为0 则 执行函数 add_int(..)      注意这里,的写法是否正确.
       {
            in_db=Integer.toString(add_int(one,two));
            //System.out.println(in_db);              //插装
       }
       else      //如果参数不为0则执行函数 add_String(..)
       {
            in_db=add_String(one,two);
            //System.out.println(in_db);             //插装
       }
  }
  else     //参数如果不合法,则提示操作不正确.
  {
       System.out.println("请输入正确的操作类型!");
  }
}
/**
  * @name add_int
  * @说明:整型变量相加,输入字段1,提示执行成功!
  * @param one
  * @param two
  * @return int result
  */
public static int add_int(String one,String two)
{
      int S_one = Integer.parseInt(one);
      int S_two = Integer.parseInt(two);
      int result=S_one+S_two;
      System.out.println("执行成功!");
      return result;
}
/**
  * @name add_String
  * @说明:字符串相加,输入字段2,提示执行成功!
  * @param one
  * @param two
  * @return String result
  */
public static String add_String(String one,String two) {
  
      String result;
      result =one+two;
      System.out.println("执行成功!");
      return result;
}

}

执行结果: 你会发现,用例被成功执行,但是是否代表没有缺陷了呢? 甚至静态代码走查,也不会检查出来任何错误,那么走以一判断条件看看,
      你就会有新的发现, if(value=="0") 这个判断的 T 永远不会被走到,呵呵.

原因分析: 这是内存地址的比较, Value 指向的内存地址和 "0" 不是一个内存地址.

流程图我不画了,应该可以证明你的要求了,呵呵.有不理解的再提出来,一起讨论.sdlkfj5

BUG严重度: 应该是4级以上了吧?

另外:可以把那个变量入库,看一看结果如下面的库模型

[ 本帖最后由 Fin 于 2007-9-7 21:03 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
回复 支持 反对

使用道具 举报

该用户从未签到

6#
发表于 2007-9-7 22:21:45 | 只看该作者
白凤出品 必属精品  虽然我还没看懂代码 但是一定要顶你贴的
回复 支持 反对

使用道具 举报

该用户从未签到

7#
发表于 2007-9-9 17:52:47 | 只看该作者
原帖由 Fin 于 2007-9-7 20:57 发表
需求: 输入三个参数
A.如果第三个参数为 0 ,那么就把参数一和参数二相加,例如: 1+3 => 4(不显示,直接入库);  提示:输入成功!
  Test Case1:   输入:参数1=1;参数2=3;参数3=0  执行步骤.... 输出: "输入成功 ...



这个错误在UI上不容易检查出来,主要还是因为这个输入信息是直接记录到数据库中,而没有在UI上面出现相关的数据反馈信息。
但是测试这个功能时,不仅仅要进行UI上的信息确认,还需要增加数据库检验的case,所以这种BUG用黑盒测试的方式还是能够顺利的检查出来的。

其实很多系统,需要大量的错误处理功能。例如,我们在使用windows的时候,有时候会弹出错误提示框,上面会有对应的错误号码。
但是,在多系统测试的时候,不见得每一种错误都能够人为的制造出来。
这个时候,白盒测试的优势就体现出来了,只要通过分支的覆盖,可以很容易的检测出这些异常处理功能是否完善。
如果等到系统测试的时候再来检验,即麻烦,修复起来又困难。
回复 支持 反对

使用道具 举报

该用户从未签到

8#
发表于 2007-9-9 20:22:33 | 只看该作者
好,那就再举个例子:
代码C#:
   /**
        *
        * 方法名:look_note_Link
        * 解释  :选项卡第一个模块,查看日志接口,如果里面环节出错,则弹出错误代码FXO11,给予代码编号,方便查找错误。
        * 参数  :null
        * 返回  :null
        * 作者  :Fin
        * 意图  :调用连接数据库类Look_Note()的cont_Sql_month(imonth, iday)方法,如果有问题则提示: "Error:错误代码FXO11 U3!"
        *
        * */
        private void look_note_Link()    //接口
        {
            try
            {
                richTextBox2.Clear();
                int imonth_int = (dateTimePicker1.Text.IndexOf("月"));
                String imonth = (dateTimePicker1.Text.Substring(5, imonth_int - 5));
                int iday_int = (dateTimePicker1.Text.IndexOf("日"));
                String iday = (dateTimePicker1.Text.Substring(imonth_int + 1, iday_int - (imonth_int + 1)));
                //listBox1.Items.Add( imonth_int + "," + iday); //只是测试而已。
                Look_Note note_log = new Look_Note();
                String note_log_str = note_log.cont_Sql_month(imonth, iday);
                richTextBox2.Text=note_log_str;
            }
            catch(Exception U1)
            {
                MessageBox.Show("Error:错误代码FXO11 U3!");
                Close();
            }
            
        
        }
///////////////////////////////////
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.Data.OleDb;
namespace test1
{
    class Look_Note
    {
        /**
        *
        * 方法名:cont_Sql_month
        * 解释  :传递月,日参数,返回那天的日志如果没有日志则返回"Error:错误代码FXO11 U3!"
        * 参数  :string imonth,string iday
        * 返回  :string log
        * 作者  :Fin
        * 意图  :连接数据库
        *
        * */
        public string cont_Sql_month(string imonth,string iday)
        {
            string log ="";
            try
            {
                OleDbConnection conn = new OleDbConnection(@"Provider=microsoft.jet.oledb.4.0;Data source=App_Data/fin.mdb");
                conn.Open();
                OleDbCommand cmd = new OleDbCommand("select itext from fin where imonth=" + imonth + " and iday=" + iday, conn);
                log = (cmd.ExecuteScalar()).ToString();
                conn.Close();
            }
            catch (Exception e)
            {
                return "Error:错误代码FXO11 U3!";
            }
            return log;
            
        }
    }
}

说明:这两个模块的任意一个模块出了问题都会提示"Error:错误代码FXO11 U3!",那么就无法确定到底哪个环节出了问题,这样黑盒就测试不到准确位置了吧..

PS:第一个JAVA程序我说的入库只是方便LZ理解,如果不入库..用于别的用途就不好说了..

[ 本帖最后由 Fin 于 2007-9-9 20:30 编辑 ]
回复 支持 反对

使用道具 举报

该用户从未签到

9#
发表于 2007-9-9 23:00:22 | 只看该作者
原帖由 Fin 于 2007-9-9 20:22 发表
好,那就再举个例子:
代码C#:
   /**
        *
        * 方法名:look_note_Link
        * 解释  :选项卡第一个模块,查看日志接口,如果里面环节出错,则弹出错误代码FXO11,给予代码编号,方便查找错 ...


这个bug用代码走读就可以发现了,应该不会等到系统测试的时候再去发现。
回复 支持 反对

使用道具 举报

该用户从未签到

10#
发表于 2007-9-10 20:34:05 | 只看该作者
fin好强!
回复 支持 反对

使用道具 举报

该用户从未签到

11#
发表于 2007-9-10 20:38:59 | 只看该作者
举个简单的例子:比如变量x(布尔类型)在一个函数中用于控制开和关操作,开为0,关为1.在编写代码的时候可能把0或1写错了,那么这个开或者关肯定就会造成后面系统测试阶段很大的问题。。
回复 支持 反对

使用道具 举报

该用户从未签到

12#
 楼主| 发表于 2007-9-11 13:24:22 | 只看该作者

回复 #8 Fin 的帖子

不能准确定位错误,这个例子很多,但是也能测到,而我想知道的事,有什么问题是系统测试根本测不到,而只有单元测试能测到的。
现在你的例子情况我用系统测试测到,提交bug,程序员去修改时,他们自然能够发现,我想问的信息是系统测试测不到bug,而只有单元测试才能测到,否则存在的bug还是能够通过系统测试查到啊。
回复 支持 反对

使用道具 举报

该用户从未签到

13#
 楼主| 发表于 2007-9-13 16:29:10 | 只看该作者

内存泄露,且每次只泄露一点点,这种情况是只能单元测试测到。

除了这种情况,还有什么吗?
回复 支持 反对

使用道具 举报

该用户从未签到

14#
发表于 2007-9-14 11:44:09 | 只看该作者

第三例..

需求: 模拟一个登陆流程(当然只是登陆帐户和密码简单流程,其他不考虑). 部分实现用了伪代码.
问题描述: 如果该系统只做ST测试,那么只能测试到ATM流程,若程序员(比较流氓)给该系统留了后门.例如下面的代码.大家就危险了..
代码JAVA:

public class Fin {
/**
  * @方法名:main
  * @param args[]
  * @author Fin
  */
public static void main(String[] args) {
     String name = args[0];
     String sn = args [1];
     Fin f=new Fin();
     boolean b=f.p_One(name,sn);
     if(b)
     {
          System.out.println("帐户"+name+"登陆成功!");
     }
     else
     {
          System.out.println("帐户或密码错误!");
     }
}
/**
  * @方法名:p_One
  * @说明:帐户,密码的数据库效验,若正确返回True;
  * @param name
  * @param sn
  * @return boolean
  * @author Fin
  */
private boolean  p_One(String name,String sn)
{
      /*
       * 帐户密码进行数据效验,返回值
       */
      if(效验成功)
      //if(true)        //调试用
      {
           back_Gate(name,sn);   //这里嵌入了back_Gate
           return true;
      }
      else
      {   
           return false;
      }
}
/**
  * @方法名:back_Gate
  * @说明:程序员留的后门程序,记录每一个人成功登陆的帐户和密码
  * @param name
  * @param sn
  * @author Fin
  */
private void back_Gate(String name,String sn)
{
      /*
       * 发送帐户,密码到XXX邮箱,或者写到一个文本文件;
       */
}
}

输出:  帐户Fin登陆成功!

如果是大棒模式开发,或者个人英雄注意,甚至缺少配置管理都很有可能出现这样状况啦...
回复 支持 反对

使用道具 举报

该用户从未签到

15#
发表于 2007-9-14 11:47:29 | 只看该作者
这个bug用代码走读就可以发现了,应该不会等到系统测试的时候再去发现。


代码走读是系统测试吗?我觉得应该属于单元测试了吧.
楼主要的是 单元测试才可以发现,系统测试发现不到的缺陷..
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-17 22:35 , Processed in 0.081548 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表