停止循环的自定义代码“test.JumpOutLoop”, 将 CheckApply 的返回结果做为 JumpOutLoop 的输入参数:
清单 5. 自定义代码“test.JumpOutLoop”
public String exec(ITestExecutionServices tes, String[] args) { String result = args[0]; // if CheckApply is pass, break the loop if ("PASS".equals(result)) { tes.getLoopControl().breakLoop(); } return null; } |
该场景的测试调度如下:
图 5. 测试调度示例
通常这种存在着数据或逻辑的制约关系而且还必须由不同的用户执行的测试项之间的数据同步可以参考本节所介绍的方法。
3.3 通过自定义代码实现脚本执行情况监测
在脚本运行过程中,RPT 只能通过查看回放页面与录制页面的响应代号是否一致来判断是否回放成功,并不能检验数据是否正确。在持续性测试中,通常长时间运行的程序会对一些数据造成影响。为了更好的监控程序是否正常的运行,仅靠 RPT 提供的页面响应代号是不够的。我们需要实时地监控程序中处理的一些数据是否正确,因此需要添加一些自定义代码。下面是一段实例代码将一些重要的数据实时地写入自定义的日志文件中,以监控监脚本执行情况。
下面的例子中,有 2 个参数传递给该自定义代码的执行函数,分别是页面响应中的关键检测数据,此处为登录帐号(account)和该帐号剩余的工作项的数目。每次执行该测试项,就有一个或两个工作项数目减少,证明脚本正常执行即该登录帐户成功处理一个或两个工作项。
RPT 的持续性测试脚本中通常使用无限循环来执行相应的测试项组合。因此,在日志文件中,下面的代码段利用了 DataArea 记录下了当前循环的次数。同时通过 getScriptName 方法取到脚本的名称打印到日志当中。
清单 6. 利用了 DataArea 记录下了当前循环的次数
public String exec(ITestExecutionServices tes, String[] args) { ITestLogManager testlog = tes.getTestLogManager(); IDataArea dataArea = tes.findDataArea(IDataArea.VIRTUALUSER); String account = args[0]; String itemnumber = args[1]; String worklist = ""; // put loop count into DataArea String loopNumber = (String) dataArea.get(loopNumber_KEY); if (loopNumber == null) { loopNumber = "1"; } else { loopNumber = String.valueOf(Long.parseLong(loopNumber) + 1); } dataArea.put(loopNumber_KEY, loopNumber); // get script Name worklist = getScriptName(tes); // write running information to log logInfo(account, loopNumber, itemnumber, worklist, testlog); return null; } |
写入本地日志方法如下,其中还添加了时间戳信息:
清单 7. 在同一个用户的测试脚本上下文间传递信息
private void logInfo(String account, String loopNumber, String itemnumber, String worklist, ITestLogManager testlog) { FileWriter fw = null; try { fw = new FileWriter(runProgress, true); fw.write("[" + new Date() + "] User:" + account + " Loop Number:" + loopNumber + " WorkList:" + worklist + " Item Number:" + itemnumber + "\n"); fw.flush(); } catch (IOException e) { testlog.reportMessage("Write to " + runProgress + " error: " + itemnumber + "\n"); } finally { if (fw != null) { try { fw.close(); } catch (IOException e) { testlog.reportMessage("Write to " + runProgress + " error: " + e.getMessage()); } } } |
下面是运行该测试后得到的监控日志文件内容:
图 6. 测试结果日志文件示例
(查看大图)
3.4 通过自定义的代码来取代部分 RPT 的默认变量关联
通常持续性测试所使用的脚本不是在待测试软件的最新版本当中录制,但随着版本的更新,RPT 录制脚本往往会因为页面内容的变动导致已建立的数据关联关系失效而使脚本回放失败。此时,重新录制脚本并重新建立变量关联关系是一个繁琐的工作。下面介绍的方法是通过已有的脚本,用自定义代码来取代 RPT 设置的变量关联关系来使 RPT 脚本可以在新的 Build 当中成功回放。
下面是一个实例,脚本是某应用前一个版本录制的。由于版本变更,“ApprovePage”的主请求的响应和以前版本不一样,导致从该页面取得数据的关联失效。为了避免重录脚本,添加自定义代码“test.FetchInv”从“ApprovePage”主请求的响应中取得数据关联的数据,然后修改后面请求对该数据的关联。
原文转自:http://www.ibm.com/developerworks/cn/rational/r-cn-rptlongrun/index.html