Watir-Webdriver + Cucumber实现简洁易维护的网站自动化测试
2012-02-13 14:57 Joeyyyy 阅读(1465) 评论(0) 收藏 举报第一次将自己积累的东西写成文字,还有些不习惯。不过我相信互联网的精神是分享,跨出了这一步,才能真正融入到世界中。
在这家公司也工作了1年半了,这次想向大家介绍我在公司推行的自动化框架。
这里,我们主要会用到ruby语言,由其的开源库:cucumber,watir-webdriver组成这个自动化框架.
因此,第一步,先来安装环境吧
环境准备
安装JRUBY
linux环境下,建议使用RVM来管理ruby的各种版本和gem.具体安装方式可去其官网.
windows环境直接到jruby.org下载最新版
使用Jruby的好处:
- jruby对中文的兼容性更好
- 方便直接通过oracle的jdbc驱动访问数据库,而不用安装一堆麻烦的驱动.
安装Gems
使用
jgem install cucumber watir-webdriver rspec -d
登录功能演示
创建项目骨架
demo.7z
如下图所示

文件功能说明:
env.rb
用于初始化用例执行的环境,如初始化浏览器,打开测试网站首页。
各种hook也定义在这个文件中,比如demo中已有的失败用例自动截图。如果要和第三方测试管理工具集成,可以在after hook中加入代码来将用例结果回写到第三方工具中。
编写features
以登录功能为例:
首先,在features/passport_feature下新建feature文件:
login.feature
# language: zh-CN
功能: 用户登录
为了能够浏览网站只对在线会员可见的那些内容
作为一名访客
我希望能够登录
场景: 用户登录功能
假如 我没有登录
当 我进入登录页面
而且 我以这个身份登录
那么 我应该成功登录
第一行# language告诉cucumber这个feature要用哪个i18n语言进行解析,不写的话是解析不了中文指令的.
功能:每个feature都有这个部分,用于简要描述一下这个feature的用途
场景: 用例标题
假如,当,那么: 相当于用例执行的前置条件,步骤,结果校验. 这里写的步骤会通过正则匹配的方式对应到执行的代码.传递参数的话也是通过正则表达式.一般参数用特殊符号标记出来方便截取.比如<>
Step Definition定义
用例完成了,但是光这样还跑不起来,我们需要定义每一个步骤对应的执行脚本.
在features/passportfeature目录下创建stepdefinitions目录(目录名为cucumber的约定),并在其下创建login_steps.rb:
include Pages
Given /^我没有登录$/ do
@page = HomePage.new @b
@page.open
step %{我登出网站}
step %{我应该登出网站}
end
When /^我登出网站$/ do
@page ||= HomePage.new @b
@page.logout
end
When /^我以<(.+)\/(.+)>这个身份登录$/ do |username,password|
@page = LoginPage.new @b
@page.open
@page.login username,password
end
Then /^我应该成功登录/ do
@page.is_login?.should be_true
end
Then /^我应该登出网站$/ do
@page.is_login?.should be_false
end
通过正则表达式的分组匹配(),可以将参数从步骤中抽取出来.
Page对象
为了代码的易于维护,我们使用了Page对象,即将每个页面都定义为一个Page对象,页面中所有会被操作到的元素和过程都定义在Page对象中进行集中的使用和维护,在步骤中直接引用Page对象已经定义的元素或方法,而不直接操作浏览器.
这里用到了两个Page对象,分别是HomePage首页和LoginPage登录页.下面简单介绍一下LoginPage,其他可以从附件中找到样例.
module Pages
class LoginPage < BasePage
def initialize b
super b
@name = "登录页"
@url = "https://passport.yihaodian.com/passport/login_input.do"
@elements = [name_input,password_input,login_btn]
end
def name_input
@b.text_field(:id =>'un')
end
def password_input
@b.text_field(:id => 'pwd')
end
def login_btn
@b.button(:text,"登 录")
end
def login username,password
name_input.set username
password_input.set password
login_btn.click
end
end
end
这里每个Page对象继承于BasePage,且都要定义对应的
@name(页面名),
@url(页面url,用于通过basepage中定义的open方法可以打开该页面,另外还用于检查当前页面是否是期望的页面,定义在basepage的selfcheck方法中),
@elements(定义该页面标志性的元素,用于在selfcheck时逐个检查元素是否存在,不存在的话则认为页面没有正确被加载)
页面元素的定义具体参考watir-webdriver的api.我也会在另外的文章中介绍,这里就不详细提及了.
执行用例
接下来,我们终于可以正式执行这个用例了.
在项目根目录下运行cucumber features/passport_feature/login.feature -r features/
其中 -r 表示指定features的根目录,这样page对象才能被cucumber顺利找到.
执行后,控制台上会输出用例执行的情况,通过的步骤显示为绿色,失败的为红色. 看到满屏绿色,你是不是很有成就感呢~
下面列举了常用的几种执行用例的命令形式:
执行某一个feature文件(中某一个场景,n表示行号)
cucumber features/xxx/xx.feature[:n] –r features
执行包含某一个tag的命令
cucumber --tags @regression –r features
混合执行
cucumber features/xxx/xx.feature --tags @xx –r features
windows下显示颜色
windows下控制台可能不能正常显示颜色,还好我找到了一个小程序,只要大家在执行命令最后加上-c |wac,就可以正常显示颜色了.
-c表示启用控制台颜色,这个windows下默认关闭,需要特别注明打开.
|wac即将屏幕输出通过pipe传递给wac这个小程序,它会处理asic颜色代码.
浙公网安备 33010602011771号