对于一个测试人员来说,发现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(); } |
测试之前可以先看下这段代码,在测试时可以先验证一下未登录,和没有白名单的场景,看看是否到对应的代码上。