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