估计你早已厌烦了成百上千遍的网页点击测试,至少之前的我是这样的,那么,让自己的web测试自动化吧,本文使用Cucumber + Watir来完成自动化测试,从最简单例子入手,一步一步重构成一个完整的自动化测试框架。

(一)Cucumber和Watir的关系

Cucumber和Watir可以没有任何关系,Cucumber只是一个BDD框架,而Watir只是一个Web Driver而已,两者的共同点是均属于Ruby世界。

(二)单独使用Cucumber

关于Cucumber的执行过程请参考笔者的另一篇文章:行为驱动开发: Cucumber的目录结构和执行过程 。

由于Cucumber和Watir没有必然联系,因此两者均可单独使用,下面就让我们用Cucumber来写一个非常简单的单元测试。 定义一个需要测试的Calculator类如下:

1 class Calculator

2 def add num1, num2

3 num1+num2

4 end

5 end

用于测试Calculator类的add方法的feature文件如下:

1 Feature: Unit test for Calculator

2

3 Scenario: Add two numbers

4 Given I have a calculator created

5 When I add '3' and '5'

6 Then I should get the result of '8'

对应的step文件为:

1 require File.join(File.dirname(__FILE__), "../calculator")

2 require 'rspec'

3

4 Given /^I have a calculator created$/ do

5 @calculator = Calculator.new

6 end

7

8 When /^I add '([^"]*)' and '([^"]*)'$/ do |num1, num2|

9 @result = @calculator.add(num1.to_i, num2.to_i)

10 end

11

12 Then /^I should get the result of '([^"]*)'$/ do |expected_result|

13 @result.should == expected_result.to_i

14 end

在以上的step文件中,第1,2行分别require了自定义的Calculator类和rspec(用于assertion,参考第13行的“should”), 第5行新建了一个@calculator实例变量,第9行完成两个数相加(3+5),第13行为测试断言。运行cucumber命令,输出结果如下:

1 Feature: Unit test for Calculator

2

3 Scenario: Add two numbers # features/Calculator.feature:4

4 Given I have a calculator created # features/step_definitions/calculator_step.rb:4

5 When I add '3' and '5' # features/step_definitions/calculator_step.rb:8

6 Then I should get the result of '8' # features/step_definitions/calculator_step.rb:12

7

8 1 scenario (1 passed)

9 3 steps (3 passed)

10 0m0.002s

测试成功,没有看到任何Watir的影子。

(三)单独使用Watir

听说有非常fashionable的office lady用Watir来完成日常例行并且繁琐的网页点击工作的(当然不是测试),听说而已,但是Watir的确可以完成诸如此类的网页模拟操作,接下类我们就用Watir来完成google搜索功能,新建watir_google.rb文件并加入以下内容:

1 require 'watir-webdriver'

2 browser = Watir::Browser.new :chrome3 browser.goto "www.google.com/"

4 browser.text_field(:name => "q").set "ThoughtWorks"

5 browser.button(:name => "btnG").click

当执行到第2行时,一个浏览器窗口会自动打开,之后访问google主页(第3行),设置搜索关键词"ThoughtWorks",最后点击搜索按钮,单独运行Watir成功,没有任何Cucumber的影子。

(四)用Cucumber+Watir写自动化测试

由上文可知,Cucumber只是用接近自然语言的方式来描述业务行为,而Watir则只是对人为操作网页的模拟。当使用Cucumber+Watir实现自动化测试时,通过正则表达式匹配将Cucumber的行为描述与Watir的网页操作步骤耦合起来即可。同样以Google搜索为例,搜索关键字后,我们希望获得搜索结果,先用Cucumber完成搜索行为描述:

1 Feature:Google search

2 Scenario: search for keyword

3 Given I am on google home page

4 When I search for 'ThoughtWorks'

5 Then I should be able to view the search result of 'ThoughtWorks'

对应的Watir代码如下:

1 require "rubygems"

2 require "watir-webdriver"

3require 'rspec'

4 Given /^I am on google home page$/ do

5 @browser = Watir::Browser.new :chrome6 @browser.goto("www.google.com")

7 end

8

9 When /^I search for '([^"]*)'$/ do |search_text|

10 @browser.text_field(:name => "q").set(search_text)

11 @browser.button(:name => "btnK").click

12 end

13

14 Then /^I should be able to view the search result of '([^"]*)'$/ do |result_text|

15 @browser.text.should include(result_text)

16 end

运行cucumber,一个新的浏览器被打开,显示结果与(三)中相同。

(五)自动化测试的设计模式:Page对象

