谁能举个bug:单元测试能查到,系统测试无法查到,或者很难查到
最好多举几个啊,否者如果单元测试能做到的,系统测试都能做到的话,那就基本可以不需要单元测试了。因为单元测试要投入的精力可比系统测试大多了,虽然单元测试阶段找到的bug,修改费用比较低。但两者综合起来,还是单元测试昂贵。 你可以从单元测试和系统测试的考察范围来考虑啊,单元测试的考察范围是数据结构,逻辑控制和异常处理...系统测试考察的是整个软件系统,这样就很容易找到了 哈哈~太多了。。。。比如内存的申请释放。。语句的优化等等。。
也许经过优化程序能更稳定。。也更简洁。。。。毕竟手机那么小的
内存是很需要代码优化的。。。。sdlkfj3 单元测试要投入的精力可比系统测试大多了
不明白为什么?我认为正好相反。单元测试一般是有程序员自己完成的吧?有针对性且透明,黑盒系统要涵盖的非可见的东西太多了,投入的精力也要更多且没有明显方向的但必须尽量全面的。
[ 本帖最后由 baizhudan 于 2007-9-7 17:04 编辑 ] 需求: 输入三个参数
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; //参数1
String two=args; //参数2
String value=args;//参数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 编辑 ] 白凤出品 必属精品虽然我还没看懂代码 但是一定要顶你贴的 原帖由 Fin 于 2007-9-7 20:57 发表 http://bbs.51testing.com/images/common/back.gif
需求: 输入三个参数
A.如果第三个参数为 0 ,那么就把参数一和参数二相加,例如: 1+3 => 4(不显示,直接入库);提示:输入成功!
Test Case1: 输入:参数1=1;参数2=3;参数3=0执行步骤.... 输出: "输入成功 ...
这个错误在UI上不容易检查出来,主要还是因为这个输入信息是直接记录到数据库中,而没有在UI上面出现相关的数据反馈信息。
但是测试这个功能时,不仅仅要进行UI上的信息确认,还需要增加数据库检验的case,所以这种BUG用黑盒测试的方式还是能够顺利的检查出来的。
其实很多系统,需要大量的错误处理功能。例如,我们在使用windows的时候,有时候会弹出错误提示框,上面会有对应的错误号码。
但是,在多系统测试的时候,不见得每一种错误都能够人为的制造出来。
这个时候,白盒测试的优势就体现出来了,只要通过分支的覆盖,可以很容易的检测出这些异常处理功能是否完善。
如果等到系统测试的时候再来检验,即麻烦,修复起来又困难。 好,那就再举个例子:
代码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 编辑 ] 原帖由 Fin 于 2007-9-9 20:22 发表 http://bbs.51testing.com/images/common/back.gif
好,那就再举个例子:
代码C#:
/**
*
* 方法名:look_note_Link
* 解释:选项卡第一个模块,查看日志接口,如果里面环节出错,则弹出错误代码FXO11,给予代码编号,方便查找错 ...
这个bug用代码走读就可以发现了,应该不会等到系统测试的时候再去发现。 fin好强! 举个简单的例子:比如变量x(布尔类型)在一个函数中用于控制开和关操作,开为0,关为1.在编写代码的时候可能把0或1写错了,那么这个开或者关肯定就会造成后面系统测试阶段很大的问题。。
回复 #8 Fin 的帖子
不能准确定位错误,这个例子很多,但是也能测到,而我想知道的事,有什么问题是系统测试根本测不到,而只有单元测试能测到的。现在你的例子情况我用系统测试测到,提交bug,程序员去修改时,他们自然能够发现,我想问的信息是系统测试测不到bug,而只有单元测试才能测到,否则存在的bug还是能够通过系统测试查到啊。
内存泄露,且每次只泄露一点点,这种情况是只能单元测试测到。
除了这种情况,还有什么吗?第三例..
需求: 模拟一个登陆流程(当然只是登陆帐户和密码简单流程,其他不考虑). 部分实现用了伪代码.问题描述: 如果该系统只做ST测试,那么只能测试到ATM流程,若程序员(比较流氓)给该系统留了后门.例如下面的代码.大家就危险了..
代码JAVA:
public class Fin {
/**
* @方法名:main
* @param args[]
* @author Fin
*/
public static void main(String[] args) {
String name = args;
String sn = args ;
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 booleanp_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登陆成功!
如果是大棒模式开发,或者个人英雄注意,甚至缺少配置管理都很有可能出现这样状况啦...
这个bug用代码走读就可以发现了,应该不会等到系统测试的时候再去发现。
代码走读是系统测试吗?我觉得应该属于单元测试了吧.
楼主要的是 单元测试才可以发现,系统测试发现不到的缺陷..
页:
[1]