对于一个测试人员来说,发现bug不是难的,定位bug的 root cause 却是比较困难的,特别是哪些隐藏在代码中比较深的bug,以下是我的一些快速定位bug的心得,希望可以抛砖引玉。

  要定位问题,首先要熟悉代码,我觉得熟悉代码的两个有效的方式是:

  (1)本地运行

  (2)接口测试

  (3)Debug代码

  拿到被测应用后,第一步是把开发的代码的svn地址拿过来,check out到本地,能在IDE里面run起来,在淘宝有一个比较好的eclipse插件 叫 HSF Jetty插件,可以比较快速的把开发代码跑起来。

  插件地址:http://tools.taobao.net/site/store/product_detail.htm?product_id=65

  拿到开发代码以后,对代码中的核心接口可以写一些接口测试脚本,写脚本有几个好处,一个是提高测试深度,二是可以持续集成测试,三是可以熟悉代码,了解每个接口的功能和逻辑。

  如果你没有时间去写详细的接口测试脚本,那么Debug代码我认为是熟悉代码快,简单的方式之一,另外一种比较简单的方式是走读代码,但是相对来说难度比较大,debug代码是从页面操作为入口,看每一个操作会进入到哪段代码。

  在测试执行的时候如果发现了bug,首先去看下相关的代码,逻辑是否正确。

  下面说说整个的一个过程:

  加入我测试的页面是admin.uz.daily.taobao.net/siteAdmin.htm 这个页面,在淘宝大部分是webx工程,那么对应的类应该SiteAdmin.java

  在eclipse 中可以直接通过Crtl + shift + R 快捷键打开资源,找到对应的文件。这里放部分代码:


long loginUserId = super.getUserId();
/*


  可以看出这里是处理登录的。如果没有登录跳到登录页面


*/
 
       if (loginUserId <= 0) {
           super.goLoginPage(nav);
           return;
       }
 
/*


  可以看出这里是处理白名单的,如果不在白名单则跳到


*/
       boolean isSuperUser = whiteListAuthorityAO.isSuperUser(loginUserId);
       if (!isSuperUser) {
           super.toError(nav, "对不起,你没有权限");
           return;
       }
       TurbineRunData rundata = TurbineUtil.getTurbineRunData(request);
       HttpServletResponse response = rundata.getResponse();
       PrintWriter out = null;
       try {
           out = response.getWriter();
           if (uid == null || opt == null) {
              out.println("Usage:http://"
                     + configInfoManager.getDaogouHost()
                     + "/admin/SiteAdmin.do?uid=%userId%&opt=[onLine|offLine]");
              return;
           }
           long userId = Long.parseLong(uid);
           TaeSiteDO site = siteManager.getTaeSite(userId);
           if (site == null) {
              out.println("模板站点不存在,用户ID:" + userId);
              return;
           }
           if (opt.equalsIgnoreCase("offLine"))
              site.setStatus(0);
           else if (opt.equalsIgnoreCase("onLine"))
              site.setStatus(1);
           siteService.saveOrUpdateDomain(site);
           out.println("模板站点已更新,状态:" + site.getStatus());
           String nick = getUserNick(userId);
           whiteListAO.remove(nick, super.getUserNick(),
                  Constants.DG_WHITE_LIST_TEMPLATE_TYPE);
           out.println("已从模板站点白名单中删除:"+nick);
       } catch (IOException e) {
           throw new WebxException(e);
       } finally {
           if (out != null)
              out.close();
       }


  测试之前可以先看下这段代码,在测试时可以先验证一下未登录,和没有白名单的场景,看看是否到对应的代码上。