在上面的例子中,我们在所有的step中均直接对@browser对象进行操作,对于这样简单的例子并无不妥,但是对于动则几十个甚至上百个页面的网站来说便显得过于混乱,既然要面向对象,我们就希望将不同的页面也用对象来封装,于是引入Page对象,既可完成对页面的逻辑封装,又实现了分层重用。此时位于high-level的Cucumber文件无需变动,我们只需要定义一个Page对象来封装Google页面(google-page.rb):

1 require "rubygems"

2 require "watir-webdriver"

3 require "rspec"

4

5 class GooglePage

6 def initialize

7 @browser = Watir::Browser.new :chrome8 @browser.goto("www.google.com")

9 end

10

11 def search str

12 @browser.text_field(:name => "q").set(str)

13 @browser.button(:name => "btnK").click

14 end

15

16 def has_text text

17 @browser.text.should include(text)

18 end

19 end

相应的step文件需要做相应的修改:

1 require File.join(File.dirname(__FILE__), "google-page")

2

3 Given /^I am on google home page$/ do

4 @page = GooglePage.new

5 end

6

7 When /^I search for '([^"]*)'$/ do |search_text|

8 @page.search search_text

9 end

10

11 Then /^I should be able to view the search result of '([^"]*)'$/ do |result_text|

12 @page.has_text result_text

13 end

运行cucumber,一个新的浏览器被打开,显示结果与(三)中相同。

(六)加入角色用户

既然是行为驱动,既然是模拟用户实际操作,那么直接对Page对象进行操作也显得不够了,于是我们引入了角色用户User对象,对于拥有多种用户角色的网站来说特别实用。加入User对象之后,step文件中不再出现对Page对象的直接引用,而是在User对象的行为方法中进行引用,定义User对象如下(user.rb):

1 require File.join(File.dirname(__FILE__), "google-page")

2

3 class User

4 def initialize

5 @browser = Watir::Browser.new :chrome6 end

7

8 def visit_google

9 @page = GooglePage.new(@browser)

10 end

11

12 def search_text text

13 @page.search text

14 end

15

16 def assert_text_exist text

17 @page.has_text text

18 end

feature文件保持不变,在step文件用User代替Page:

1 require File.join(File.dirname(__FILE__), "user")

2

3 Given /^I am on google home page$/ do

4 @user = User.new

5 @user.visit_google

6 end

7

8 When /^I search for '([^"]*)'$/ do |search_text|

9 @user.search_text search_text

10 end

11

12 Then /^I should be able to view the search result of '([^"]*)'$/ do |result_text|

13 @user.assert_text_exist result_text

14 end

运行cucumber,一个新的浏览器被打开,显示结果与(三)中相同。

对于拥有多个用户角色的网站,比如又customer,administrator等,可分别对这些角色定义相应的对象,再在step文件中应用这些角色对象即可。

(七)用ruby的Module来封装不同的行为功能

对于单个用户来说,比如网上购物网站的customer,既要购物操作,又要能修改自己的profile,此时为了对这些不同的逻辑功能进行组织,可引入ruby中的Module来进行封装,即将costomer的不同行为功能模块封装在不同的module中,然后在customer对象中include这些Module。为简单起见,依然用Google搜索来进行演示,此时可将搜索功能加入到Module中,定义搜索module(search-behavior.rb)如下:

1 module SearchBehavior

2

3 def visit_google

4 @page = GooglePage.new(@browser)

5 end

6

7 def search_text text

8 @page.search text

9 end

10

11 def assert_text_exist text

12 @page.has_text text

13 end

14

15 end

在User对象中include该Module:

1 require File.join(File.dirname(__FILE__), "search-behavior")

2 class User

3 include SearchBehavior

4 def initialize

5 @browser = Watir::Browser.new :chrome6 end

对step文件和feature文件均不用修改,运行cucumber,一个新的浏览器被打开,显示结果与(三)中相同。

(八)总结

我们可以在Cucumber对应的step文件中直接访问Watir的API,这样的确也能达到测试目的,但这样的缺点在于缺少设计,于是我们引入Page对象来封装不同的页面,引入用户角色管理不同的用户行为,再引入Module来组织不同的功能模块,最后重构成了一个简单实用的自动化测试框架。

