Selenium WebDriver + Grid2 + RSpec之旅(五)

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

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

设计思路

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

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

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

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

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

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

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

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

2、在Login_Page下分别创建文件夹tool,action,spec,config

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中代码如下:

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

2、login_dialog.rb中代码如下

 #encoding:utf-8

 require 'selenium-webdriver'

 module Login_Dialog
def get_username
@dr.find_element(:id,'tbUserName')
end def get_passwd
@dr.find_element(:id,'tbPassword')
end def get_submit
@dr.find_element(:name,'btnLogin')
end def get_message
@dr.find_element(:id,'Message')
end end

3、login_page.rb中代码如下:

 #encoding:utf-8

 require 'selenium-webdriver'
require File.dirname(__FILE__)+'/../tool/login_dialog' class Login_Page
include Login_Dialog def initialize(dr)
@dr ||= dr
end def login(username,passwd)
get_username.send_keys(username)
get_passwd.send_keys(passwd)
get_submit.click
end def message
get_message.text
end end

4、login_cnblogs_spec.rb中代码如下

 #encoding:utf-8
require 'selenium-webdriver'
require 'rspec'
require 'yaml' require File.dirname(__FILE__)+'/../tool/login_dialog'
require File.dirname(__FILE__)+'/../action/login_page' describe 'cnblogs main login page' do
include Login_Dialog before (:all) do
@data = YAML.load (File.open(File.dirname(__FILE__)+'/../config/login_data.yml'))
end before (:each) do
@dr = Selenium::WebDriver.for(:remote,:url => @data["data"]["mainpage"]["huburl"],:desired_capabilities => :firefox)
@dr.navigate.to @data["data"]["mainpage"]["url"]
@dr.manage.window.maximize()
@driver = Login_Page.new(@dr)
end after (:each) do
@dr.quit
end
context 'input the wrong passwd' do
it 'login failed,and return "用户名或密码错误"' do
@driver.login(@data["data"]["logindata"]["wrong"]["username"],@data["data"]["logindata"]["wrong"]["password"])
expect(@driver.message).to eql (@data["data"]["logindata"]["wrong"]["message"])
end
end
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,一条相对完美的用例产生了,并且成功运行。下一章节会讲解一下多浏览器的并行处理。

最新文章

  1. Python的平凡之路(17)
  2. 【原创】关于不同分支代码的Merge有了透彻的理解
  3. HDU5834 Magic boy Bi Luo with his excited tree(树形DP)
  4. 2145334赵文豪《Java程序设计》第2周学习总结
  5. webpy使用笔记(一)
  6. dx wpf的各种坑
  7. hdu 4421 Bit Magic
  8. ZOJ 3261 Connections in Galaxy War(逆向并查集)
  9. MFC 简单输出EXCEL - (OLE)
  10. 条带深度 队列深度 NCQ IOPS
  11. [bzoj3953] [WF2013]Self-Assembly
  12. java中Number类理解
  13. codeforces 1064套题
  14. Python第二天: 变量详解及变量赋值
  15. 【FJOI 20170305】省选模拟赛
  16. APP包打包签名步骤
  17. 【学习】C++异常处理,exception
  18. Mongodb数据库连接
  19. django rest_framework Serializers 序列化组件
  20. 总有一些实用javascript的元素被人遗忘在角落-slice

热门文章

  1. 配置nginx的负载均衡
  2. 【制作镜像】virsh
  3. SGU 260.Puzzle (异或高斯消元)
  4. 九度OJ 1107 搬水果 -- 哈夫曼树 2011年吉林大学计算机研究生机试真题
  5. 【ADO.NET】2、各种版本的 简单登录验证
  6. which命令
  7. Linux自动备份MySQL数据库脚本代码
  8. phpstorm调整背景、字体颜色
  9. LeetCode【第一题】Two Sum
  10. WPF中将四个数字字符串值(比如:"10,10,300,300")转为Rect