字号: 小 中 大 |
推荐给好友
上一篇 |
下一篇
AJAX 技术下软件测试自动化的实现方法
发布: 2009-4-17 15:20 |
作者: James McCaffrey |
来源:
测试时代采编 |
查看: 98次 | 进入软件测试论坛讨论
ant: normal; text-transform: none; padding-bottom: 7px; line-height: 16px; color: rgb(51, 51, 51); ">我检索具有 ID“comments”的 <文本区> 元素的当前内容,将换行字符和新注释文本附加到当前内容中,然后使用更新的注释集替换 <文本区> 内容。这不是一种高效的方法,但在小型
测试自动化软件中,简洁往往要比效率更重要。
step1 函数开始处理待测试的 AJAX Web 应用程序:
function step1()
{
logRemark("单击“北”,等待“2”");
asyncCall(clickNorth, checkImageSrc, "2", step2, polling);
}
记录注释后,我调用 asyncCall 函数,该函数是
测试自动化的关键所在。该调用在这里表示:调用函数 clickNorth,然后进行 delay 循环直到 checkImgSrc("2") 返回 true 为止,在两次检查之间暂停 200 毫秒,然后将控制权转至函数 step2。如果调用 delay 循环的次数超过 10 (maxTries) 次,则会将控制权转至 finish 函数。
clickNorth 函数非常简单:
function clickNorth()
{
var btnNorth = parent.rightFrame.document.all["Button1"];
if (!btnNorth) throw "未找到 btnNorth";
btnNorth.click();
}
我使用 Internet Explorer DOM 来获得对 Button1 控件的引用,然后调用该控件的 click 方法。请注意,由于自动化软件位于一个框架中,而 AJAX 应用程序位于另一个框架中,为了从
测试脚本访问应用程序上的控件,因而我必须使用 parent 关键字来“上升”一个级别,然后使用应用程序容器的框架 ID。我喜欢使用 document.all 集合来获得对网页控件的引用,而我的一些同事则更喜欢使用 getElementById 方法,如下所示:
var btnNorth = parent.rightFrame.document.getElementById("Button1");
checkImageSrc 函数可告知自动化软件有关异步响应更新待测试 AJAX 应用程序上的 Image1 控件的时间:
function checkImageSrc(target)
{
try
{
var s = parent.rightFrame.document.all["Image1"].src;
return s.indexOf(target) >= 0;
}
// 尚未装载 Image1 的陷阱案例
// logRemark("CheckImageSrc() 中存在错误: " + ex);
catch(ex) { return false; }
}
通常,我只检查 Image1 控件的 src 属性,以此来确定该属性是否包含目标字符串。例如,如果图像的 src 属性包含“2”(如在 map 2 的文件名“~/2.jpg”中),则当调用 checkImageSrc("2") 时将返回 true。在编写您自己的 AJAX 自动化软件时,您必须创建适当的 check 函数。例如,假设 Web 应用程序要更新具有 ID“TextBox1”的 TextBox 控件。一个可能的 check 函数为:
function checkTextBoxValue(target)
{
try
{
var s = parent.rightFrame.document.all["TextBox1"].value;
return s.indexOf(target) >= 0;
}
// 尚未装载 TextBox1 的陷阱案例
// logRemark("checkTextBoxValue() 中存在错误: " + ex);
catch(ex) { return false; }
}
请注意 checkImageSrc 函数中的 try/catch 块。与大多数情况下将 try/catch 用来捕获异常错误条件不同,在这里我将 try/catch 用作标准函数逻辑的一部分。其间的思路是在重新绘制网页期间,用户无法获得对 Image1 控件的引用,而任何尝试获得对 Image1 控件的引用的操作都将引发异常。这并不一定意味着 Web 应用程序的状态不正确,而仅表明该应用程序处于未完成状态,因而我希望系统捕获异常并返回 false。通过取消对 logRemark 调用的注释并将轮询时间设置得非常短(如 10 毫秒)可观察该行为。