使用 Selenium 实现基于 Web 的自动化测试
(转自http://www.ibm.com/developerworks/cn/web/1209_caimin_seleniumweb/index.html)
Selenium 是一个用于 Web 应用程序测试的工具。Selenium 的测试用例直接运行在浏览器中,就像真正的用户在操作一样。与主流的 web 自动化测试框架还有 QTP,基于 Ruby 的 WATIR 等相比,Selenium 支持 IE、Mozilla Firefox 多种浏览器,支持自动录制脚本以及 Java、c#、ruby 等多种运行语言的自动生成,用例制作快捷,运行快速。相比起来 Selenium 要显得更为灵活实用。
Selenium 的主要功能包括:
1)测试与浏览器的兼容性:测试应用程序能否兼容工作在不同浏览器和操作系统之上。
2)测试系统功能:录制用例自动生成测试脚本,用于回归功能测试或者系统用例说明。
简而言之,Selenium 就是一款可以录制用户操作,帮助 Web 测试人员简化重复劳动的工具。
目前为止 Selenium 有两种版本:
- Selenium 1(Selenium RC,Remote Control):传统 Selenium 框架,支持多种编程语言脚本生成。但需要启动一个代理 Server 来处理用户与测试 Server 之间的通讯。
- Selenium 2(Selenium Webdriver):全新自动化接口,突破了 Selenium 1 的一些限制,剔除了中间 Server,但由于写这篇文章为止自动生成脚本工具对 Selenium 2 的支持还不好,适合熟悉 Selenium API 的手写 case 测试人员使用。
阅读本文读者可以学习到以下技能:
- 了解 Selenium 自动化测试框架的基本概念。
- 学会搭建应用 Selenium 自动化测试框架的环境。
- 搭建一个自集成的测试容器以持续测试 Selenium 测试用例。
本文着重介绍传统 Selenium 1 的原理及使用方法。接下来让我们看看 Selenium 是如何调用录制脚本并实现自动测试的。
Selenium 1 实现原理
Selenium 引入了 Remote Control Server 这样一个代理 Server,JavaScript 脚本注入和与 Server 通讯都通过这个代理 Server 来进行。如下图所示:
图 1. Remote Control 模式运行流程
之所以引入这个代理 Remote Control Server 是因为“同源策略”的限制,通过这个代理服务器来“欺骗”远程 Server,达到使其以为是从同一个地方 load 代码以正确返回请求数据的效果。
流程说明:
- 客户端建立与 selenium-RC server 的连接。
- Selenium RC Server 启动一个浏览器(或是已经使用中),并注入 JS 代码
- 将 Selenese 代码传到客户端的 Selenium-Core 中。
- Selenium-Core 翻译并解析执行用户录制的操作。
- 让代理 Server 进行通讯
- Remote Control Server 负责跟远程 Web 应用服务器进行通讯。
- 操作完成,显示结果,并执行下一指令。
以上就是 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 插件
安装后,以 IBM Systems Director 产品为例,说明如何实现“用户登录”这个测试用例。
- 点击录制按钮 如下图 3 中的 1
- 录制过程中,登录用户界面,输入用户名密码。如下图 4
- 然后可以通过是否包含某些字符串来验证是否登录成功。如果下图 5
- 回到登录 IDE 界面,查看已录制步骤 如图 3 中的 2
- 在 IDE 界面中可以验证录制的脚本,必要时回到第四步,如图 3 中的 3
在 IDE 中重运行录制的脚本通过就说明脚本没问题,可以用于测试用例代码导出了。
图 3. Selenium IDE 录制窗口
图 4. 录制过程中,输入用户名密码
图 5. 通过确认是否包含某些文字来验证是否成功登录
使用 Selenium IDE 导出 JUnit 测试用例
在 Selenium IDE 中执行成功后,就可以把测试脚本导出成 JUnit 测试用例了,如图 6 所示:
图 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
启动后就可以直接在 Eclipse 中运行测试用例,RC Server 就会启动新窗口并自动按照录制脚本进行测试。并可在 Eclipse 中查看运行结果。
下面让我们看看怎样脱离 Eclipse 自己搭建一个可以持续测试的容器。
构建 JUnit 测试容器以持续测试 Selenium 的测试用例
我们搭建的这个容器可以检测某个文件夹里所有的测试用例自动运行 JUnit 代码进行测试。如果需要还可以将这个容器合并到持续集成环境里,以达到不间断持续功能性测试的需求。
在这里我们会用到 Ant 工具。可以在这里下载:
Ant 下载:http://ant.apache.org/
基础架构
图 8. 基于 Selenium 的 JUnit 的测试容器架构图
可以看见测试人员的工作如紫色箭头所示,而自动化工作如蓝色箭头所示。
这套框架的意义在于,它能自动识别测试用例,并读取配置文件以测试套件运行不同的测试用例。它还可以被合并到项目持续集成软件中,定期地持续进行基于 Web 的功能性测试,并将报告以邮件形式通知管理人员。
说明:
- 由测试人员录制脚本并导出 JUnit。
- 测试人员修改配置文件,将测试用例包含在测试套件中。
- 合并在持续集成软件后,框架会定期检测配置的测试套件
- 逐个加载测试用例。
- 以测试套件为单位其执行所有测试用例。
- 执行完成后将测试套件的结果报告以邮件形式通知管理人员
实现这套框架最关键的当属 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. 工具运行时
执行完成后就会将所有测试用例的结果以报告形式发送邮件到指定邮箱。
图 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 持续集成软件中,为整体项目提供更大集成测试范围。