通过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/