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中代码如下:
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,一条相对完美的用例产生了,并且成功运行。下一章节会讲解一下多浏览器的并行处理。