字号: 小 中 大 |
推荐给好友
上一篇 |
下一篇
AJAX 技术下软件测试自动化的实现方法
发布: 2009-4-17 15:20 |
作者: James McCaffrey |
来源:
测试时代采编 |
查看: 100次 | 进入软件测试论坛讨论
ant: normal; text-transform: none; padding-bottom: 7px; line-height: 16px; color: rgb(51, 51, 51); ">此外,您还可使用
JavaScript 的匿名函数功能,并编写下列代码:
window.setTimeout(
function(){delay(checkFunc, arg, callback, pollTime);},
pollTime);
由于删除了单引号字符和字符串连接,因而此类代码比非匿名代码要略显简洁一些。另外,它的效率比非匿名代码略胜一筹,因为非匿名代码要求浏览器创建新的脚本环境来处理该脚本。但如果没有使用单引号字符来分隔传递给 checkFunc 的 arg 参数,则无法明显表示 arg 是按值进行传递的(尽管简单的注释可避免发生任何可能的误解)。
Delay 内部
下面介绍 asyncCall 的合作伙伴 delay 函数:
function delay(checkFunc, arg, callback, pollTime)
{
++numTries;
if (numTries > maxTries) finish();
else if (checkFunc(arg)) callback();
else window.setTimeout("delay(" + checkFunc + ", " + "'" + arg +
"'" + ", " + callback + ")", pollTime);
}
delay 函数接受四个参数,这些参数与进行传递以调用 asyncCall 函数的最后四个参数完全对应。
在 delay 内部,我首先递增全局 numTries 计数器。我们知道,在上文中我使用该计数器来跟踪进入 delay 函数的次数,或换言之,我检查 Web 应用程序状态的次数,以判断异步响应是否已完成。如果全局计数器的读数大于全局常量 maxTries,则或是
服务器端的 Web 应用程序超时,或是 XMLHTTP 响应不正确,因此,我将控制权转至 finish 函数,以确定具体情况。
如果 delay 未超时,我便会调用 checkFunc 函数来测试用来指示正确响应的条件是否为 true。如果 checkFunc 返回 true,我便可调用 callback 函数以继续执行
测试方案。但如果 checkFunc 函数返回 false,我便需继续等待,因此我将再次调用内部 setTimeout 函数,该函数将在等待 pollTime 毫秒后再次调用 delay。
delay 函数不是完全递归函数,因为它无法直接调用它自己,但它是自引用函数,因为它通过 setTimeout 函数间接调用它自己。实际效果是产生一个等待循环,该循环或将控制权转至 finish 函数(如果超过了 delay 循环中的最大次数),或将控制权转至 callback 函数(如果某 Web 应用程序状态变为 true)。这种方法会使人产生一种山重水复疑无路,柳暗花明又一村的感觉。当然,其他方法也能解决上述问题,但实践证明该方法的确简单高效。
如同在 asyncCall 函数中一样,您不必使用指定的函数参数来调用 window.setTimeout 函数,而是可以使用匿名函数功能,如下所示:
window.setTimeout(
function(){delay(checkFunc, arg, callback);},
pollTime);
构建测试页
处理了 asyncCall 函数和 delay 函数后,现在我便可开始构建测试方案页面了。图 5 介绍了测试方案的整体结构。
Figure 5 测试方案结构
测试方案页面 <正文> 部分仅包含一个标题、一个要显示注释且具有 ID“comments”的文本区,以及一个用于启动自动化的按钮控件。<标题> 部分包括我的所有 JavaScript 代码。我声明并初始化全局常量 maxTries 以指定要进入 delay 函数的最大次数,并检查可表明异步响应已完成的条件。全局变量 numTries 跟踪进入 delay 函数的次数。全局常量 polling 设置对 delay 函数进行两次连续调用之间的延迟时间。
根据待测试的 AJAX Web 应用程序的复杂度,您可能需要修改 maxTries 和 polling 的值。在这里,10 次调用(将 200 毫秒作为两次调用之间的延迟时间)仅用时 2 秒,Web 服务器可能无法在如此短的时间内处理 XMLHTTP 请求并将响应返回至客户端。
测试方案首先调用 runTest 函数:
function runTest()
{
try
{
logRemark("测试方案 001");
logRemark("开始测试运行\n");
step1(); // 从 5 开始,将 N 转至 2
}
catch(ex) { logRemark("致命错误: " + ex); }
}
}
我所做的是使用程序定义的 logRemark 函数在工具正文的 <文本区> 中显示两条消息,然后将控制权转至 step1 函数。我将代码封装到简单的 try/catch 块中,以便在测试运行期间出现任何例外时都能激起并捕获这些代码。我的 logRemark 函数非常简单:
function logRemark(comment)
{
var currComment = document.all["comments"].value;
var newComment = currComment + "\n" + comment;
document.all["comments"].value = newComment;
}