自動化測試時常用到的技術就是參數化,不支援參數化的測試架構是痛苦的。QTP自身本來就有,但是類似ruby的watir,以及selenium等都不是天然支援的,因為這些個架構只提供了最基礎的自動化驅動類庫,而驅動以外的執行管理、資料管理等又是一個課題。大部分的selenium和watir類似項目用的執行架構都是單元測試的架構,天然也不支援參數化。現在只有junit4版本支援參數化,以及testNG預設支援多種參數化。如果你開始項目的話可以優先考慮相容這些類似架構的語言來做自動化。
watir雖然本身不支援參數化,ruby的單元測試也不支援,但是參數化也要做啊,沒辦法只能想想變通的法子。所以單獨寫了一個參數化類別,來補充一下參數化功能的不足。其工作方式是提供統一的測試資料來源的資料讀取,在單元測試中調用這個介面,但是不指定具體的參數行,這個參數行在單獨的設定檔裡配置。這個就可以統一的管理每次測試執行時所取用的參數行內容了。下面的代碼是用來取用各種資料來源裡面的測試資料的。
#encoding: utf-8require 'DBI'require 'odbc_utf8'def generate_sql(table, what=nil, where=nil) what="*" unless what where="1=1" unless where "select %s from %s where %s" % [what, table, where]enddef generate_hash(header, all_data) t_arr = [] all_data.each do | row | t_hash = {} for i in 0..header.size-1 do t_hash[header[i]] = row[i] end t_arr << t_hash end t_arrenddef select_hash_db(dsn,user,password,db,sql) begin dbh = DBI.connect(dsn, user, password) dbh.do("use #{db}") dbh.do("SET NAMES UTF8") if dsn.split(':')[1] == "Mysql" sth = dbh.execute(sql) arr = Array.new sth.fetch_hash do | row | arr << row end sth.finish arr rescue DBI::DatabaseError => e puts "An error occurred" puts "Error code: #{e.err}" puts "Error message: #{e.errstr}" ensure dbh.disconnect if dbh endendclass Text_Adapter def initialize(file_path, sep=" ", col_num=nil, row_num=nil) end def get_pars(row=nil) endendclass Mysql_Adapter def initialize(ds_connector, table_name, what=nil, where=nil) @sql_str = generate_sql(table_name, what, where) @ds_connector = ds_connector end def get_pars(row=nil) dsc_arr = @ds_connector.split("#") all_data = select_hash_db(dsc_arr[0],dsc_arr[1],dsc_arr[2],dsc_arr[3],@sql_str) if row.class==Fixnum all_data[row] else all_data end endendclass Excel_Adapter def initialize(ds_connector, table_name, what=nil, where=nil) @connection = WIN32OLE.new('ADODB.Connection') @record_set = WIN32OLE.new('ADODB.Recordset') @ds_connector = ds_connector @sql_str = generate_sql(table_name, what, where) end def get_pars(row=nil) t_arr = [] @connection.Open(@ds_connector) @record_set.Open(@sql_str, @connection) @record_set.Fields.count.times do | i | t_arr << @record_set.Fields.Item(i).name end all_data = @record_set.GetRows.transpose all_data = generate_hash(t_arr, all_data) if row.class==Fixnum all_data[row] else all_data end endendclass Parameter def initialize(ds_connector, table_name, what=nil, where=nil) dsc_arr = ds_connector.split("#", 2) eval("@adp = #{dsc_arr[0]}.new dsc_arr[1], table_name, what, where") end def get_pars(row=nil) @adp.get_pars(row) endend
調用方法:
par = Parameter.new(Ds_mysql_connector, 'demo')p par.get_pars(0)
設定檔配置:
##連結excel中資料庫的串EXCEL_DSN = %{Excel_Adapter#Provider=MicroSoft.Jet.OLEDB.4.0;Data Source=%s;Extended Properties=Excel 5.0;}EXCEL_FILE = %{D:\\1.xlsx}##連結mysql的串Ds_mysql_connector = %{Mysql_Adapter#DBI:Mysql:shoppingcart:127.0.0.1#root#password#shoppingcart}##指定當次運行側事故參數的行號,從0開始PAR_ROW = 1
相應的檔案指向路徑、ip地址、資料庫名、使用者名稱、密碼等需要修改