6.1 创建一个基于脚本的UI测试套件结构
问题
如何创建一个基于脚本的Web UI测试套件结构,并通过自动化测试套件以编程的方式来操纵、同步并且检查待测的Web程序。
设计
创建一个有两个frame的HTML网页。一个frame包含待测程序,另一个frame包含测试脚本。主HTML网页包含用于同步的变量和测试场景的元信息。
方案
<html>
<head>
<script language="JavaScript">
var description = "Description of test scenario";
var loadCount = 0;
var pass = true;
</script>
</head>
<frameset cols="40%,*">
<frame src="TestCode.html" name="leftFrame">
<frame src="../TheWebApp/WebApp.aspx" name="rightFrame"
onload="leftFrame.updateState();">
</frameset>
</html>
注解
尽管可以通过好几种方法来组织基于脚本的Web UI测试套件,但是这里所给出的组织结构在实践中被证明是简单并且行之有效的。HTML测试套件的<script>部分有三个主要的变量。请注意,我们使用了language="JavaScript"这个attribute。在完全基于Microsoft的技术环境中,也可以写成“JScript”以强调我们是在使用IE DOM来访问Web页面的那些控件。第一个变量description,是用来表示测试场景的元信息的。我们也可以在这里包含其他的元信息,比如测试场景ID或者测试场景运行的日期和时间。第二个变量loadCount,是用来协助测试套件进行同步的。因为HTTP是一个无状态的协议(stateless protocol),所以每次“请求-响应”之间都是相互独立的。我们需要通过某种方法来知道Web程序处于哪种状态。最简单的办法就是使用一个全局变量,当这个变量为0时表示初始状态,为1时表示下一个状态(例如,用户单击submit按钮之后),等等依此类推。请注意观察,当待测的Web页面加载到右边的frame之后,程序的控制权传递给了updateState()函数,这个函数位于左边frame里包含测试代码的那个网页里:
onload="leftFrame.updateState();"
6.2节具体描述了updateState()函数。HTML页测试套件的第三个变量pass,用来表示测试场景通过与否。
在本方案中,HTML页测试套件包含两个frame:leftFrame和rightFrame。左边的frame占显示区域的40%。在这里,关于两个frame的宽度和它们的名称,并没有什么特别的用意。使用leftFrame和rightFrame作为名称,只是意味着你以某种特定的方式来组织这两个frame,但是经验显示,使用方位来表示frame的名称,比使用像frameWithWebApp和frameWithHarnessCode这样的功能描述性的名称,在可读性上要更好一些,尽管采取哪种命名方式只是个人的一种偏好。rightFrame包含的是待测程序,待测程序并不需要为了测试而进行改动。本章的这些技术既适用于传统的ASP Web程序,也同样适用于ASP.NET Web程序。leftFrame包含的是用于操纵待测程序的JavaScript代码。
在实施基于脚本的UI测试时,常见的一种错误是试图通过setTimeout()方法来暂停自动化测试的执行,从而实现事件同步。调用setTimeout()可以停止一个线程的执行。不幸的是,因为IE是在单线程的环境下执行的(除了极少数例外的情况),因此暂停自动化测试程序同样也会暂停待测程序。







