使用ruby 1.9新特性进行自动化脚本的编写

昨天因为要装watir-webdriver的原因将用了快一年的ruby1.8.6升级到了1.9。由于1.9是原生支持unicode编码,所以我们可以使用中文进行自动化脚本的编写工作

  做了简单的封装后,我们可以实现如下的自动化测试代码。请注意,这些代码是可以正确运行并作为正式的自动化测试用例的。这样一来,自动化测试脚本跟手工测试用例就非常相似了,大言不惭的说相似程度可以达到60%。

  这样做有什么好处呢?

  ■ 手工测试用例更加容易“翻译”正自动化测试用例:

测试浏览器 = Watir::Browser.new :firefox
测试浏览器.转到 'www.google.com'
在(测试浏览器.的.text_field(:name, "q")).中.输入 "qq"
点击 测试浏览器.的.button(:name, "btnG")
等待(测试浏览器.的.div(:id, "resultStats"))
断言 '测试通过' if 测试浏览器.的.text.包含('腾讯QQ')
关闭 测试浏览器

  由于加入了符合自然语义的”的”及“在”函数,整个测试用例的自然度得到大大提升,基本可以做到不熟悉自动化代码的人员可以大致猜测到用例的真实用例。让用例自己说话,这比反复释疑和解惑要好上一些;

  ■ 手工测试人员编写用例的门槛相对降低:

  由于代码的灵活度及兼容性相对较大(ruby语言的特性)及测试api相对简单(watir的特性),手工测试人员应该可以更加方便的理解和编写代码,这样用例编写的门槛降低;

  ■ 用例维护成本降低:

  中文化的用例代码可以很容易的进行review。大家应该有这样的经验,在有些代码中会出现一些随意的ab, zb之类难以理解的变量或方法名。纠其原因无非是不好的编程习惯或词穷的英文积淀。用上中文之后这些情况会有很大好转。代码本地化这项工作日本这些年一直在做,而且成果丰硕。我们完全可以通过ruby借鉴这一点;

  ■ webdriver的强大特性

  上面的测试代码是基于watir-webdriver编写的。由于webdriver支持多种浏览器,如ff,chrome,safiri,ie等,代码的扩展性非常强。在配置合理及框架支撑的前提下,基本可以做到一套脚本多浏览器运行,这对回归测试来说应该是一个利好消息;

  当然,测试脚本中文化,自然化口语化也会带来一些列的问题,这点我们也必须清楚认识到。

  1.用例编写会相对费时一些;中英文结合编码在输入速度上确实不如纯英文;

  2.对程序员来说上面的代码会有些怪异或者是令人难以忍受的;对于完美主义者来说,上面的代码是“不纯粹”且有些难看的;

  总结一下,个人的观点如下:

  对于产品代码来说,中英文混编的风格目前来说应该是不合时宜的。但对于测试脚本来说,中文越多,用例可读性越高,自动化测试代码越接近手动用例,这反而应该是一件不错的事情。这在里先抛砖引玉,希望有志同道合者可以一起研究,让自动化脚本更加的人性、自然、可读、可维护。也许在不远的将来,手动用例可以直接拿来当自动化用例执行也未尝不可能。

  下面是用例的完整代码,由于只是演示兴致,因此只是随意在Module层进行了简单的可视化封装,过于简陋和demo,还望砖家手下留情。

# encoding: utf-8
require 'rubygems'
require 'watir-webdriver'
module CWrap
    def 点击(obj)
        obj.click rescue obj.class.to_s + '对象无法进行点击'
    end
    def 加载完毕()
        self
    end
    alias :中 :加载完毕
    alias :的 :中
    alias :应该 :的
    def 在(obj)
        obj
    end
    def 等待(obj)
        obj.wait_until_present rescue puts('该' + obj.class.to_s + '对象无法进行等待操作')
    end
    def 关闭(obj)
        obj.close rescue puts('无法关闭这个' + obj.class.to_s + '对象')
    end
    def 输入(text)
        self.set text rescue puts('这个' + self.class.to_s + '对象无法进行输入')
    end
    def 转到(url)
        self.goto url rescue puts(self.class.to_s + '对象不是一个浏览器对象')
    end
    def 包含(text)
        self.include? text rescue puts self.class.to_s + '对象无法进行包含操作'
    end
    def 断言(text)
        puts text
    end
end
include CWrap

测试浏览器 = Watir::Browser.new :firefox
测试浏览器.转到 'www.google.com'
在(测试浏览器.的.text_field(:name, "q")).中.输入 "qq"
点击 测试浏览器.的.button(:name, "btnG")
等待(测试浏览器.的.div(:id, "resultStats"))
断言 '测试通过' if 测试浏览器.的.text.包含('腾讯QQ')
关闭 测试浏览器

   



最新内容请见作者的GitHub页:http://qaseven.github.io/

   

你可能感兴趣的:(ruby,测试)