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

原文地址:https://www.cnblogs.com/ouguangqian/p/Grid_05.html