首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

一个智能的 Web 界面测试系统 -3 Selenium 在系统中的应用

一个智能的 Web 界面测试系统 -3 Selenium 在系统中的应用

Selenium 在系统中的应用自动测试模块式该系统的一个核心部分,它使用了 Selenium 这个工具。Selenium 是一款针对 Web 产品的测试工具。它根据测试脚本,向浏览器发出指令,代替人手工点击界面之苦。Selenium 有三类命令:动作命令(Action)、辅助命令(Accessor)、断言(Assertion)。动作命令可以向应用程序发出指令,比如点击按钮;辅助命令检查当前应用程序的状态并保存于变量中;断言类似于单元测试中经常使用的 Assert 方法,但是在 Selenium 中还有许多结合 Xpath 获取元素属性的方法。
通过这些命令,用户可以方便地实现对网页的各类操作、定位网页上面的元素并判断元素的值。此外,Selenium 有两个主要的运行模式:Selenium Core 和 Selenium Remote Control。
Selenium Core 将测试用例以 Iframe 形式嵌入一个 TestRunner 页面(参见图 5),然后将它们上传到和应用程序一起的 Web 服务器端。用户可以使用右上角的 Selenium  TestRunner 控制模块来操作测试脚本,获得测试结果。
图 5. Selenium Core 实例Selenium Remote Control 更加适合测试复杂的基于 Ajax 技术的应用程序。它提供一个 Selenium Server 服务器,作为应用程序客户端的代理向应用程序的服务器端发送请求(参见图 6)。在这种模式下,测试人员可以编写一些测试脚本来完成一些复杂的测试。
图 6. Selenium Remote Control 原理与 IBM 的 Rational Functional Tester 工具相比,Selenium Remote Control 有三个主要特点:
  • Selenium 基于 Http 协议来实现。它根据测试脚本提供的 Xpath 定位网页上面的元素并对其进行操作,就如我们通常使用绝对和相对路径查询操作系统文件一样;IBM 的 Rational Functional Tester 则基于对象模型设计实现的。它抓取浏览器在屏幕上实时展现的对象集合,根据用户输入的元素属性在上面寻找可能的对象。实践证明,当页面非常复杂时,这个方法不精确高效。
  • Selenium 是一个开源项目,可编写测试脚本的 API 包支持好几种语言,包括 Java, C++, .Net, Python 等;IBM 的 Rational Functional Tester 需要 license,并且只支持 Java。
  • Selenium 在运行时使用 JavaScript 向应用程序发出测试命令,所以它对当前浏览器的位置和电脑的屏幕没有要求;IBM 的 Rational Functional Tester 需要获得当前浏览器和电脑屏幕的位置,要求屏幕始终打开。这需要人围的支持,提高项目开发的成本。
本测试模块运用 Selenium Remote Control 的模式,新建了一个 Java 项目,编写了一系列 Java 的测试脚本。项目的目录结构参见图 7。
图 7. 测试源代码文件结构该项目结构类似于普通的 Java 项目。其中,我们导入了运行 Selenium Remote Control 所需的 jar 包。另外,build 目录下的 test-output 是每次运行后测试报告生成的地方。文件 build.xml 中定义了很多 Ant 的任务,用来编译和运行测试脚本。
下面是一个测试脚本的事例,它将一个集群加入管理服务列表。Selenium 的测试脚本类似于一般的 Junit 测试用例。首先,需要新建一个 Selenium 的会话。这个会话需要的参数包括 Selenium 代理服务器的地址(selenSrvrAddr)、端口(4444)、需要测试的 Web 应用的服务器地址(bpath)以及 Web 应用在服务器上面的相对路径(appPath)。然后,定义具体方法,对应用程序进行操作。比如在下面事例中使用 Open 函数打开页面,选择页面上面的一系列 Frame(这里给出 Frame 的 name 就可以,因为它在页面上是唯一的),然后点击链接(这个链接通过属性 Link 来定位的)。最后,记得关闭这个会话。
清单 6.测试脚本事例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import org.TestNG.annotations.AfterClass;
import org.TestNG.annotations.BeforeClass;
import org.TestNG.annotations.Parameters;
import org.TestNG.annotations.Test;

import com.thoughtworks.selenium.DefaultSelenium;
import com.thoughtworks.selenium.Selenium;

public class TestClusterAddPage {
private Selenium driver = null;

@Parameters({"selen-svr-addr", "brwsr-path", "aut-addr"})
@BeforeClass
private void init(String selenSrvrAddr, String bpath, String appPath){
driver = new DefaultSelenium(selenSrvrAddr, 4444, bpath, appPath);
driver.start();
}

@Parameters({"cluster-ip", "cluster-username", "cluster-pwd"})
@Test
public void testAddCluster(String ip, String username, String password){
driver.open("/ica/Login");
driver.selectFrame("rootFrame");
driver.selectFrame("consoleWorkAreaFrame");
driver.selectFrame("rootFrame");
driver.selectFrame("consolePortfolioFrame");
driver.selectFrame("taskEntriesFrame");
driver.click("link=Clusters");
… ..
}

@AfterClass
private void stop(){
driver.stop();
}
}




从以上事例可以看出,Selenium 在定位页面上元素时比较随机。有时可以使用元素的 name 属性,有时可以使用元素的 id 属性。为此,项目组可以为客户端页面上的元素定义唯一的属性,方便 Selenium 测试。
使用 Selenium Remote Control 模式需要在运行脚本前后启动和停止 Selenium Server 服务器。这里我们在 build.xml 中定义了一个任务名为 start-selenium。该任务第一步就是启动 selenium server 服务器,第二步是调用 TestNG 配置的测试脚本,最后是停止 selenium server 服务器。整个流程比较清晰明了(参见以下代码)。
清单 7.Selenium 流程
1
2
3
4
5
6
7
<target name="start-selenium">
<java jar="lib/selenium-server-1.0-beta-2/selenium-server.jar" fork = "true"
spawn = "true"/>
<Antcall target="run-task-jar"/>
<get dest="${test.output}/results.txt"
src="//localhost:4444/selenium-server/driver/?cmd=shutDown" />
</target>

返回列表