panama的bug分析

简介:

 panama项目,近期在完成基于eclipse插件的开发。在集成测试中发现,每次在执行tocase功能的过程中,本次记住了之前tocase的执行内容(会再次执行之前tocase的内容)。第一反应:程序中存在有状态的代码,例如static,这个反应最后证明也是正确的。

  调试分析:在eclipse中使用debug的方式启动eclipse插件程序(导入:import-> plug-ins and Fragments -> Directory选择eclipse插件项目;debug启动:plugin.xml -> debug as -> Eclipse Application)。发现问题发生在FileUtils类中获取目录以及子目录下面的所有文件,核心部分基本示意如下:

 
  1. static List<String> fileNameList = new ArrayList<String>(); 
  2. public static List<String> readfile(String filepath) throws FileNotFoundException, IOException { 
  3.        try { 
  4.            File file = new File(filepath); 
  5.            if (!file.isDirectory()) { 
  6.                fileNameList.add(file.getName()); 
  7.            } else if (file.isDirectory()) { 
  8.                String[] filelist = file.list(); 
  9.                for (int i = 0; i < filelist.length; i++) { 
  10.                    File readfile = new File(filepath + "\\" + filelist[i]); 
  11.                    if (!readfile.isDirectory()) { 
  12.                        fileNameList.add(readfile.getName()); 
  13.                    } else if (readfile.isDirectory()) { 
  14.                        readfile(filepath + "\\" + filelist[i]); 
  15.                    } 
  16.                } 
  17.  
  18.            } 
  19.        } catch (FileNotFoundException e) { 
  20.            e.printStackTrace(); 
  21.            System.out.println("readfile()   Exception:" + e.getMessage()); 
  22.        } 
  23.        return fileNameList; 
  24.    } 

这么简单直接的代码会有什么问题吗?确实有问题,它是有状态的。 当在同一个JVM里面多次调用的时候,fileNameList会记住之前的内容。这也就是产生有状态的根源。

  思考之后,发现递归是不能解决问题的,因为针对方法readfile的直接调用和递归调用对程序来说没有差别,也就意味着无法决定是什么时候重置fileNameList 的内容。思考之后阅读了apache io的代码,简单使用了一下,问题解决了。帮助文档:http://commons.apache.org/io/api-release/index.html?org/apache/commons/io/FileUtils.html,示例代码如下:

 
  1. public static Collection<File> readfile1(String filepath) throws FileNotFoundException, IOException { 
  2.         Collection<File> files = org.apache.commons.io.FileUtils.listFiles(new File( 
  3.                 filepath), new IOFileFilter(){ 
  4.  
  5.             @Override 
  6.             public boolean accept(File arg0) { 
  7.                 // TODO Auto-generated method stub 
  8.                 return true
  9.             } 
  10.  
  11.             @Override 
  12.             public boolean accept(File arg0, String arg1) { 
  13.                 // TODO Auto-generated method stub 
  14.                 return true
  15.             }}, new IOFileFilter(){ 
  16.  
  17.                 @Override 
  18.                 public boolean accept(File arg0) { 
  19.                     // TODO Auto-generated method stub 
  20.                     return true
  21.                 } 
  22.  
  23.                 @Override 
  24.                 public boolean accept(File arg0, String arg1) { 
  25.                     // TODO Auto-generated method stub 
  26.                     return true
  27.                 }} ); 
  28.         return files; 
  29.     } 

总结:

1、大胆的猜测,对问题的原因有基本的分析

2、Debug非常重要,有了基本的分析之后,启动debug进行跟踪,小心的求证,不要在之前猜测之外再去做胡乱的猜想。Debug是硬本领,一定要精通。

3、对基础类,写代码的时候一定要仔细再仔细,测试了再测试

4、多学习优秀的开源实现,例如apache、spring等开源社区的代码

 



本文转自 tianya23 51CTO博客,原文链接:http://blog.51cto.com/tianya23/664672,如需转载请自行联系原作者

相关文章
|
6月前
|
测试技术
无法复现的bug,如何处理?
无法复现的bug,如何处理?
474 0
|
6月前
|
测试技术 API
修改bug引入更多bug怎么办?
修改bug引入更多bug怎么办?
135 0
|
6月前
|
测试技术
如何高质量的做BUG分析
如何高质量的做BUG分析
217 0
|
SQL BI 数据库
记一次bug分析定位过程
其实很多时候,我们在测试过程中发现的很多bug,并不是由于开发人员编码能力不好,或者粗心大意造成,而是在项目开发实施过程中,没有遵循一些必要的项目流程,没有充分认识到质量的重要性;如果能做好这方面的工作,关注流程,而不是喊口号,人人重视质量,人人为结果负责,那么,会有很多问题、不只是bug,都将“被扼杀在摇篮里”......
记一次bug分析定位过程
|
Web App开发 关系型数据库 项目管理
|
测试技术
软件测试面试题:软件缺陷(或者叫Bug)记录都包含了哪些内容?如何提交高质量的软件缺陷(Bug)记录?
软件测试面试题:软件缺陷(或者叫Bug)记录都包含了哪些内容?如何提交高质量的软件缺陷(Bug)记录?
343 0
写Bug时,需要注意的几点3
写Bug时,需要注意的几点3
126 0
|
算法
写Bug时,需要注意的几点 02
写Bug时,需要注意的几点 02
112 0
|
运维 Cloud Native 测试技术
高质量的缺陷分析:让自己少写 bug
缺陷分析做得好,bug 写得少。阿里资深技术专家和你分享如何进行高质量的缺陷分析,总结了 5 个要点,通过缺陷分析消除开发中的各种盲点,打造一个学习型的团队。
高质量的缺陷分析:让自己少写 bug