使用 Selenium 实现基于 Web 的自动化测试

(转自http://www.ibm.com/developerworks/cn/web/1209_caimin_seleniumweb/index.html)html

Selenium 是一个用于 Web 应用程序测试的工具。Selenium 的测试用例直接运行在浏览器中,就像真正的用户在操做同样。与主流的 web 自动化测试框架还有 QTP,基于 Ruby 的 WATIR 等相比,Selenium 支持 IE、Mozilla Firefox 多种浏览器,支持自动录制脚本以及 Java、c#、ruby 等多种运行语言的自动生成,用例制做快捷,运行快速。相比起来 Selenium 要显得更为灵活实用。java

Selenium 的主要功能包括:web

1)测试与浏览器的兼容性:测试应用程序可否兼容工做在不一样浏览器和操做系统之上。chrome

2)测试系统功能:录制用例自动生成测试脚本,用于回归功能测试或者系统用例说明。express

简而言之,Selenium 就是一款能够录制用户操做,帮助 Web 测试人员简化重复劳动的工具。apache

目前为止 Selenium 有两种版本:编程

  • Selenium 1(Selenium RC,Remote Control):传统 Selenium 框架,支持多种编程语言脚本生成。但须要启动一个代理 Server 来处理用户与测试 Server 之间的通信。
  • Selenium 2(Selenium Webdriver):全新自动化接口,突破了 Selenium 1 的一些限制,剔除了中间 Server,但因为写这篇文章为止自动生成脚本工具对 Selenium 2 的支持还很差,适合熟悉 Selenium API 的手写 case 测试人员使用。

阅读本文读者能够学习到如下技能:c#

  • 了解 Selenium 自动化测试框架的基本概念。
  • 学会搭建应用 Selenium 自动化测试框架的环境。
  • 搭建一个自集成的测试容器以持续测试 Selenium 测试用例。

本文着重介绍传统 Selenium 1 的原理及使用方法。接下来让咱们看看 Selenium 是如何调用录制脚本并实现自动测试的。浏览器

Selenium 1 实现原理

Selenium 引入了 Remote Control Server 这样一个代理 Server,JavaScript 脚本注入和与 Server 通信都经过这个代理 Server 来进行。以下图所示:ruby

图 1. Remote Control 模式运行流程
图 1. Remote Control 模式运行流程

之因此引入这个代理 Remote Control Server 是由于“同源策略”的限制,经过这个代理服务器来“欺骗”远程 Server,达到使其觉得是从同一个地方 load 代码以正确返回请求数据的效果。

流程说明:

  1. 客户端创建与 selenium-RC server 的链接。
  2. Selenium RC Server 启动一个浏览器(或是已经使用中),并注入 JS 代码
  3. 将 Selenese 代码传到客户端的 Selenium-Core 中。
  4. Selenium-Core 翻译并解析执行用户录制的操做。
  5. 让代理 Server 进行通信
  6. Remote Control Server 负责跟远程 Web 应用服务器进行通信。
  7. 操做完成,显示结果,并执行下一指令。

以上就是 Selenium Remote Control 的执行原理,接下来的章节中将一步步以图例加说明的方式快速说明如何使用 Selenium 来录制脚本,导入 Java 工程,而后按期维护工程。


使用 Selenium 实现自动化测试

使用 Selenium IDE 录制用户操做

Selenium IDE 是一个基于 Firefox 的插件,用户能够在经过这个插件将客户端操做录制成脚本并导出为 Java、c#、Ruby 等多种运行语言以便统一管理测试用例。

下载 FireFox: 推荐 Firefox 5.0 以上,目前 Selenium IDE 只提供 Firefox 的插件。

下载 Selenium IDE:http://seleniumhq.org/download/

安装插件:

Tools --> Add-ons --> 将下载的 selenium-ide-1.x.xpi 文件拖入对话框便可安装。

安装后能够启动 IDE 插件查看是否安装成功。

图 2. 启动 Selenium IDE 插件
图 2. 启动 Selenium IDE 插件

安装后,以 IBM Systems Director 产品为例,说明如何实现“用户登陆”这个测试用例。

  1. 点击录制按钮 以下图 3 中的 1
  2. 录制过程当中,登陆用户界面,输入用户名密码。以下图 4
  3. 而后能够经过是否包含某些字符串来验证是否登陆成功。若是下图 5
  4. 回到登陆 IDE 界面,查看已录制步骤 如图 3 中的 2
  5. 在 IDE 界面中能够验证录制的脚本,必要时回到第四步,如图 3 中的 3

