1 现象
部署人员:我部署完后,一运行XX模块,总是弹出一堆错误信息。
开发人员:你把该配置的都配置了吗?
部署人员:我都配了呀!
开发人员:奇怪,不可能啊。那你看看系统提示什么?
部署人员:看不懂,我复制下来给你发过来吧。
开发人员:好的。
开发人员收到后错误信息后,从其中并看不到任何错误原因,不知道错误是出自哪个类,更不知道是是出自哪一行代码。无奈之下……
开发人员:哥们,我还是到现场来用源代码跟踪调试一下吧。不过我估计你肯定是什么配置信息没有配置全,要是让我测出来了,你得好好请我一顿!
部署人员:呵呵,我确认我都配置全了。
第二天,开发人员到达现场,用笔记本连上系统,打开源代码工程,加上断点,一句一句跟踪,最后发现在如下方法中:
public Manufactory getFirstManufactory(){
ManufactoryDao dao=new ManufactoryDao();
List<Manufactory> allManufactory=dao.getManufactorysByType(
Manufactory.MANUFACOTRY_TYPE_LIGHT_PLATFORM);
Manufactory manufactory=allManufactory.get(0);
//其他一些代码
//...
return manufactory;
}
allManufactory列表中一个元素也没有。于是……
开发人员:大哥,你骗人,你没有配置厂家信息!走,请我吃饭去!
部署人员:不可能!我打开数据库看看,哦……,的确是没有配置。不好意思……
后来,这样的场景又出现了很多次,团队成员之间的信任几乎没有了。部署人员嫌开发人员做出的程序问题多,而开发人员又嫌部署人员水平差、没记性。
2 谁的责任
2.1开发人员程序没有做完
看一下开发人员写的如下程序:
/**
* 此类演示了一个没有完成程序
* @author qujianfeng
*
*/
public class UndoneExample {
/**
* 获取第一个厂家信息。(该方法仅仅是一个示例,假设有这么一个类似的需求。)
* @return
*/
public Manufactory getFirstManufactory(){
ManufactoryDao dao=new ManufactoryDao();
List<Manufactory> allManufactory=dao.getManufactorysByType(
Manufactory.MANUFACOTRY_TYPE_LIGHT_PLATFORM);
Manufactory manufactory=allManufactory.get(0);
//其他一些代码
//...
return manufactory;
}
}
仔细看这块代码,其实程序根本就没有做完!只考虑到了正常流程。此程序能够正常运行是基于两个假设:
首先,此程序假设allEmployee不为null。当然这个我们可以通过编码标准进行约束:不能返回为null的集合对象,即使元素数为0,也应返回一个集合对象,只是size为0而已。
其次,此程序假设allEmployee的size>0。当忘记配置或者配置被从数据库中误删时,此程序将在“Manufactory manufactory=allManufactory.get(0)”这句代码处会抛出如下异常:
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
这样的异常信息即时在界面中显示出来,也没有任何帮助,应该给出更明确的提示信息。
有同志会这样修改如上程序:
public Manufactory getFirstManufactory(){
ManufactoryDao dao=new ManufactoryDao();
List<Manufactory> allManufactory=dao.getManufactorysByType(
Manufactory.MANUFACOTRY_TYPE_LIGHT_PLATFORM);
Manufactory manufactory=null;
if(allManufactory.size()>0){
manufactory=allManufactory.get(0);
}
//其他一些代码...
return manufactory;
}
当allEmployee的size为0时,若是没有在调用此方法的程序中做个判断进行提示。此程序的结果是:没有配置信息时,程序在运行时既没有正常运行,也没有报错。反正就是没有反应!这样,部署人员更无法知道原因!
既然此处的需求就是必须有光平台厂家的配置信息,那就在没有时直接给出一个明确的提示:
public Manufactory getFirstEmployee(){
ManufactoryDao dao=new ManufactoryDao();
List<Manufactory> allManufactory=dao.getManufactorysByType(
Manufactory.MANUFACOTRY_TYPE_LIGHT_PLATFORM);
if(allManufactory.size()==0){
throw new RuntimeException("没有配置光平台厂家信息!");
}
Manufactory manufactory=allManufactory.get(0);
//其他一些代码
//...
return manufactory;
}
现在,当忘记配置光平台厂家时,就可以给出一个明确的提示了,部署人员一看就知道问题出在哪了。部署人员再不会叫开发人员去现场调查了,整个世界清静了。
2.2 测试人员测试没有做完
这个当信息没有配置对时提示不明确的问题,不应该等到现场才发现,应该在测试阶段就测出来。测试人员肯定只测了正常流程,没有试着把厂家信息删掉后再测试一次,看系统有何反应,是否有容易理解、明确的提示信息。
Ø 尽量在部署前测试到位
开发人员发生上面那样的遗漏是有可能的,测试人员应该考虑到这种问题发生的可能性。测试人员的测试用例,应该全面,应把测试用例的全面性作为考核内容。另外,项目经理应该对测试用例进行检查,测试人员在认为自己工作完成后,然后在项目经理确认其测试用例及其测试结果都达到要求后,测试工作才算完成。
Ø 一旦发现问题,应及时完善程序,补上易于理解的提示信息
开发人员尽可能地不遗漏,测试人员尽可能地测出遗漏,但实际上不可能做到百分之百不遗漏。但是,如果在部署过程中或用户使用过程中,软件出现了错误,经过一番周折,发现程序对于错误并没有给出一个明确的提示,而是抛出了一段英文提示。此时,就应该尽快补上易于理解的提示信息,以免下次再被同样的问题困扰。测试人员有责任检查此工作是否完成,并在测试用例中补上遗漏的用例。
分享到:
相关推荐
按照尽早进行测试的原则,测试人员应该在需求阶段就介入,并贯穿软件开发的全过程。就测试过程本身而言,应该包含以s下几个阶段。 -测试需求的分析和确定。 -测试计划。 -测试设计。 -测试执行。 -...
- **开发环境与运行环境版本差异**:开发人员在安装了特定版本ArcGIS Engine的计算机上编写代码,但在其他计算机(通常是用户端)上运行时,这些计算机可能没有安装相同版本的ArcGIS Engine。 - **引用库版本不匹配*...
与开发人员在测试组环境多次重复以上步骤,发现11群的计次表话单有时正常,有时其出中继群号就为一个随机值,发生异常的频率比较高。为什么其它群的话单正常,唯独11群不正常呢?11群是四个群中最小的群,其中继计...
而将那些被认为“过时”或有功能缺失的浏览器下的测试工作安排在开发周期的最后阶段 渐进增强 一开始只构建站点的最少特性,然后不断针对各浏览器追加功能。先让网站能够正常工作于尽可能旧的浏览器上,然后不断为它...
这份规范不仅适用于C语言,也涵盖了C++,因此对于在华为或类似环境下进行系统级编程的开发人员具有重要参考价值。通过遵循这些规范,开发者可以确保代码的一致性,降低出错概率,并促进团队间的有效协作。 在C语言...
当Flash上传文件的时候,由开发人员预定义的Javascript事件会被定时触发以便来更新页面中的UI,同时还提供上传状态和错误信息。 选定的文件的上传和它所在页面、表单是独立的。每个文件都是单独上传的,这就保证了...
实施过程具体包括项目启动、组建队伍、设计、编码、测试、数据准备、软件安装、软件调试、项目试运行、二次开发、项目正式运行等众多环节。每一阶段都需要领导强有力推进和各方协调,否则会有中断、延时、超预算的...
PLSQL Developer是一款流行的PL/SQL语言开发工具,它允许开发者编写、测试和调试SQL语句和PL/SQL程序单元。然而,在进行数据库开发时,经常遇到的一个问题是不同位数操作系统与应用程序之间的兼容性问题,以及字符...
KMODE_EXCEPTION_NOT_HANDLED ***其中错误的第一部分是停机码(Stop Code)也就是STOP 0x0000001E, 用于识别已发生错误的类型, 错误第二部分是被括号括起来的四个数字集, 表示随机的开发人员定义的参数(这个参数对于...
因此,面向对象的编程语言使程序能够比较直接地反问题域的本来面目,软件开发人员能够利用人类认识事物所采用的一般思维方法来进行软件开发。C++语言是目前应用最广的面向对象的编程语言。 1-3 什么是结构化程序设计...