自动化测试框架cucumber_10分钟学会 Cucumber+Watir 自动化测试框架相关推荐

  1. 自动化测试框架cucumber_10分钟学会自动化测试框架--Cucumber + Watir

    估计你早已厌烦了成百上千遍的网页点击测试,至少之前的我是这样的,那么,让自己的web测试自动化吧,本文使用Cucumber + Watir来完成自动化测试,从最简单例子入手,一步一步重构成一个完整的自 ...

  2. 软件测试python测试步骤_软件测试员必备基础:3分钟带你入门自动化测试!

    目前自动化测试并不属于新鲜的事物,或者说自动化测试的各种方法论已经层出不穷,但是,能够明白自动化测试并很好落地实施的团队还不是非常多,我们接下来用通俗的方式来介绍自动化测试-- 首先我们从招聘岗位需求 ...

  3. 乐玩自动化测试模块_五大测试框架介绍,附带全套黑马自动化测试视频教程(完结)...

    这个框架需要开发数据表和关键字,这些数据表和关键字独立于执行它们的测试自动化工具,并可以用来"驱动"待测应用程序和数据的测试脚本代码,关键宇驱动测试看上去与手工测试用例很类似. 概述 在自动 ...

  4. python的web自动化框架实例_Selenium基于Python web自动化测试框架 -- PO

    关于selenium测试框架首先想到的就是PO模型,简单说下PO模型 PO模型的概念和理解: PO就是一个设计思想,将代码以页面为单位进行组织,针对这个页面上的所有信息.相关操作都放到一个类中,从而使 ...

  5. python代码写好了怎么运行并画图-无所不能的python编程是怎么快速画图的呢?5分钟学会!...

    原标题:无所不能的python编程是怎么快速画图的呢?5分钟学会! Python(发音:英[?pa?θ?n],美[?pa?θɑ:n]),是一种面向对象.直译式电脑编程语言,也是一种功能强大的通用型语言 ...

  6. python画图程序-无所不能的python编程是怎么快速画图的呢?5分钟学会!

    原标题:无所不能的python编程是怎么快速画图的呢?5分钟学会! Python(发音:英[?pa?θ?n],美[?pa?θɑ:n]),是一种面向对象.直译式电脑编程语言,也是一种功能强大的通用型语言 ...

  7. python自动化测试脚本可以测php吗_自动化测试,用Python还是Java?

    经常有测试新手问我:Python和Java语言,哪个更适合做自动化测试?这件事今天要好好说道说道.文章开始前,送上一波软件测试资料,希望大家在学习的过程中能顺顺利利:2020软件测试公开课程+讲义资料 ...

  8. python自动化测试开发_基于python的selenium2自动化测试从基础到实战(Python3、selenium2、自动化测试、web测试)...

    Selenium2是目前比较流行的一款针对web页面测试的自动化测试工具,他的前身是Selenium .Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE.Mozi ...

  9. python程序-30分钟学会用Python编写简单程序

    原标题:30分钟学会用Python编写简单程序 参与文末每日话题讨论,赠送异步新书 异步图书君 学习目标 知道有序的软件开发过程的步骤. 了解遵循输入.处理.输出(IPO)模式的程序,并能够以简单的方 ...

  10. python写软件实例-30分钟学会用Python编写简单程序

    原标题:30分钟学会用Python编写简单程序 参与文末每日话题讨论,赠送异步新书 异步图书君 学习目标 知道有序的软件开发过程的步骤. 了解遵循输入.处理.输出(IPO)模式的程序,并能够以简单的方 ...

最新文章

  1. Android gallery详解
  2. 基于XFS的NAS数据恢复可以做了
  3. 办公室里绝对不可谈论的4大话题
  4. java使用druid maven_SpringMVC+Spring+Mybatis整合,使用druid连接池,声明式事务,maven配置...
  5. [云炬创业基础笔记]第六章商业模式测试8
  6. PHP中文简繁互转代码 完美支持大陆、香港、台湾及新加坡
  7. Android 5.0 Screen pinning 屏幕固定功能
  8. jvisualvm工具使用
  9. 怎样当一个企业舍不得的人
  10. 漂亮的消息通知html邮件模板,好看的邮件模板?
  11. 工作三年,回顾一下工作历程
  12. java 整型数组定义_在Java中定义一个具有10个元素的整型数组a的语句是:___
  13. AI数字攻防看数字社会基建发展
  14. 3个小技巧,轻松提高抖音视频的播放量
  15. html静态页面--对我的idol相关内容的集合页面(徐明浩the 8)
  16. (1)计算机网络基础知识之网络的构成要素
  17. 账本进化-了解区块链
  18. 蓝桥杯官网python组基础练习-基础1-5
  19. CC2640R2F学习笔记(七.UART)
  20. 什么是准双向口,双向口?

热门文章

  1. 怎么复制黑苹果config配置_只需3步,实现黑苹果USB端口配置
  2. Android 仿ios四级联动地址选择器
  3. wps html编辑表格,WPS教你如何使用平板电脑创建和编辑表格批注
  4. C++编程笔记(QT)
  5. 计算机培训心得ppt展示,ppt制作学习心得
  6. jsp与jspx文件
  7. linux 文件去重
  8. 身份认证 对称密钥的认证协议 公开密钥的认证协议 公钥基础设施PKI
  9. 使用Kali Linux系统生成木马病毒并实现远程控制计算机
  10. java导出文件excle报错Failed to read zip entry source