本文所要介绍的 Watir( Web Application Testing in Ruby) 是一个优秀的开源工具,用于开发基于 Web 应用的自动化测试程序。它使用 Ruby 脚本语言,提供了轻量级的自动化测试程序框架和丰富的开发库,有效地加速了自动化测试程序开发。
随着 Web 应用的流行与其复杂度的增加,以及软件过程敏捷化要求的提升,自动化测试成为保障项目成功的一个重要因素。因为自动化测试可以大大地减少测试人员的重复工作,加快测试速度,使测试更加频繁,从而保证了项目的质量和进度。此种情况下,测试人员更加需要一个功能强大且简单易用的自动化测试工具,辅助测试人员搭建测试框架,设计自动测试程序,而又尽可能减少自动化测试程序的开发和维护成本 .
本文所要介绍的 Watir( Web Application Testing in Ruby) 是一个优秀的开源工具,用于开发基于 Web 应用的自动化测试程序。它使用 Ruby 脚本语言,提供了轻量级的自动化测试程序框架和丰富的开发库,有效地加速了自动化测试程序开发。
本文介绍了 Watir 的主要功能和特点,以及如何搭建 Watir 的开发运行环境,并通过一些代码示例详细地介绍了构建一个 Watir 自动测试程序的主要步骤。本文同时介绍了用 Watir 开发自动化程序的几个关键技术:如何在复杂页面中选择一个合适的对象识别方式;如何使用 Ruby 提供的交互式工具 IRB 来加速 Watir 程序的开发和调试;如何用 YAML 文件管理测试数据,并通过 Watir 程序来读取和解析;如何继承 Ruby 的单元测试框架来创建和调用测试用例,以及测试用例集等。
本文的听众为对自动化测试有兴趣,并且对自动化测试基本知识有一定了解的开发人员和测试人员。
Watir 的主要特性以及使用 Watir 开发自动化程序的优势
Watir 是一个轻量级的用于开发基于 Web 应用的自动化测试框架,它基于 Ruby 语言,提供了丰富的开发库,简化了自动化测试程序开发。下面我们总结了 Watir 的主要一些优良特性:
- Watir 基于 Ruby 语言。 Ruby 是面向对象语言,功能强大,简单易用。程序解释执行不用编译;
- Watir 支持多种操作系统平台,包括 Windows, Mac, Linux ;同时支持多种主流浏览器,如 IE, Firefox, Chrome
- Watir 提供了丰富的开发库,封装了包括浏览器窗口 windows,button, link, dialog, image, table, div 等绝大多数 HTML 对象类型,方便测试人员快速构建自动化测试程序。
- Ruby 提供了强大的交互命令工具 IRB(Interactive Ruby Shell), 在 Watir 程序开发中,我们使用 IRB 调试代码。别于传统调试方法,测试人员可以就单独一条命令或者一段程序进行调试,从而能够快速定位错误,节省调试时间。
- Ruby 提供了 Test::Unit 单元测试框架,通过继承该框架,我们可以对测试用例,测试用例集 (Test Suites) 进行灵活方便地组合和调用,并且可利用断言 (Assertion) 来验证测试结果。
- 其他脚本语言如 Perl, Python, Shell 等也可以很好地集成到 Watir 程序中。
- Watir 程序在运行时,允许测试人员在该测试机器上访问其他网页或者进行其他操作而不会影响到对象识别的结果。
下载 Ruby 包,在 window 平台可下载 Ruby 1.8.6 One-Click Installer,按照向导安装
- 下载并自动更新 RubyGems 到最新版本 。
注意:Gem 是指任何一个打包好的 Ruby 库,这些 Ruby 库通过 Gem 命令来安装,卸载。
C:\Documents and Settings\Administrator>gem update – system Updating RubyGems Updating rubygems-update
- 安装 Watir 库,下面以 Window 上安装 Watir1.5.6 为例 :
C:\Documents and Settings\Administrator\>gem install water Successfully installed water-1.5.x Installing ri documentation for water-1.5.x … Installing RDoc documentation for water-1.5.x..
- 在安装完 Watir 后,可以运行 Watir 自带的 Unit Tests,用以验证 Watir 是否安装成功。 Unit Tests 程序位于 {Ruby 安装目录 }\lib\ruby\gems\1.8\gems\watir-1.5.6\unittests\core_tests.rb,具体每一项检查结果会输出到 console 中。
获取网页对象属性是开发 GUI 自动化测试程序的必要一步。虽然 Watir 本身没有提供类似 RFT 中 Object Capture 的对象捕捉器,但在 Watir 程序的开发中,我们可以配合使用一些第三方提供的运行在浏览器端的 Html 查看器,以便网页结构和对象属性的查看。比如,IE 浏览器可安装 Microsoft IE Explorer Develop Toolbar ; Firefox 浏览器,可安装 Firebug 。这些查看器具有以下类似功能:
- 可方便浏览整个网页 DOM 结构树;
- 可察看各种类型对象(table, image, text, link 等)的具体属性及属性值。
- 支持对象查找和过滤
- 支持 HTML 和 CSS 源代码查看
图 1. IE 浏览器启动 IE Develop Toolbar
我们以 IE 中为例 ( 如图 1),在 IE 工具栏中点击光标状图标(如图中红色方块标识), IE Developer Toolbar 就会在当前浏览器下方打开。其中左边一栏显示了该网页的 DOM 树。当选中该 DOM 树上的某个节点时,该节点对应的页面上的某对象就会高亮闪烁显示(如图中 Log In 按钮被选中);中间一栏列出了选中对象的属性及属性值,如图中,Login 按钮有三个属性 name,id,type ;右边一栏为当前对象的一些特性和风格。
当我们想查看某个对象的属性时,可以点击 IE Developer Toolbar 最左上角的图标,选中该对象,其所在的 DOM 节点,属性以及属性值就会列在当前浏览器下方。
除此之外,IE Developer Toolbar 还提供了另外一些有用的功能方便自动化程序的开发和调试。如用各种颜色框体标出所有指定的对象类型(如 table cells, table, DIV, images 等),在网页上列出所有图片的 ALT 值,所有链接的路径,以及所有对象的类型和 ID 等。
4. 在 Eclipse 集成环境中安装 Ruby 插件,搭建 Watir 的开发和运行环境。
SciTe 是安装 Ruby 后自带的单文档编辑器,但它不适合较大规模程序开发。而 Eclipse 集成开发环境不仅方便程序的开发和调试,而且它与 CVS 版本控制紧密绑定,并对团队协作开发很好支持,所以我们可以在 Eclipse 集成环境中安装 Ruby 插件,搭建 Watir 的开发和运行环境,以下为具体步骤:
- 在 Eclipse 中下载最新版 Ruby 插件 , 下载地http://update.aptana.com/update/rdt/3.2/
图 2. 在 Eclipse 中下载最新版 Ruby 插件
- 添加 Ruby 解释器。点击” Window ” -> ” Preferences ” -> ” Ruby ” -> ” Installed Properties ” , 点击” Add ”按钮,选择并关联 Ruby.exe 作为 Ruby 解释器。
图 3. 在 Eclipse 中添加 Ruby 解释器
- 当 Ruby 安装完成后,项目视图中会添加 Ruby Resource 一项,开发人员可以在该视图下编写或查看 Watir 程序。
图 4. Ruby Resource 视图
- Watir 是一个 Ruby 开源库,阅读其源代码不仅可以了解 Watir API 的具体实现,同时它本身也是编写 Ruby 和 Watir 的很好的代码示例。所以我们可以在 Eclipse 中引入 WATIR 项目。 Watir 源码位于 {Ruby 安装目录 }\lib\ruby\gems\1.8\gems\watir-version,一下为 WATIR 项目结构。其中 unittests 目录下是对 Watir 所支持的页面对象类型以及主要的 API 进行单元测试的 Ruby 程序,我们在编写 Watir 自动化程序时不妨多多参考。
图 5. WATIR 项目结构
在 Watir 开发环境搭建好后,我们开始创建一个 Watir 自动化测试程序项目,通常有以下一些步骤:
- 在 Eclipse 中创建一个 Ruby 项目。从菜单选择 File->New->New->Project->Ruby Project, 并给定项目名称;
- 搭建自动化测试程序框架,我们可以延续 IBM 的三层自动化体系结构,从下到上分别是公共对象 (Object), 任务(Task),测试用例和测试用例集(Test Case)。
- 编写第一个 Watir 程序。 Ruby 语言简单直观,Watir 库的使用语法也非常简洁。在使用 Watir 库之前,我们首先要引入 Watir 库。
require 'watir' # 引用 Watir 库 ie = Watir::IE.new # 创建一个 IE 浏览器实例 ie.goto("https://9.123.109.110:9043/ibm/console ") ie.button(:type, ‘ submit ’ ).click # 识别对象并对对象进行操作
- 使用 IE Explorer Developer Toolbar 去抓取 Web 页面对象属性,使用方法在如何安装 IE Developer Toolbar 已经介绍。
- 通过继承 Test::Unit 框架编写测试用例和测试用例集;
- 通过断言 Assertion 为测试用例添加测试结果验证,并通过日志及截屏(类 Watir::ScreenCapture 提供了对截屏的支持)记录测试结果
- 在 YAML 或 Excel 中准备测试数据;
- 启动 IRB(Interact Ruby Shell) 来调试 Watir 代码片段;
- 运行 Ruby 程序有多种方式:在 Eclipse 环境中,打开 Ruby 视图,选中某 Ruby 程序,点击右键,选中” Run As ” -> ” Ruby Application ”;另外,也可以在文件目录下双击某 rb 文件,运行该 Ruby 程序;
图 6. 在 Eclipse 中运行 Ruby 程序
- 查看运行日志,分析测试结果。
在下文中,我们将对上述构建 Watir 自动化测试程序中的一些关键技术进行具体介绍。
抓取 Web 页面对象属性是构建自动化测试程序第一步。 Watir 给我们提供了多种对象识别方式,包括通过单属性查询,多属性组合查询,正则表达式匹配和 XPath 查询等。我们在项目中采用哪种页面对象识别方式,要从各搜索方法适用的条件以及对页面结构的复杂度和搜索速度两方面综合考虑。
- 单属性查询
当页面中某对象可以由某个属性唯一标识时,可以用单属性查询法。其语法遵循
$ie.object_class(:<attribute>, “ <attribute value> ” ), 如
$ie.button(:id, "submit").exists? $ie.div(:id, "div3").exists? $ie.image(:alt , "flower" ).exists? $ie.link(:url, "https://localhost:9043/ibm/console").exists?
- 多属性组合查询
当一个页面中存在多个属性相同的对象,不能通过单个属性来识别某个对象时,我们可以用多个属性组合来查询,如一数据表格中有多行,每行分别有一个 radio 按钮,它们名字属性相同,在这种情况下,我们可以通过两个属性,如名字 (name) 和索引 (Index) 的组合来进行查询。
$ie.radio(:name => 'Employees', :index => 2).exists?
- 正则表达式匹配
Watir 支持正则表达式模糊匹配,它适合于识别动态创建的页面对象。其语法是查询条件为正则表达式,正则表达式由字符串前后附加的两个反斜杠 // 来标明 , 如 WAS Console 链接
https://127.0.0.1:9043/ibm/console,由于主机名依赖于测试环境,所以我们可以用以下几种正则表达式查询方法来识别。
$ie.link(:url, /9043/ibm/console/).click 或者是 $ie.link(:url, /https://127\\.0\\.0.\\1:9043*/).click
注:* 代表任何字符,一些特殊字符,如”()
.
”需要转义 , 我们可以在 irb 模式下输入 Regexp.escap “ {string to be converted} ” , 就能得到转义后的字符串 - XPath 查询
XPath 是 Watir 提供的一个强大查询。我们在开发 Web 自动化程序的时候可能会经常碰到,一些对象很难被一个或一些属性来唯一描述,此时使用 XPath 查询就非常必要。另外,当页面 DOM 树结构较为复杂(如有很多嵌套的表格),而查询对象在较深的层次时,使用 XPath 查询会加速对象的搜索。其表达式为
$ie.object_class(:xpath, “ xpath query ” ),
比如:$ie.table(:xpath, "//table[@id='t1']/").exists?
IRB(Interactive Ruby Shell)是 Ruby 提供的一个功能强大的交互式 Shell. 我们可以使用 IRB 快速调试程序片段,比如快速定位复杂页面中一个对象,如表格等,以及如何在 IRB 中就一条命令或者一个程序片断进行单独调试。下面为一些例子:
- 在命令行中输入“ irb ”以启用 IRB 模式。接着就可以输入 Ruby 命令。 Ruby 命令被立即解释执行,并返回结果。
图 7. 执行 Ruby 命令
- 启用 Watir 库
图 8. 启用 Watir 库
- 打开一个新的 IE 浏览器窗口,并绑定 URL(https://9.123.109.80:9043/ibm/console)。命令执行后返回一些页面属性和性能指标,如窗口句柄,页面下载速度等。另外变量 ie 为全局变量,下面对该变量 ie 的操作都将基于该浏览器窗口。
图 9. 打开一个新的 IE 浏览器窗口
- 使用 show_all_objects 方法列出页面上所有对象,以及它们相应的属性和属性值。该方法在查找复杂页面的对象是时尤为重要。表 1 列出了其它的 show 函数,调用这些命令可以列出页面上相应类型的所有对象。
图 10. 列出页面上所有对象
表 1. 其它 show 函数列表
show_images 列出所有的图片 show_tables 列出所有的表格 show_spans 列出所有的 Span show_labels 列出所有的标签 show_links 列出所有的链接 show_divs 列出所有的 DIV show_frames 列出所有的框架 show_forms 列出所有的 Form
- 当我们想确定页面对象是否能被某些属性正确识别时,可以调用 flash 方法,如果该对象被识别出,则它会高亮闪烁显示。
图 11. 高亮闪烁显示
- IRB 不仅支持单行命令的解释执行,也支持一段代码的运行。在程序调试中,我们可以针对有问题的代码单独在 IRB 中调试运行,我们只需准备调试该段代码所需的测试环境状态,这样就无需每次从打开一个新的 IE 窗口开始,从头运行大段代码,从而节省了调试时间。
YAML 是一种可读性很强的数据序列化格式。它可以通过对数据的简单的格式化来简单直观地表示数据之间的映射关系和层次结构等。下面的 YAML 例子中,我们创建了一个包含 3 套测试环境信息的数据字典,每套环境包括测试环境 URL,用户名,密码,测试数据文件路径。
清单 1. YAML 例子
--- ENV_ID: Env1 ENV_Infor: TEST_URL :"https://xxx/index.html" USERNAME : "user1" PASSW0RD : "passw0rd" TEST_DATA_FILE : "/test_data_env1.xls" --- ENV_ID: Env1 ENV_Infor: TEST_URL :"https://xxx/index.html" USERNAME : "user2" PASSW0RD : "passw0rd" TEST_DATA_FILE : "/test_data_env2.xls" --- ENV_ID: Env3 ENV_Infor: TEST_URL :"https://xxx/index.html" USERNAME : "user3" PASSW0RD : "passw0rd" |
TEST_DATA_FILE : "/test_data_env3.xls"
下面一段简单的 Ruby 程序用来读取和解析该 YAML 文件。
def getEnvInfor (env_id) File.open( ‘ env.yaml ’ ) do |yf| YAML.each_document( yf ) do |data| if data['ENV_ID'] == env_id $test_url = data['ENV_Infor']['TEST_URL'] $username = data['ENV_Infor']['USERNAME'] $password = data['ENV_Infor']['PASSW0RD'] $test_data_file = data['ENV_Infor']['TEST_DATA_FILE'] end end end end
Ruby 提供了完善的单元测试框架。在 Watir 程序开发中,测试人员可以通过继承该框架,很方便地编写自动测试用例以及测试用例集 (Test Suites) 。以下是一些在 Watir 程序开发过程中常用到的类和模块
- Test::Unit::Assertions,该模块提供了多种断言 (Assert) 方法,可用于测试结果的验证,如操作对象的状态的判定(如页面某对象是否存在,是否可用),或者消息显示是否与期望值匹配等
- assert($ie.area(:alt, 'Table Buttons').exists?)
- assert($ie.radio(:name, "box1").enabled?)
- assert_match(test.html/, browser.link(:class_name, 'test').href)
- assert_equal( ie.text_field(:id, "text2"), "Hello World" )
- Test::Unit::TestCase 定义了测试用例类,它包括两个非常有用的公共方法:setup(), teardown(),它们分别会在每个测试用例启动前和运行后被调用。所以 Setup() 通常用于准备测试环境和测试数据,如打开 IE 窗口,登录应用,打开数据文件之类操作;而 teardown() 则用于释放资源和还原测试环境,如关闭 IE 窗口,退出应用等。除此之外,用户可自定义其他测试用例方法,只要方法名遵守一定的命名规则,即以“ test_ ”为前缀,在程序运行时测试用例就会按照方法名的字母排列顺序被自动调用。比如在下面的样例代码中,方法被调用的顺序为:
图 12. 方法被调用的顺序
清单 2. 测试用例调用
require 'Watir' # 引入 Watir 库 require 'test/unit' # 引入 Test::Unit 库 class TC_MyTest1 < Test::Unit::TestCase # 继承类 Test::Unit::TestCase include Watir::Exception include Watir::ScreenCapture def setup getEnvInfor ( ‘ Env1 ’ ) # 获取环境信息 if ! defined? $logger # 初始化日志 $logger = LoggerFactory.start_xml_logger(FILE_PREFIX) end if !defined? $screen # 初始化截屏对象 $screen = Watir::ScreenCapture.new end if !defined? $browser # 初始化 IE 浏览器 $browser = Watir::IE.attach(:url, "https://localhost:9043/ibm/console") end login($USERNAME, $PASSW0RD) # 登录应用 end def teardown logout() # 退出应用 $browser.close if defined? $browser # 关闭 IE 浏览器 end def test_testcase1 # 测试用例 1 $logger.log( “ Test Case 1 ” ) $browser.button(:type, ‘ submit ’ ).click ... end def test_testcase2 # 测试用例 2 $logger.log( “ Test Case 2 ” ) $browser.inputfield(:id, ‘ j_username ’ ).click ... end end
- Test::Unit::TestSuite 为测试用例集,用户可以将逻辑相近的测试用例添加到某测试用例集中,当运行该集合时,其中的每个测试用例会被按序调用。
require 'test/unit/testsuite' require 'TC_MyTest1' require 'TC_MyTest2' class TS_MyTests def self.suite suite = Test::Unit::TestSuite.new # 创建一个测试用例集实例 suite << TC_MyTest1.suite # 将 TC_MyTest1 加入测试用例集 suite << TC_MyTest2.suite # 将 TC_MyTest2 加入测试用例集 ... return suite end end Test::Unit::UI::Console::TestRunner.run(TS_MyTests) # 运行测试用例集
- Test::Unit::UI::Console::TestRunner 用于运行测试用例或测试用例集,
- Test::Unit::TestResult 用于结果报告,所提供的接口可用于统计测试用例中运行成功 , 失败 , 出错的个数。在 Eclipse 输出窗口的 Test::Unit 栏,我们可以看到测试用例的运行结果。
图 13. 测试运行结果图
本文向读者介绍了基于 Ruby 语言开发 Web 应用的自动化测试工具 Watir,文章介绍了 Watir 的主要功能和优势,如何搭建 Watir 的开发运行环境,以及构建一个 Watir 自动测试程序的主要步骤。本文同时重点介绍了 Watir 自动化测试程序开发中的几个关键技术。相信通过本文,读者可以对 Watir 这个优秀的开源工具有了进一步的了解。最好您能亲自使用一下 Watir, 来体会它带来的自动化测试开发的乐趣。
- 参考 http://wiki.openqa.org/display/WTR/Project+Home,查看 Watir 教程。
- 参考 http://wtr.rubyforge.org/,了解 Watir 开源项目。
- 参考 http://groups.google.com/group/watir-general,查看 Watir Google 讨论邮件小组请参见。
- 参考 http://en.wikipedia.org/wiki/Interactive_Ruby_Shell,理解 Ruby 交互命令行。