Watir的使用環(huán)境搭建
1、watir環(huán)境工具安裝包:
1) ruby186-26.exe下載地址:http://files.rubyforge.vm.bytemark.co.uk/rubyinstaller/
2) watir-1.5.2.gem下載地址:http://rubyforge.org/frs/?group_id=104&release_id=28016
3)rubygems-update-1.3.7.gem下載地址:http://rubyforge.org/frs/?group_id=126
2、firewatir環(huán)境工具安裝包:
1)步驟1中的軟件包
2)Firefox2.0下載地址:http://www.hacker.cn/Get/gjrj/06102608545293311.shtml
3)firefox插件:firbug1.05,JSSh。Jssh下載地址:地址
4)Firewatir-1.1下載地址:http://rubyforge.org/frs/?group_id=104&release_id=28017
3、watir安裝
1)安裝ruby186-26.exe;
2)升級(jí)gem,把gem包拷貝到ruby安裝目錄,在命令行輸入命令:gem install rubygems-update 1.3.7.gem(gem包名)。提醒:安裝完后進(jìn)入ruby目錄:lib\ruby\gems\1.8\gems\rubygems-update-1.3.4,點(diǎn)擊這個(gè)文件夾中的文件:setup.rb,升級(jí)gem即可
3) 安裝watir包,把watir包拷貝到ruby安裝目錄,使用命令行進(jìn)入ruby安裝的目錄,輸入命令:gem install watir-1.5.2.gem。
4)使用命令gem list查看是否安裝成功。
4、安裝firewatir
1)安裝firefox和firebug,Jssh插件,安裝方法:打開firefox瀏覽器,點(diǎn)擊“文件”/“打開”,選擇插件文件名,安裝即可。
2)安裝firewatir,使用命令行進(jìn)入ruby安裝的目錄,輸入命令:gem install firewatir-1.1.gem
5、測(cè)試firewatir是否安裝成功?
使用命令行進(jìn)入firewatir安裝路徑下(\ruby\lib\ruby\gems\1.8\gems\firewatir-1.1),進(jìn)入unittests文件夾,輸入命令:ruby mozilla_all_tests.rb,如果可以正確執(zhí)行程序,說明安裝正確沒有問題,到此可以開始自動(dòng)化測(cè)試開發(fā)的旅程了。
6、在安裝watir過程出現(xiàn)'nmake' 不是內(nèi)部或外部命令,也不是可運(yùn)行的程序或批處理文件。
使用命令
1
|
gem install - -local watir-1.5.2.gem |
就安裝成功了!
讀取各種數(shù)據(jù)源中的測(cè)試參數(shù)化數(shù)據(jù)
自動(dòng)化測(cè)試時(shí)常用到的技術(shù)就是參數(shù)化,不支持參數(shù)化的測(cè)試框架是痛苦的。QTP自身本來就有,但是類似ruby的watir,以及selenium等都不是天然支持的,因?yàn)檫@些個(gè)框架只提供了最基礎(chǔ)的自動(dòng)化驅(qū)動(dòng)類庫,而驅(qū)動(dòng)以外的執(zhí)行管理、數(shù)據(jù)管理等又是一個(gè)課題。大部分的selenium和watir類似項(xiàng)目用的執(zhí)行框架都是單元測(cè)試的框架,天然也不支持參數(shù)化?,F(xiàn)在只有junit4版本支持參數(shù)化,以及testNG默認(rèn)支持多種參數(shù)化。如果你開始項(xiàng)目的話可以優(yōu)先考慮兼容這些類似框架的語言來做自動(dòng)化。
watir雖然本身不支持參數(shù)化,ruby的單元測(cè)試也不支持,但是參數(shù)化也要做啊,沒辦法只能想想變通的法子。所以單獨(dú)寫了一個(gè)參數(shù)化的類,來補(bǔ)充一下參數(shù)化功能的不足。其工作方式是提供統(tǒng)一的測(cè)試數(shù)據(jù)源的數(shù)據(jù)讀取,在單元測(cè)試中調(diào)用這個(gè)接口,但是不指定具體的參數(shù)行,這個(gè)參數(shù)行在單獨(dú)的配置文件里配置。這個(gè)就可以統(tǒng)一的管理每次測(cè)試執(zhí)行時(shí)所取用的參數(shù)行內(nèi)容了。下面的代碼是用來取用各種數(shù)據(jù)源里面的測(cè)試數(shù)據(jù)的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
#encoding: utf-8 require '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] end def 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_arr end def 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 end end class Text_Adapter def initialize(file_path, sep= " " , col_num= nil , row_num= nil ) end def get_pars(row= nil ) end end class 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 end end class 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 end end class 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) end end |
調(diào)用方法:
1
2
|
par = Parameter. new (Ds_mysql_connector, 'demo' ) p par.get_pars( 0 ) |
配置文件配置:
1
2
3
4
5
6
7
|
##鏈接excel中數(shù)據(jù)庫的串 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} ##指定當(dāng)次運(yùn)行側(cè)事故參數(shù)的行號(hào),從0開始 PAR_ROW = 1 |
相應(yīng)的文件指向路徑、ip地址、數(shù)據(jù)庫名、用戶名、密碼等需要修改