-
测试转开发
2007-09-20 15:53:30
工作快半年了,毕业快三个月了,做测试也快半年了,在这半年的测试生活里,感觉不好也不坏,日子就那样过,没有感觉,收获也不大,现在的能力是:可以写功能测试用例,可以做黑盒测试,知道了测试流程.
个人体会是学不到什么东西,感觉做测试没什么意思,是重复了再重复,工作就是一个水平面,公司的测试流程是混乱的,有的时候竟然是更新一个bug后,也要换包!天啊,每天点鼠标.像个呆子!就象黑盒测试的定义一样,你不需要知道软件的内部结构,我们只关心它能不能完成这个功能.每天打开网站,"什么测试职业的前途,没有技术含量,环境造成低人一等,测试人员的困惑!"我觉得特别的不便服.这种环境让我感觉压抑,我希望我刚工作就是这个样子,我有能力去改变.于是我决定转开发!
当然,上面我讲的有可能太过于偏激,但是那确实是我的工作感受.我想测试工程师要求其实还是挺高的,要站得比开发人员更高.在测试的过程中我也学到不少的测试知识,方法,技巧,我想如果我转测试的话,一定会做的更好,写出更优秀的代码.也许以后我会再杀回来呢,呵呵,来个回马枪!
-
java中的Object()类的一点认识.
2007-09-20 12:08:01
先讲一下:Object类,它是java中所有类的直接或者间接类的父类,是类库中所有类的父类,所以可以和任意类型的对象匹配.所以在有些场合可以使用它作为形式参数的类型.例如:equals()方法其形式参数就是一个object类型的对象.这样就可以保证任意java类都可以定义与自身对象直接相互比较的操作.在以下的例子中覆盖了equals()方法,example:
class MyOkDate{
int day,month,year;
public MyOkDate(int i,int j,int k){
day=i;
month=j;
year=k;
}
public boolean equals(Object obj){
if(obj instanceof MyOkDate){
MyOkDate m=(MyOkDate)obj;
if(m.day==day&&m.month==month&&m.year==year)
return true;
}
return false;
}}
-
内部类与匿名类
2007-09-19 14:27:59
Inner Class AND Anonymous Class
内部类是定义在其他类中的类,主要作用是将逻辑上相关联的类放到一起.而匿名类是一种特殊的内部类,它没有类名,在定义类的时候就生成该对象的一个实例.由于在其他类中不会用到该类,所以不要取名字.
在封装它的类的内部使用内部类,与普通类的使用方式相同,在其他地方使用内部类时,类名前要冠以外部类的名字才能使用,在用new创建内部类的时候,也要在new前面冠以对象变量.如:Parcle是外部类,而Destination是内部类.则可以如下方法使用内部类.
Parcle p=new Parcle();
Parcle.Destination d=p.new Destination("Hawaii");
内部类与类中的域,方法一样是外部类的成员,所以在内部类中可以直接访问外部类的其他域及方法,即使它们是private的,这也是使用内部类的一个好处.如果内部类中与外部类有同名的域或者是方法,可以使用冠以外部类名.this来访问外部类中的同名成员.
使用方法中的内部类要注意如下几点:
1.同局部变量一样,方法中的内部类前面不能用public,private,protected,static,但可以用final and abstract.2.方法中的内部类,可以访问外部类的成员;若是static 方法中的内部类可以访问外部类的static成员.3.方法中的内部类不能访问方法的局部变量,除非是final的局部变量.4.方法中定义的内部类,在其他地方使用时,没有类的名字,正像上面的例子中一样,只能用其父类来引用这样的变量(例中用Object)
例:Object ōbj=new Outer().makeTheInner(47);
-
java基本概念的理解
2007-09-19 13:20:08
1. 通常,在一个类中定义一个方法为static,那就是说,无需本类的对象也可调用
此方法.
调用一个静态方法就是"类名.方法名"
静态方法常常为应用程序中的其它类提供一些实用工具所用,在Java的类库中大量的静态方法正是出于此目的而定义的
例:class Simple{
static void go(){
System.out.println("Go go");
}
public static void main(String args[])
Simple.go();
}
2. 静态变量
静态变量与静态方法类似。所有此类实例共享此静态变量,也就是说在类装载时,只分配一块存储空间,所有此类的对象都可以操控此块存储空间,当然对于final
则另当别论了。static 变量有点类似于C中的全局变量.
看下面这段代码:
3.域变量和局部变量:
从语法形式上看域变量属于类或者是接口,而局部变量是在方法中定义的变量或者是方法参变量.域变量可以被public ,private,protected,static 等词修饰.而局部变量
则不能被这些词修饰,但是域变量和局部变量都可以被final词修饰.
从内存的存储形式上来看,域变量是对象的一部分,而对象是存在于堆中的.但是局部变量却是存在于栈中的.
从变量在内存中的存在的时间上看,域变量是对象的一部分随着对象的创建而被创建,而局部变量则随着方法的调用而产生,随着方法调用的结束而自动消失.
域变量如果没有赋初值的话,会自动以该类型的默认值(0,false,null等)来赋值.当然也有例外,被final修饰但是又没有被static修饰的域变量必须显式的赋值.而局部变量
必须显式的被赋.
例:class LocalVarAndMemberVar{
int a ;
void m(){
int b;
System.out.println(a);//a 被赋为0;
System.out.println(b);//编译不能通过;
}
}
4.参数的传递:JAVA遵循的是值传递.也就是说,当调用一个方法时,是将表达式的值复制给形式参数.
5.与变量的传递一样,方法的返回值可以是基本类型也可以是引用类型.
如果一个方法返回的是一个引用类型,由于引用类型是一个引用,所以它可以存储对象的实体.
例:Object GetNewObject(){
Object ōbj=new Object();
return obj;
}在引用方法时候可以这样用,Object p=GetNewObject();
由于JAVA中所有的东西都是引用(句柄),所以只需要做简单的传递或者返回引用即可.
7.所谓多态是指一个程序中相同的名字表示不同的含义.
简单情况下,可以通过子类对父类方法的覆盖(override)实现多态.也可以利用重载在同一个类中定义多个同名的不同方法.面向对象的程序中,多态还有更深刻的含义,就是
动态的绑定(dynamic binding),称为虚方法调用.它能够使对象所编写的程序,不用做修
改就可适应于其他所有的子类,如在调用方法时,程序会正确的调用子对象的方法.
8.上溯造型
类似于基本数据类型数据之间的强制类型转换,存在继承关系的父类对象引用和子类对象引用之间也可以在一定条件下相互转换.但须注意以下的原则::
(1).子类对象可以被视为父类的一个对象,如一个student对象也可以是一个person对象
(2).父类对象不能被当做某一子类对象.
(3).如果一个方法的形式参数被定义的是父类对象,那么调用这个方法时,可以使用子类对象做为实参.
(4).如果父类对象引用指向的实际上是一个子类对象,那么这个父类对象的引用 可以强制转换成子类对象的引用.
把派生类型当作它的基本类型处理的过程,又称(upcasting)
如果一个方法声明成final,它能防止覆盖该方法同时告诉编译器不需要动态的绑定.
如果一个方法是static或private,它不能被子类所覆盖,自然也是final的,不存在虚方法.
-
国税项目---结束收获总结;
2007-09-13 14:34:04
最近公司做了一个小项目,是给国税做的,国税执法系统.这个星期就要结束了,想谈一谈刚踏入测试门所做的第一个项目的收获.小结一下:
1.这个项目是由我们新来的几个人做的,我和一个同事学着配置了测试服务器,ORACLE+TOMCAT;由于以前没有装过ORACLE所以不知道是什么一种情况,就连象新建数据库这样的东西都不知道是怎么搞的,颇废了一番的周折.从中学习到ORACLE中的IMP/EXP命令的使用,例:exp zffzxt/kjlink@zffzxt2 file=d:\1.dmp;测试服务器的配置.不过还是不够深,要继续学习.
2.在测试的过程中,特别是对数据库的操作中,如果数据库有重复的数据,比如讲某一个键值重复或者为空的话,可能会导致报错,当然注重逻辑顺序的操作能够发现很多的BUG,也就是说尽量的多设计几个测试的顺序流,然后按照这个流程去走.
不想讲了,下次再写吧!
-
java中的static的理解;
2007-09-12 17:50:35
static:
用static修饰符修饰的域仅属于类的静态域,又移称为静态量,类域,类变量.不用它修饰的域称为实例变量和实例域.
静态域的本质特点是:它们的类域不属于任何一个类的具体对象实例.它不保存在某个对象实例的内存空间内,而是保存在类的内存区域的公共存储单元.也就是说静态域是一个公共的存储单元.任何一个类的对象访问它,取到的都是相同的数值,同样任何一个类去修改它,也都是对同一个内存进行操作.
用static 修饰的方法仅属于类的静态方法,又称类方法.不用它修饰的为实例方法.
声明一个方法为static有以下的意义;
1.非static修饰的方法是属于某个对象的方法,在这个对象被创建,对象的方法在内存中拥有自己专用的代码段,而static方法属于整个类,它在内存中的代码段随着类的定义而进行分配和装载,不被任何一个对象所占有.
2.由于static方法属于整个类,所以它不能操纵和处理属于某个对象的成员变量,而只能操作属于整个类的成员变量,即或static方法只能处理static域或者是static方法,.
3.类方法中不能访问实例变量.在类方法中不能使用this 和super.
4.调用这个方法的时候可以使用类名直接调用,也可以用某个具体的对象名.
注:不能在类的方法中去存取实例变量.但是可以在实例方法中去存取类域.
从类成员的特性可以看出,可用static来定义全局变量和全局方法.
final:
如果一个类被final修饰或者是限定的话,说明这个类不能被继承,也就是说不可能有子类.
用它来修饰的类一般为了完成固定功能或是某种标准功能.用final修饰的方法不能被覆盖.
一个域被static final修饰符所限定的话,它实际的含意也就是常量.
synchronized:
如果synchronized修饰的方法是一个类方法(即static方法),那么在被调用执行前,将把系统类Class中对应的当前类的对象加锁.如果修饰的是一个对象方法(未用static修饰),则这个方法在被调用执行前,将把当前的对象加锁,多用于多线程共存的程序中的协调与同步.
-
java学习之Calendar类的使用
2007-09-11 17:04:31
最近在学习java中的Calendar类的使用,感觉有点收获.一边看项目的代码一边学习JAVA感觉挺好的.
不过里面有好多不懂的东西,里面还有HTML方面的东西.呵呵,碰到不懂就上网查查!
明天看ZB8的代码,看看一下关于JAVA里面的工具类,ArrayList,Hashmap,map.
就应该这样子,前几天没事做感觉好空虚,整天的没有收获,就像是在混日子,今天感觉好多了!
希望自己加油.
-
两个月的测试生活和收获
2007-09-07 17:51:04
上班快两个月了,感觉没学到什么东西.感觉公司的测试流程相当的混乱,软件产品出来只是做了功能方面的测试,看一看功能能不能执行,流程能不能走得通就行了.什么性能方面的测试也不做靠感觉.呵呵
感觉有点无聊,来了个新包就要重复原来的动做,拜托能不能用一下ROBOT之类的软件进行一下回归测试.可是公司没有人会啊!感觉现在会工具的高手现在还没有见到过,只是在网上看到几个N人在讲,不过他们讲的我大多都不懂,很想学习,觉得有前途.
编程能力不是太强,好好学,方向是java ,比较的感兴趣.最近没事就拿我们测试的这个项目的源代码来看看,还真能看得的懂,只不过如果让编起来可能就太困难了,还有就是对j2ee的整体构架不是太清楚.
学了点关于oracle方面的东西.以前以为多么深奥的东西,其实数据库都是一样的东西,不过oracle的测试服务器还真的很难搭建.搞了好长时间没弄好,找开发帮弄的,也不知道为什么.想研究一下.
还有最近回去没事,玩起了单机版的 游戏:大航海时代,呵呵,觉得挺好玩.一定程度的影响了自己学习java的时间.
好了,一个星期又快要过去了,感觉时间真的很快呀,
现在回头看了一下全文一点逻辑都没有,讲出来也挺开心,在写的过程中总结了这段时间的收获,不错对以后的工作和学习都有好处.希望以后要坚持!
祝看到我的贴子的测试朋友,天天 开心,享受测试的快乐!
-
java 中this 的理解;
2007-08-28 17:25:19
自学java 也有一段时间了,可是对java中的this关键字总是理解的不是那么产透.也许以前看的都是些理论的东西没有看到更多的实例.今天没事在网上搜了一下,发现一个例子能够清楚的说明一切,拿出来分享一下?
this应用的最普遍的情况就是,在你的方法中的某个形参名与当前对象的某个成员有相同的名字,这时为了不至于混淆,你便需要明确使用this关键字来指明你要使用某个成员,使用方法是“this.成员名”,而不带this的那个便是形参。另外,还可以用“this.方法名”来引用当前对象的某个方法,但这时this就不是必须的了,你可以直接用方法名来访问那个方法,编译器会知道你要调用的是那一个。下面的代码演示了上面的用法:
this也即是当前的对象.
public class DemoThis{
private String name;
private int age;
DemoThis(String name,int age){
setName(name); //你可以加上this来调用方法,像这样:this.setName(name);但这并不是必须的
setAge(age);
this.print();
}
public void setName(String name){
this.name=name;//此处必须指明你要引用成员变量
}
public void setAge(int age){
this.age=age;
}
public void print(){
System.out.println("Name="+name+" Age="+age);//在此行中并不需要用this,因为没有会导致混淆的东西
}
public static void main(String[] args){
DemoThis dt=new DemoThis("Kevin","22");
}
} -
java环境变量的配置
2007-08-15 17:23:44
假如你安装的JDK的路径是:D:\jdk1.5.0_06
则你可以像如下配置,在我的电脑--》属性--》高级--》环境变量
新建几个变量:classpath,java_base,java_home,path;
则各个变量的值如下所示。
CLASSPATH:
.;%JAVA_HOME%\lib\tools.jar;
JAVA_BASE
D:\jdk1.5.0_06
JAVA_HOME
D:\jdk1.5.0_06
path
%JAVA_HOME%\bin;D:\jre1.5.0_06\lib\javaws.jar; -
跟踪的bug,bug的状态
2007-08-15 16:55:09
跟踪bug 报告类型
为了帮助我们更好的跟踪bug,分析bug,为以后的项目总结经验,我们在TD里增加了QA Tracking,并定义了4个选择值:
Ø New Discovery: 表示这个bug是新发现的,这就意味着这个bug一直存在,但是QA在之前的测试中没有发现
Ø New Feature introduction: 表示这个bug是因为新功能的改动而引起的
Ø Regression: 表示这个bug不存在以前的测试版本或build,但是存在当前测试的版本或build
Ø Undefined: 如果我们不能确定是否是上面的3种情况的,请选择这项,但是我们要尽量少选这个.
Bug 状态
只有Closed 才是bug的最后状态,当前我们有7种状态,每种状态的意思为:
Ø New: 这是一个bug的初始状态,我们所有的新发现的bug,其状态都是New
Ø Open: 项目负责人或者资深的人员review 所有的New bug后,认为bug是有效的话,将bug的状态从New改为Open.
Ø Fixed: 开发人员把相应的代码修正后,并通过了单元测试,将对应的bug状态改为Fixed, 并加一定的注释.
Ø Closed: QA人员拿到新的测试版本后,验证Fixed bug,确实不存在的,把bug的状态改为Closed.并要加注释
Ø Rejected: 开发人员认为这个Bug是无效的,将会把bug的状态改为Rejected,这种状态不是最后的状态,QA人员要仔细的分析,如果真的是无效的,那么需要将其状态改为closed;否则改为Reopen
Ø Reopen: QA验证Fixed/Rejected bugs后,bug仍然存在或者有效的,将其状态改为Reopen
Ø Deferred: 这是新增加的一种状态,其目的避免开发人员将一些设计的问题改为Rejected状态;当前,一些设计需求已经确定,但是一些设计确实存在不合理的地方,而因为项目周期的原因,当前项目无法做需求上的改动,所以只有在下个版本了做Fixed,我们将会把这些bug放到下个版本里fixed.
Bug fixed/closed/Rejected/Deferred 的注释
为了保证QA能够精确的估算因为fixed bug而要测试的范围,开发在fixed bug时候,必须增加注释,包括解决方案,修改的文件名, 同样,开发在原代码中,也必须增加一个注释,表明这个代码改动的原因(fixed bug还是新的需求). QA验证一个fixed bug后,无论是re-open 还是closed,都要加个注释,表明在那个版本里或者build里验证的.
同样,开发人员在把一个bug的状态改为Rejected or Deferred的时候,也必须加足够的说明,如果没有任何的说明,QA将会直接的把这些bug改为Reopen状态.
-
bug的定义级别
2007-08-15 16:50:51
1. Bug 级别定义:
Ø Urgent: 致命错误,造成系统或应用程序崩溃(Crash),死机,数据库死锁等使程序无法正常运行下去的缺陷。
Ø Very High: 严重错误,指功能或特性没有实现,整个模块或大功能不工作的,影响大量的案例不能执行的, 严重的安全性问题
Ø High: 较大的问题,虽然不影响系统的使用,但没有很好地实现产品的功能,或者功能的实现和需求不符合, 没有达到预期效果,或用户界面差、操作时间长,一些大的逻辑性问题,主要页面的拼写错误等一些问题,一般的安全性问题
Ø Medium: 界面中的会影响用户使用方便性的错误,如滚动条无效,鼠标(光标)定位错误,光标跳转设置不好,提示信息不精确, 可编辑区和不可编辑区不明显等错误;
Ø Low: 不明显的对齐问题、非主要页面的个别的拼错等一些小问题,或者建议程序做适当的修改,来改善程序.
正常的项目发布之前,我们必须要求fixed 所有medium及以上的bug, 至少要fixed 所有High级别以上的bug.
-
态度决定你的“薪”情
2007-08-15 10:53:35
我的同事C,也是我的好朋友,跳槽去了一个正在迅速发展的IT公司,年薪翻了一倍。而他,从准备找工作到工作敲定,仅仅一周。二十万的年薪,在IT行业,对于不到五年工作经验的人来说,是一个很不错的收入了,我的同事自然也很开心很满足。我的其他同事,还有我的朋友,听说后,都非常羡慕,觉得他的运气很好。我也觉得他的运气不错,但除了运气外,我更多地觉得,他具备了这样的实力,所以当机会来了,自然就是他的了。我也会觉得,他的实力,源于他的态度,源于他一点一滴的积累与提升。
在与C合作的两年多的时间,我们的合作非常愉快,虽然存在异议,但是所有的争议都是为了把工作做得更好。我们的第一次合作,是一个短信过滤模块,产品出来后,是一个初步的原型,根据我对SMS的理解、业务的需求和维护方便,给他提了很多不错的建议,对于我所提的建议,他没像其他开发那样讨价还价,几天之后又交给我一个比较完美的产品。
对产品的测试,我非常挑剔,不满足于简单的需求,在产品满足了功能需求后,继续进行了深入的测试、改进和性能调优;产品试行后,继续跟进产品在实际环境的运行情况,对产品进行二次完善,所有的这个过程,C都非常配合,力求完美,毫无怨言。最终,他开发的这个产品,是我们SMS系统中,功能最完善、故障最少的产品。如果当初,没有他积极的配合,也许,这个产品也像其他的产品一样,只是一个普通的模块,我再努力也是徒劳。
在05年春节,我们的P2P系统出现了很大的故障,故障的原因无法定位也无法重现,当时整个团队都承受了很大的压力,我自己也在想方设法定位问题解决问题。那段时间,C给了我非常大的帮助,我们在一起讨论问题可能产生的原因,在交换各自的见解,每有一个新的想法就测试问题是否重现,同时配合代码白盒检查,将问题一个个地解决。我们都很清楚,这些隐藏的问题,仅仅靠一个开发或测试是很难定位的,需要的是一个配合良好的团队的努力。在后来的性能调优中,我提了很多建议,别的开发都没时间去做优化,是C主动接过了别人负责的模块,积极地配合我对P2P进行了长达两个月的性能调优与隐患挖掘,P2P最终成了一个从05年底到现在都无任何来自于软件的故障。现在再翻开我们合作完成的P2P性能调优报告,整整50页,每个改进都密密麻麻地写满了我们各自的原因追踪、改进建议和结果分析,现在再看,我自己还会感动。我想,这样的工作态度,是成就了他年薪翻倍的主要原因。
在他刚进入公司的时候,回复bug也跟其他同事那样只是简单地写上“fixed”或“ok”,我对他说:“回复bug的时候,最好能够写上产生bug的原因、解决的方法、升级的步骤以及这个改动引起哪些变动,方便测试进行模块升级和问题跟踪,也方便以后维护管理。”从此以后,他所有的bug回复都非常详细、专业。但,我其他的同事,同样的话我重复了N次,部门经理也发邮件要求大家去遵循,但是没几个同事能够像C那样自觉、认真的地回复,也没几个同事可以坚持两年多来一直都是那样认真地回复每个bug。我想,这就是人与人之间的差距,从这么一件简单的事情上,可以看到不同的人的工作态度。我们在羡慕别人得到了好机会的青睐,以为这只是运气,但事实上,运气的背后,是他的付出。
现在,当我们再回头查看两年前C所负责的bug,对于每一个问题,都可以从他的回复中看出当初问题产生的原因以及解决方法,对于公司来说,这无疑是一笔财富。我的这个同事,并不是一个非常聪明的人,也不是一个很能说会道的人,却是一个勤奋、认真的人,也是一个知道自己要的是什么的人。在项目不紧张的时候,他会主动去研究公司的核心产品,尽管那不是他所负责的,但他的主动为他积累了基础,也为他积累了机会;他甚至还会去学习与IT毫不相干的法律,为了维护自己的合法权益。他知道上班时间,也知道下班时间,上班的时候全部投入认真工作,但下班之后就很难得在公司找到他的影子。因为他觉得,下班了,就是自己的时间了,应该回家跟家里人一起分享。我非常欣赏他的这样的一种工作状态,也非常欣赏他的生活态度。公司的人才保留机制做得不好,他来公司两年工资的提高并不是很大,但他还是坚持以学习的态度认真做好他的工作,当他所负责的项目接近了尾声,他觉得自己的努力付出并没有得到相应的回报,所以决定离开。他知道自己的英文口语并不太好,没有像我那样一心坚持进管理完善的外企;因为决定了要离开,他也不像别人那样,边工作边找工作;他看中了一间正在迅速发展的公司,请了10天的年假,开始了他的应聘之路,而他也真的幸运,一周不到,就收到了他想去的公司的offer,当然,最令人兴奋的是他想去的公司满足了他二十万年薪的要求。
同事C去新的公司上班将近一个月了,我的其他同事和朋友说起他新的工作,仍然羡慕不已,但我会觉得,这不仅仅是因为他的运气,而是因为在过去的几年中,他努力的付出、认真的学习、塌实的工作,当然,更重要的是他清楚自己需要什么,也努力去争取自己想要的。我的身边,很多人都会在抱怨自己工资不高,也有很多人抱怨自己没有机会,但是,他们很少在自己的身上去找原因,只是将一切归于运气。我很想对他们说,你是否觉得C的运气很好?那你是否也像C那样在好运降临之前主动、认真、塌实地做好每一件事情?
其实,机会,并不是天上掉下来的馅饼,而是抓住机会的本事。当你历练出了抓住机会的本事,好运自然降临。 -
测试人员应该如何报bug【转】
2007-08-15 10:48:19
首先,确保你所发现的问题是确实是一个bug,不要出现因为测试人员操作错误或配置错误所引起的“bug”,这样会降低你在开发人员心中的可信度。在测试的时候,如果发现测试的实际结果与预期测试结果不符时,不要着急马上报bug,先想想为什么会出现错误。作为专业的测试人员,应该能够对出现的问题进行跟踪,确认了在配置、操作没有错误的前提下,通过追踪分析确认所测试的业务流程确实是存在bug,并能大概对bug的产生原因进行定位。测试人员,需要做到专业,尽量少给开发找麻烦,不要制造实际上并不存在的bug。
确认了所发现的问题是一个bug之后,按照测试步骤再执行一次,确保bug是可重现的而不是随机的。如果bug不能重现,应该尽量找到bug重现的规律,在一些比较难重现的问题可以找开发配合一起查找原因,如果还是无法重现则需要在bug report中对出现的问题描述清楚并说明出现的随机性。
接下来就是填写bug report了,在填写bug report的时候,最重要的是bug的标题和bug描述。在bug报告中,首先用一句话对bug进行简要精确的描述作为bug的标题,让开发或项目经理一看就知道存在什么问题,比如“XX模块在压力测试2小时后出现内存泄露”。而在bug的描述中,需要使用简明准确的语言描写出现bug的测试步骤、实际的测试结果、预期的测试结果和结论;也就是说描述导致出现bug的操作步骤是怎样,由测试步骤所做的操作引起的测试结果是什么,而预期的结果应该是怎样,并由实际结果与预期结果相对比说明问题所在。比如:“在管理网页新增用户,当新增的用户登录名名称很长(例如登录名长度为输入框允许的最大长度),按‘新增’按纽新增后系统提示已经有该用户存在,而事实上该用户并不存在,建议对超长的用户名进行处理。”
在测试人员发现了一个已隔离的,可重现的问题后,应该对问题进行归纳。同一个问题是否出现在其他的模块或其他的流程?同一个故障是否会引起更加严重的问题?如果存在,也需要提出来让开发一并处理。
在开发对bug进行修改之后,测试需要报着怀疑的态度认真地对问题进行验证,需要严格按照测试步骤来进行测试,检查开发是否已经正确修改了所出现的问题,以及开发对bug进行了修复之后是否会引进新的问题。不要相信开发说“已经修改好了,肯定没问题了”就不对问题进行细致的检查了,如果开发修改得不彻底,问题仍然会存在的,或者可能会由于开发在修改bug的时候忽略了另一些细节导致了新bug的出现。尽量不要在关闭bug之后,才发现这个问题还没有修改彻底;也不要出现bug关闭之后,出现了新的bug。
测试对bug进行验证确认已经修改ok之后,关闭bug。在关闭的时候,应该对Bug最终修改结果进行简要描述,如果bug的修改引起配置或数据库或业务流程的变更,也需要在bug关闭描述中进行说明。