在 IDE 中重运行录制的脚本经过就说明脚本没问题,能够用于测试用例代码导出了。

图 3. Selenium IDE 录制窗口
图 3. Selenium IDE 录制窗口
图 4. 录制过程当中,输入用户名密码
图 4. 录制过程当中,输入用户名密码
图 5. 经过确认是否包含某些文字来验证是否成功登陆
图 5. 经过确认是否包含某些文字来验证是否成功登陆

使用 Selenium IDE 导出 JUnit 测试用例

在 Selenium IDE 中执行成功后,就能够把测试脚本导出成 JUnit 测试用例了,如图 6 所示:

图 6. 导出 JUnit 代码
图 6. 导出 JUnit 代码

导出用例以下:

清单 1. VerifyLogin.java
 import com.thoughtworks.selenium.*; 
 import org.junit.After; 
 import org.junit.Before; 
 import org.junit.Test; 

 public class VerifyLogin extends SeleneseTestCase { 
 @Before 
 public void setUp() throws Exception { 
     selenium = new DefaultSelenium("localhost", 4444, "*chrome", "localhost:8422/"); 
     selenium.start(); 
 } 

 @Test 
 public void testVerifyDirectorLogin() throws Exception { 
     selenium.setTimeout("300000"); 
     selenium.open("/ibm/console/logon.jsp"); 
     selenium.type("id=j_username", "test"); 
     selenium.type("id=j_password", "test"); 
     selenium.click("id=other"); 
     selenium.waitForPageToLoad("300000"); 
     verifyTrue(selenium.isTextPresent("IBM Systems Director")); 
 } 

 @After 
 public void tearDown() throws Exception { 
    selenium.stop(); 
   } 
 }

说明:首先实例化一个 DefaultSelenium 对象,传入的参数分别是 RC 服务器 IP、端口、浏览器类型和待测试的 Server 的信息。而后在测试方法里调用 Selenium 1 的 API,这里的代码彻底由 IDE 生成,就为咱们省去了不少重复代码工做。

运行测试用例:

有了基于 JUnit 的运行测试用例就能够把它导入到 Java IDE 中执行测试了。执行中既须要客户端驱动支持(用于 Eclipse 编译),也须要启动 RC Server:

Selenium RC Server 下载:http://seleniumhq.org/download/

Selenium Client Driver:http://seleniumhq.org/download/

执行命令 java –jar selenium-server-standalone-2.5.0.jar 启动 Selenium RC Server:

图 7. 启动 Selenium RC Server
图 7. 启动 Selenium RC Server

启动后就能够直接在 Eclipse 中运行测试用例,RC Server 就会启动新窗口并自动按照录制脚本进行测试。并可在 Eclipse 中查看运行结果。

下面让咱们看看怎样脱离 Eclipse 本身搭建一个能够持续测试的容器。

构建 JUnit 测试容器以持续测试 Selenium 的测试用例

咱们搭建的这个容器能够检测某个文件夹里全部的测试用例自动运行 JUnit 代码进行测试。若是须要还能够将这个容器合并到持续集成环境里,以达到不间断持续功能性测试的需求。

在这里咱们会用到 Ant 工具。能够在这里下载:

Ant 下载:http://ant.apache.org/

基础架构

图 8. 基于 Selenium 的 JUnit 的测试容器架构图
图 8. 基于 Selenium 的 JUnit 的测试容器架构图

能够看见测试人员的工做如紫色箭头所示,而自动化工做如蓝色箭头所示。

这套框架的意义在于,它能自动识别测试用例,并读取配置文件以测试套件运行不一样的测试用例。它还能够被合并到项目持续集成软件中,按期地持续进行基于 Web 的功能性测试,并将报告以邮件形式通知管理人员。

说明:

  1. 由测试人员录制脚本并导出 JUnit。
  2. 测试人员修改配置文件,将测试用例包含在测试套件中。
  3. 合并在持续集成软件后,框架会按期检测配置的测试套件
  4. 逐个加载测试用例。
  5. 以测试套件为单位其执行全部测试用例。
  6. 执行完成后将测试套件的结果报告以邮件形式通知管理人员

实现这套框架最关键的当属 Ant 执行脚本了,也是程序执行的入口。这里列出 Ant 的运行脚本,以供读者参考:

