通过ruby编写测试脚本的时候,我还是喜欢采用yml来管理测试数据,就像以前的文章(Selenium WebDriver + Grid2 + RSpec之旅(五))提到的一样,但是在引用yml中的数据的时候采用
name = @data["data"]["logindata"]["wrong"]["username"]的方法显得非常臃肿,不方便阅读。
下面就通过定义一个函数来简化一下数据的引用
1 def hashes2ostruct(object) 2 return case object 3 when Hash 4 object = object.clone 5 object.each do |key,value| 6 object[key] = hashes2ostruct(value) 7 end 8 OpenStruct.new(object) 9 when Array 10 object = object.clone 11 object.map! {|i| hashes2ostruct(i) } 12 else 13 object 14 end 15 end
然后在加载yml文件的时候就通过这个函数来装饰一下,再次引用变量的时候就显得轻便多了
1 #encoding:utf-8 2 require 'selenium-webdriver' 3 require 'rspec' 4 require 'yaml' 5 require 'ostruct' 6 7 require File.dirname(__FILE__)+'/../../public/public' 8 require File.dirname(__FILE__)+'/../tool/login_dialog' 9 require File.dirname(__FILE__)+'/../action/login_page' 10 11 def hashes2ostruct(object) 12 return case object 13 when Hash 14 object = object.clone 15 object.each do |key,value| 16 object[key] = hashes2ostruct(value) 17 end 18 OpenStruct.new(object) 19 when Array 20 object = object.clone 21 object.map! {|i| hashes2ostruct(i) } 22 else 23 object 24 end 25 end 26 27 describe 'cnblogs main login page' do 28 include Login_Dialog 29 30 before (:all) do 31 @data = hashes2ostruct(YAML.load (File.open(File.dirname(__FILE__)+'/../config/login_data.yml'))) 32 end 33 #此处省略相对多余代码 34 35 context 'input the wrong passwd' do 36 it 'login failed,and return "用户名或密码错误"' do 37 name = @data.data.logindata.wrong.username 38 end 39 end 40 end
这样就清爽了吧,就像憋了好久的大便,一下子释放出来的感觉!(哈哈! 这个比喻有点太伤大雅了),希望对大家有用。
详情请访问http://www.dribin.org/dave/blog/archives/2006/11/17/hashes_to_ostruct/