代码改变世界

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颜色代码.