一个老项目,差不多十年了,没有文档。 代码极其混乱,很多不用的东西在里面,现在想梳理整个代码,有没有什么比较好的方法? 这个项目是基于jsp+javabean的方式开发的,好像AOP那一套不行。最好是有什么工具,能通过一定时间的日志,检测到哪些jsp被访问(这个好像服务器本身可以提供),重要的是调用了哪些类以及类的哪些方法,除此之外,到了方法这一层,还需要进一步明确,因为有些方法的代码非常大,几万行,还需要在方法级别定位哪些分支在执行。

解决方案 »

  1.   

    junit先简单测试一下覆盖率。没覆盖的删掉看出不出错  
      

  2.   

    jsp的问题,可以自己写个filter,记录下所有访问的url。
      

  3.   

    不知道ClassLoader能不能提供相应的帮助,或者虚拟机监控方面
      

  4.   

    google "code coverage tools", "EMMA", "Cobertura", "Clover" ...
      

  5.   


    1、写测试用例基本上不大现实,因为系统本身有多少功能,基本上没有人说得清楚;
    2、系统是公司非常核心的一个系统,而且现在还需求不断,不能对业务造成影响;现在完全是打补丁的方式往上加,已有的代码不敢轻易修改删除,而且比较牛B的是,系统运行还是好好的,比较顺畅,但想实现新需求、修改原来的bug是极其痛苦。
      

  6.   

    添加一个filter
    filter把所有的请求输出到log里
    针对这个项目再来一遍黑盒测试
    然后就统计log吧
      

  7.   


    这些都是用于测试覆盖率的,对于这个项目而言,写测试用例基本上是不太可行的。
    1、基于JSP+javabean开发,很多代码写在jsp页面上;
    2、具体的项目有什么功能,没有人能说清楚的;
    3、业务是非常复杂的,而且业务需求是不断的过来,天天往上加;目前看来,只能根据url日志先看哪些jsp被访问,然后再分析每个jsp页面的代码进行人工判断。对于class可以通过jmap导出jvm堆图看哪些类被加载了。郁闷
      

  8.   


    这是一个业务很复杂的系统,就算是做黒盒测试,也没有办法把所有的业务场景测试到,因为经过这么多年的发展,人来人往,没有人能说得清楚了。
    统计到哪些jsp被访问不难,weblogic本身提供这样的日志记录,哪些类有用,通过jmap导出堆图也应该可以,但到了类之后,就不好处理了,一是没办法清楚哪些方法被调用,二是没办法清楚哪个比较大的方法的哪部分代码被调用
      

  9.   


    1、写测试用例基本上不大现实,因为系统本身有多少功能,基本上没有人说得清楚;
    2、系统是公司非常核心的一个系统,而且现在还需求不断,不能对业务造成影响;现在完全是打补丁的方式往上加,已有的代码不敢轻易修改删除,而且比较牛B的是,系统运行还是好好的,比较顺畅,但想实现新需求、修改原来的bug是极其痛苦。
    ----------------------------------------------------------------------------------
    1、你的这种情形,正是《重构-改善既有代码的设计》这本书,能大派上用场的时候呢?绝对的没错!
    2、有点不大理解的地方是:系统运行的好好的,怎么就不能写测试用例呢?这不正好么?
      

  10.   


    1、写测试用例基本上不大现实,因为系统本身有多少功能,基本上没有人说得清楚;
    2、系统是公司非常核心的一个系统,而且现在还需求不断,不能对业务造成影响;现在完全是打补丁的方式往上加,已有的代码不敢轻易修改删除,而且比较牛B的是,系统运行还是好好的,比较顺畅,但想实现新需求、修改原来的bug是极其痛苦。
    ----------------------------------------------------------------------------------
    1、你的这种情形,正是《重构-改善既有代码的设计》这本书,能大派上用场的时候呢?绝对的没错!
    2、有点不大理解的地方是:系统运行的好好的,怎么就不能写测试用例呢?这不正好么?
    写测试用例,你得清楚你的输入和输出,用户和开发人员对里面的业务都不清楚了,如何写?
    另外,很多业务逻辑是写在jsp中,这部分如何写测试用例?没有java类,都是在jsp中包括java代码来写的。
      

  11.   

    不就想知道哪些类用过么?log4j不行么?
      

  12.   

    装个findbugs和checkstyle,如果有用例,也顺便跑跑覆盖率来筛选掉一部分吧,应该能通过规则找到很大一部分没用的代码。楼主好运,十年的老项目啊,应该是个大坑!!!!
      

  13.   

    用btrace监控方法调用写到日志文件。
    在分析日志文件,获取调用频率等信息。
      

  14.   

    用aspectj倒是可以,而且JSP中的java代码也能切到,只是目前有一个小问题:
    public aspect World {
        pointcut greeting() : execution(* *.*(..));     after() returning() : greeting() { 
        
            System.out.println(" World!123"); 
        } 
    }如何在这个greeting()中获取运行的类和方法名称??
      

  15.   

    有了一些进展,用aspectj,可以统计出所有的类及调用的方法:
    import org.apache.log4j.*;
    import org.aspectj.lang.Signature;public aspect World {
    pointcut greeting() : execution(* *.*(..))&&!within(World);  //&&避免死循环 before() :greeting()  {
    Signature sig = thisJoinPointStaticPart.getSignature();
    Logger log = Logger.getLogger("aspectj");
    log.info(sig.getDeclaringType().getName() + "[" + sig.getName()+"]");
    }
    }
    ,目前还有一个问题就是,目前CVS上的代码与项目上的CLASS不能确定是否完全一致,如果把项目生产环境的全部反编译,是否会存在问题不好确定。 想到的一个方案是将当前的源文件编译后与生产上的CLASS进行比较大小,但因为编译环境不同(主要是jdk版本以及32位64位问题),可能会存在同样的代码编译后的结果大小不一样,如果同样的代码在不同的情况下编译出来的不一样,那问题可就有点麻烦了。