介绍
Selenium 是 ThoughtWorks 专门为 Web 应用而开发的自动化测试工具,适合进行功能测试、验收测试,其最大的优势有几点:
<!--[if !supportLists]-->1) <!--[endif]-->可直接运行在浏览器之上,所见即所得,就像真实用户所做的一样。Selenium
的核心,也称 browser bot,是用 JavaScript 编写的。这使得测试脚本可以在受支持的浏览器中运行。browser
bot 负责执行从测试脚本接收到的命令
<!--[if !supportLists]-->2) <!--[endif]-->支持多操作系统(Windows,
Mac OS和Linux)和各种浏览器Internet Explorer、Mozilla 和 Firefox,更容易发现浏览器的不兼容性
<!--[if !supportLists]-->3) <!--[endif]-->支持两种开发脚本的模式test
runner (HTML文件)和 driven(脚本语言编写),其语言包括Java, .NET, Perl, Python 和
Ruby. 使用 driven 脚本,测试有一部分在浏览器之外运行,而如果使用 test runner 脚本的话,测试是完全在浏览器中运行的。
但是Selenium是轻量的测试框架, 脚本所处理的测试用例构成简单,其实质就是通过HTTP协议,发送请求(request)来完成测试用例,所以很困难处理业务逻辑关系强的测试用例。
更多的讨论: http://forums.openqa.org/index.jspa
Selenium 命令
Selenium 命令分成两类 —— 操作(action) 和断言(assertion):
* 操作模拟用户与 Web 应用程序的交互。例如,单击一个按钮和填写一个表单,这些都是常见的用户操作,可以用 Selenium
命令来自动化这些操作。
* 断言验证一个命令的预期结果。常见的断言包括验证页面内容或当前位置是否正确。
在 Selenium 网站上可以找到可用命令的完整列表。通过 Selenium 命令,脚本编写者可以描述 browser bot
在浏览器中所执行的操作
组成
* Selenium IDE:一个firefox的plug-in,可以录制和回放并保存一些test cases, 可以生成一些简单的基于rc
模式的简单code. (相当于Jmeter的gui模式和jmeter脚本的生成-badboy)
* Selenium Core. 整个测试机制的核心部分,即有assertion(断言) 机制的test suite runner。它由一些纯js代码组成,
可以运行在windows/linux的不同browser上 (相当于Jmeter 的runner 跟 Assertion)
* Selenium Remote Control:一个代理与控制端, 可代替Selenium core/ Selenium IDE的client端(相当于通过编程来实现一切),是支持多语言的.
(相当于Jmeter的client/server模式,但Selenium Remote Control更强一些)
支持的平台
- Windows:
o Internet Explorer 6.0
o Firefox 0.8 to 1.5, Mozilla Suite 1.6+, 1.7+
o Seamonkey 1.0, Opera 8
- Mac OS X:
o Safari 1.3+
o Firefox 0.8 to 1.5, Mozilla Suite 1.6+, 1.7+
o Seamonkey 1.0, Camino 1.0a1
- Linux:
o Firefox 0.8 to 1.5, Mozilla Suite 1.6+, 1.7+
o Konqueror
部署Selenium
下载地方:http://www.openqa.org/selenium/
selenium目录下的内容:
<!--[if !supportLists]-->l <!--[endif]-->devtests:试验性功能
dom-images: 查看DOM用图片
<!--[if !supportLists]-->l <!--[endif]-->dom-styles:
查看DOM用样式表
<!--[if !supportLists]-->l <!--[endif]-->html-xpath:
Xpath库
<!--[if !supportLists]-->l <!--[endif]-->jsmock: javascript
mock library
<!--[if !supportLists]-->l <!--[endif]-->jsunit: javascript
unit test library
<!--[if !supportLists]-->l <!--[endif]-->tests: samples(以这个为基础开发测试用例)
<!--[if !supportLists]-->l <!--[endif]-->核心js文件和html文件
<!--[if !supportLists]-->l <!--[endif]-->如果想要测试自己开发的发布在服务器端的页面,需要把selenium配置在同一个服务器下:
Apache :直接将selenium目录拷贝至htdocs(Apache的确省根目录)目录下,然后启动Apache,用地址http://server:8080/selenium/TestRunner.html访问例子。
<!--[if !supportLists]-->l <!--[endif]-->Tomcat :直接将selenium目录拷贝至webapps目录下,启动Tomcat,用地址http://server:8080/selenium/TestRunner.html访问例子。:
<!--[if !supportLists]-->l <!--[endif]-->IIS:建立一个虚拟目录selenium,将该虚拟目录直接指向实际的selenium目录,用地址http://server/selenium/TestRunner.html访问例子
Test runner 脚本开发模式
Selenium test runner 脚本,就是测试用例(test case),是用 HTML 语言通过一个简单的表布局编写的,即使对于非技术人员来说,test
runner 脚本也易于阅读和编写。如 清单 1 所示。
清单 1. Selenium 测试用例的结构 (HTML格式)
Command1/Assertion1 |
Target1 |
Value1 |
Command2 Assertion1 |
Target2 |
Value2 |
test runner 脚本使用与 xUnit 框架相同的测试套件(test suite)和测试用例概念。测试用例和命令按照它们在测试套件和测试用例中出现的顺序依次执行。在
清单 1 中:
* 第一列包含命令 或断言。
* 第二列包含命令或断言的目标(target)。可以用多种受支持的组件定位符中的一种来指定目标。通常使用的是组件的 ID 或名称,但
XPath 和 DOM 定位符也是受支持的。
* 第三列包含用于为命令或断言指定参数的值。例如,当使用 type 命令时,这一列可能就是一个文本域所期望的值。
Test runner 脚本通常与所测试的应用程序(AUT)部署在同一个服务器上。这是因为 browser bot 使用 JavaScript
来模拟用户操作。这些脚本在一个受限制的沙箱环境中运行。如果需要绕过这些限制,可以使用一个代理。
driven 脚本开发模式
driven Selenium 脚本是用多种受支持的编程语言(Java, .NET, Perl, Python 和 Ruby)中的一种编写的。这些脚本在浏览器之外的一个单独的进程中运行。驱动程序的任务是执行测试脚本,并通过与运行在浏览器中的
browser bot 进行通信来驱动浏览器。驱动程序与 browser bot 之间的通信使用一种简单的特定于 Selenium
的连接语言 Selenese。
driven 脚本比 test runner 脚本更强大、更灵活,可以将它们与 xUnit 框架集成。driven 脚本编写和部署更复杂些,它必须执行以下任务:
* 启动服务器。
* 部署所测试的应用程序(AUT)。
* 部署测试脚本。
* 启动浏览器。
* 发送命令到 browser bot。
* 验证 browser bot 执行的命令的结果。
driven 脚本更依赖于应用程序运行时环境。例如,Java 驱动程序使用一个嵌入式 Jetty 或 Tomcat 实例来部署所测试的应用程序,如将
Selenium 集成到 Ruby on Rails 中。
开发测试用例
测试用例开发涉及四类文件
<!--[if !supportLists]-->1. <!--[endif]-->主文件: TestRunner.html/TestRunner.hta(.hta文件是html
application,windows平台特有);
<!--[if !supportLists]-->2. <!--[endif]-->Test suite和Test
case文件:需要编写的由一个表格组成的html文件;
<!--[if !supportLists]-->3. <!--[endif]-->引擎库js文件:位于selenium根目录下的核心文件,其中html-xpath目录下的那个文件,也是必须的库文件;
<!--[if !supportLists]-->4. <!--[endif]-->user-extensions.js:用来扩展selenium的文件;用户自己编写的函数和扩展的命令都应该放在这个文件中;
这四类文件中,除了引擎库以外,其他三类文件都是可以根据具体情况去修改的。selenium 部署完毕后,可以打开浏览器来通过url来访问TestRunner.html文件。初始的时候,TestRunner.html文件中的
TestSuite是链接到tests目录下的TestSuite.html文件,TestCase的frame(上部中间)中打开了
TestSuite.html文件中的第一个Test Case “TestOpen.html”。
可以直接修改TestSuite.html文件,让其指向自己开发的Test case html文件。我们也可以建立另外一个目录,然后将自己的TestSuite文件和Test
case文件都保存在这个目录中。如果使用后一种方式,那么在打开TestRunner.html的时候需要传递一个参数,例子如下:
http://localhost/selenium/TestRunner.html?test=/testDir/myTestSuite.html
下面就是开发测试用例——即编辑测试用例的表格。无论Test Suite还是Test Case,表格的第一行都是描述性文字,selenium的引擎是不会处理这一行的内容的。实际内容都是从第二行开始的。Test
case的表格列数一定不能少于3列,否则Selenium会出错。而基本的三列组成是:
|command| Target| value|
清单 2就是四个测试用例的例子,将执行以下操作:
1. 通过进入 /change_address_form.html 打开变更地址页面。
2. 在 ID 为 address_field 的文本框中输入 Betelgeuse state prison。
3. 单击名为 Submit 的输入区。注意,这里使用 XPath 找到 Submit 按钮,这导致表单数据被发送到服务器。
4. 验证页面是否包含文本 Address change successful。
清单 2. 在测试用例中使用命令和断言的例子
command |
Target |
Value |
open |
/change_address_form.html |
|
type |
address_field
|
Betelgeuse state prison |
clickAndWait |
//input[@name='Submit'] |
|
verifyTextPresent |
Address change successful< |
|
测试套件
要达到对应用程序的完全测试覆盖,通常需要不止一个测试用例。这就是 Selenium 使用测试套件的原因。测试套件用于将具有类似功能的一些测试用例编成一组,以便让它们按顺序运行。
测试套件和测试用例一样,都是用简单的 HTML 表编写的。Selenium 执行的缺省测试套件的名称是 TestSuite.html。测试套件使用一个只包含一列的表,表中的每一行指向一个包含某个测试用例的文件。
对于一个有着多个功能模块、组件的web应用,编写的测试脚本html必然比较多。因此,应该建立一个合理的目录结构来组织这些脚本,一般按web服务、模块、功能来组织,形成层次性结构。 |