清单 2. Build.xml
如下为部分重点内容,会在后面加以说明。完整的 build.xml 请查看附件。
 <?xml version="1.0" encoding="UTF-8"?> 
 <project name="automationtesting" default="run" basedir="."> 
 ……
 <!-- 调用 Junit task 运行测试用例-->
 <mkdir dir="${xml}/${var}" /> 
 <junit printsummary="yes"> 
 <classpath> 
 <fileset dir="${lib}"> 
 <include name="**/*.jar" /> 
 </fileset> 
 <pathelement path="${classpath}" /> 
 </classpath> 
 <batchtest todir="${xml}/${var}"> 
 <filelist refid="casesToBeRunning"></filelist> 
 <formatter type="xml" /> 
 </batchtest> 
 </junit> 
……
 <!-- 调用 Junitreport task 生成报表-->
 <junitreport todir="${reports}"> 
 <fileset dir="${xml}/${var}"> 
 <include name="TEST-*.xml" /> 
 </fileset> 
 <report id="${var}_Report" format="noframes" todir="${reports}/html"> 
 <param name="TITLE" expression="Automation Testing Results for ${var}" /> 
 </report> 
 </junitreport> 
……

 <!-- 调用 mail task 发送邮件-->
 <mail mailhost="xx.xx.xx.xx" subject="${reportResult} Result for TestSuite: ${var}"> 
 <from address="AutomationTestTool" /> 
 <to address="xxxx@cn.ibm.com" /> 
 <message mimetype="text/html" src="${reports}\html\Testsuite-report-${var}.html"> 
 </message> 
 <fileset dir="${reports}\html"> 
 <include name="Testsuite-report-${var}.html" /> 
 <include name="Testcase-reports-${var}.zip" /> 
 </fileset> 
 </mail> 
 </project>

说明:程序的入口是 Run task,在 Run task 里先是编译整个工程,而后读取 TestSuites.xml 配置文件,循环执行每个测试套件。过程当中,以此执行如下操做:

  • 读取配置的而且实现 TestCase 的 Java 类;
  • 调用 Ant 的 junit task 执行测试用例;
  • 调用 Ant 的 junitreport task 生成报表;
  • 调用 Ant 的 mail task 发送报表到指定邮箱。
清单 3. TestSuites.xml 配置文件样例
 <TestSuites> 
 <TestSuite enable="false" id="DiscoverTestSuite"> 
 <Testcase>VerifyLogin</Testcase> 
 <Testcase>DiscoverDevice</Testcase> 
 </TestSuite> 
 <TestSuite enable="true" id="DeleteDeviceTestSuite"> 
 <Testcase>VerifyLogin</Testcase> 
 <Testcase>DeleteDevice</Testcase> 
 </TestSuite> 
 </TestSuites>

说明:配置文件中定义了两个测试套件,第一个包含了 2 个测试用例,先 Login 再发现设备。第二个也包含了 2 个测试用例,先 Login 再删除设备。而第一个测试套件 enable=false 将不被执行。

到此为止,一个简单的可持续测试框架就已经搭建完毕,来运行下看看结果吧

运行测试组建

用 ant 命令执行 Build.xml 便可运行测试框架。

图 9. 工具运行时
图 9. 工具运行时

执行完成后就会将全部测试用例的结果以报告形式发送邮件到指定邮箱。

图 10. 报告式样
图 10. 报告式样

结束语

本文首先介绍了 Selenium 以及 Selenium 1 的实现原理。紧接着用一个 Login 的简单例子讲述了如何去搭建 Selenium 运行环境,并将其导出为 JUnit 代码。最后构建了一个基于 Ant 的自动化测试 Selenium 框架,持续地对生成的 JUnit 测试用例进行管理以及功能性测试。读者也能够借鉴该脚本搭建本身的轻量级的单元测试框架。

目前主流的 web 自动化测试框架还有 QTP,基于 Ruby 的 WATIR。与这些框架相比,Selenium 支持 IE、Mozilla Firefox 等多种浏览器,同时支持自动录制脚本以及 Java、C#、Ruby 等多种运行语言的自动生成,测试用例制做快捷,运行也比较快速。对于较为轻量级相比起来 Selenium 要显得更为灵活实用。Selenium 不只用于功能性测试及回归测试,同时也可用于 Web 可视化验收测试。更多的,Selenium 可集成在诸如 Cruise 持续集成软件中,为总体项目提供更大集成测试范围。

相关文章
相关标签/搜索