zoukankan      html  css  js  c++  java
  • Selenium WebDriver + Grid2 + RSpec之旅(五)---面向对象设计用例

    Selenium WebDriver + Grid2 + RSpec之旅(五)

                                                    ----面向对象设计用例

    前几节讲了怎么一步一步的从零开始到编写出一个简单的测试用例,这一节将要讲一下怎么让测试用例变得健壮,易阅读,易维护。那就是通过面向对象的方式,再加上逻辑和数据分离的方式来处理,这个才是自动化测试的核心思想。

    设计思路

    设想对登录进行手工测试,会想到一些测试用例(验证错误的用户名正确的密码;用户名和密码为空直接点击登陆按钮。等等),如果每个用例都要写一套代码的话,会发现有些地方出现代码重复,不利于测试代码的维护。进一步研究发现, 有些测试对象也是可以复用的,比如在登陆的时候我们会用到密码输入框、点击登录按钮等,可以把这些“基本动作”封装到一个类中,这样代码的灵活性和适用性 将会更强。即,面向对象编程。

    因此对测试目录结构做了一些调整:

    新建一个文件夹tool,用来定义一些获取控件的方法

    新建一个文件夹action,用来定义一下页面操作的方法

    新建一个文件夹spec,用来存放测试用例

    新建一个文件夹config,用来存放测试用例所涉及到的测试数据

    对于测试数据的管理,采用yaml来管理

    1、在我们的工作目录下创建文件夹Login_Page (表示这个是一个登录页面的测试)

    2、在Login_Page下分别创建文件夹toolactionspecconfig

    3、action文件夹中新建文件login_page.rb

    4、config文件夹中新建文件login_data.yml

    5、spec文件夹中新建文件login_cnblogs_spec.rb

    6、tool文件夹中新建文件login_dialog.rb

    测试代码编写

    1、login_data.yml中代码如下:

     1 data:
     2     mainpage:
     3         huburl: http://localhost:4444/wd/hub
     4         url: http://passport.cnblogs.com/login.aspx
     5         title: 用户登录 - 博客园用户中心
     6     logindata:
     7         wrong:
     8             username: gqou
     9             password: 123456
    10             message: 用户名或密码错误

    2、login_dialog.rb中代码如下

     1 #encoding:utf-8
     2 
     3 require 'selenium-webdriver'
     4 
     5 module Login_Dialog
     6     def get_username
     7         @dr.find_element(:id,'tbUserName')
     8     end
     9     
    10     def get_passwd
    11         @dr.find_element(:id,'tbPassword')
    12     end
    13     
    14     def get_submit
    15         @dr.find_element(:name,'btnLogin')
    16     end
    17     
    18     def get_message
    19         @dr.find_element(:id,'Message')
    20     end
    21 
    22 end

    3、login_page.rb中代码如下:

     1 #encoding:utf-8
     2 
     3 require 'selenium-webdriver'
     4 require File.dirname(__FILE__)+'/../tool/login_dialog'
     5 
     6 class Login_Page
     7     include Login_Dialog
     8     
     9     def initialize(dr)
    10         @dr ||= dr
    11     end
    12     
    13     def login(username,passwd)
    14         get_username.send_keys(username)
    15         get_passwd.send_keys(passwd)
    16         get_submit.click
    17     end
    18     
    19     def message
    20         get_message.text
    21     end
    22     
    23 end

    4、login_cnblogs_spec.rb中代码如下

     1 #encoding:utf-8
     2 require 'selenium-webdriver'
     3 require 'rspec'
     4 require 'yaml'
     5 
     6 require File.dirname(__FILE__)+'/../tool/login_dialog'
     7 require File.dirname(__FILE__)+'/../action/login_page'
     8 
     9 describe 'cnblogs main login page' do
    10     include Login_Dialog
    11     
    12     before (:all) do
    13         @data = YAML.load (File.open(File.dirname(__FILE__)+'/../config/login_data.yml'))
    14     end
    15     
    16     before (:each) do
    17         @dr = Selenium::WebDriver.for(:remote,:url => @data["data"]["mainpage"]["huburl"],:desired_capabilities => :firefox)
    18         @dr.navigate.to @data["data"]["mainpage"]["url"]
    19         @dr.manage.window.maximize()
    20         @driver = Login_Page.new(@dr)
    21     end
    22     
    23     after (:each) do
    24         @dr.quit
    25     end
    26     context 'input the wrong passwd' do
    27         it 'login failed,and return "用户名或密码错误"' do
    28             @driver.login(@data["data"]["logindata"]["wrong"]["username"],@data["data"]["logindata"]["wrong"]["password"])
    29             expect(@driver.message).to eql (@data["data"]["logindata"]["wrong"]["message"])
    30         end
    31     end
    32 end

    5、打开DOS窗口,切换到Login_Page目录下执行命令rspec -f doc,或者进入到spec目录下执行命令 rspec login_cnblogs_spec.rb -f doc

    6、如果想要输出报告为html格式的话,只需要修改格式参数就可以了, rspec login_cnblogs_spec.rb -fh -o result.html,可以尝试一下哦!

    7、OK,一条相对完美的用例产生了,并且成功运行。下一章节会讲解一下多浏览器的并行处理。

  • 相关阅读:
    Python程序员用文字加密的方式,给女程序员写情书,一周后牵手回家
    小学生在网吧用python抓取LOL英雄皮肤,步骤简单
    vuex中module的命名空间概念
    动态设置html的font-size值
    JavaScript判断各种数据类型
    vuex脑图
    作用域链和函数内部this指向问题以及bind、call、apply方法
    BOM
    jQuery_base
    js_base_note
  • 原文地址:https://www.cnblogs.com/ouguangqian/p/Grid_05.html
Copyright © 2011-2022 走看看