Selenium WebDriver + Grid2 + RSpec之旅(五)---面向对象设计用例
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,一条相对完美的用例产生了,并且成功运行。下一章节会讲解一下多浏览器的并行处理。
Selenium WebDriver + Grid2 + RSpec之旅(五)---面向对象设计用例的更多相关文章
- Selenium WebDriver + Grid2 + RSpec之旅(四) ----通过RSpec编写测试用例
Selenium WebDriver + Grid2 + RSpec之旅(四) ----通过RSpec编写测试用例 自动化测试和手工测试一样,是要有测试用例,有检查点和测试结果的,接下来我们通过RSp ...
- Selenium WebDriver + Grid2 + RSpec之旅(一)----准备篇
Selenium WebDriver + Grid2 + RSpec之旅(一) ----准备篇 前言 在Web 2.0 应用中,在浏览器种类盛行的时代,我们在测试过程中不仅要模 ...
- Selenium WebDriver + Grid2 + RSpec之旅(六) ----多浏览器的并行执行
Selenium WebDriver + Grid2 + RSpec之旅(六) ----多浏览器的并行执行 由于浏览器的发展,浏览器种类繁多.为了保证系统能在各种浏览器上叱咤风云,减少测试人员的测试工 ...
- Selenium WebDriver + Grid2 + RSpec之旅(三) ----入门小例子
Selenium WebDriver + Grid2 + RSpec之旅(三) ----入门小例子 第一个例子都是比较简单的博客园登录界面,就像学习编程语言时候都是从Hello,World!开始. 1 ...
- Selenium WebDriver + Grid2 + RSpec之旅(二)----Grid2的配置
Selenium WebDriver + Grid2 + RSpec之旅(二) ----Grid2的配置 为什么要使用Selenium-Grid 分布式运行大规模的TestCase 能够通过一个中央节 ...
- Selenium (2) —— Selenium WebDriver + Grid2(101 Tutorial)
Selenium (2) -- Selenium WebDriver + Grid2(101 Tutorial) jvm版本: 1.8.0_65 selenium版本: v2.48.0 (Standa ...
- selenium webdriver学习(五)------------iframe的处理(转)
selenium webdriver学习(五)------------iframe的处理 博客分类: Selenium-webdriver 如何定位frame中元素 有时候我们在定位一个页面元素的时 ...
- Selenium Webdriver概述(转)
Selenium Webdriver https://www.yiibai.com/selenium/selenium_overview.html# webdriver自动化俗称Selenium 2. ...
- selenium webdriver (python) 第一版PDF
前言 如果你是一位有python语言基础的同学,又想通过python+ selenium去实施自动化,那么你非常幸运的找到了这份文档,我也非常荣幸能为你的自动化学习之路带来一丝帮助. 其实,我在sel ...
随机推荐
- JavaScript使用技巧
使用!!操作符转换布尔值 有时候我们需要对一个变量查检其是否存在或者检查值是否有一个有效值,如果存在就返回true值.为了做这样的验证,我们可以使用!!操作符来实现是非常的方便与简单.对于变量可以使用 ...
- Android WebRTC视频旋转问题
最近在对接WebRTC到安卓手机上,有个需求就是手机横屏时将对方图像进行旋转,研究了WebRTC video_render的代码后发现远端的视频渲染使用opengles20或surfaceview实现 ...
- samba和squid 安装
一. samba配置1. 什么是sambaSamba服务类似于windows上的共享功能,可以实现在Linux上共享文件,windows上访问,当然在Linux上也可以访问到.是一种在局域网上共享文件 ...
- mini2440移植uboot-2008.10 (一)
今天是我申请此博客的第一天,从现在开始养成每次学完新东西,都要写博客进行总结的习惯!!!Come on! 首先就从这两天学的uboot开始吧,这两天学这个东西郁闷死了,不知道该怎么去学,尤其是到nan ...
- nodejs -mysql模块链接数据库创建库创建表单。
var mysql = require('mysql'); var connection= mysql.createConnection({ host:'localhost', user:'root' ...
- spring拦截器
一:拦截器配置 <!-- 拦截器 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path=&qu ...
- placeholder属性兼容js支持
$(function(){ //判断浏览器是否支持placeholder属性 supportPlaceholder='placeholder'in document.createElement('in ...
- 对typesafe enum模式的改进
按照一些资料上讲,其实enum也就是在编译器层面实现用类来包装枚举(typesafe enum 模式)的思想.以保证类型安全.自己用类来写枚举其实效果也还是不错的,只是代码略显啰嗦. 例子代码 pub ...
- MVC中Area的使用
1.Area是什么? MVC 2 中引进了区域的概念,它允许将模型,视图和控制器分成单独的功能节点,换句话说,可以在大型复杂的网站中建立几个区域(模块),每一个区域都有Model,View,Contr ...
- 常见排序算法(PHP实现)
function InsertSort($arr){ $num = count($arr); for($i = 1; $i < $num; $i++){ $key = $arr[$i]; for ...