您的位置:軟件測試 > 開源軟件測試 > 開源功能測試工具 >
Ruby元編程在測試中的一點小實踐
作者:網(wǎng)絡(luò)轉(zhuǎn)載 發(fā)布時間:[ 2013/5/28 10:20:28 ] 推薦標簽:

  因為公司自動化測試框架的一些要求,我們的ruby測試腳本(使用Test Unit)以如下形式組織:

  authentication(目錄名為feature名字)

  - 100_signature.rb (100為測試用例在TestLink對應(yīng)的ID,后面為簡單描述)

  - 101_signature_with_invalid_key.rb

  在每個測試腳本中,測試類根據(jù)ID命名,比如100_xxx.rb中code如下:

1 class TC_100 < Test::Unit::TestCase
2   # …
3 end

  這種組織形式給我們的日常執(zhí)行帶來了一些小麻煩,比如想執(zhí)行一個folder下的所有測試用例,只有采用以下兩種方式:

  1)寫個shell腳本,然后執(zhí)行完后必須從很長的log中自己手工找出執(zhí)行狀況。

  2)維護如下文件管理所有用例:

require 'test/unit/testsuite'
 require 'test/unit/ui/console/testrunner'
 
 require 'authentication/100_xxx.rb'
 require 'authentication/101_xxx.rb'
 
 class Suites << Test::Unit::TestSuite
   def self.suit
     suites = self.new('Suites')
     suites << TC_100.suite
     suites << TC_101.suite
   end
 end
 
 Test::Unit::UI::Console::TestRunner.run(Suites)

  但是這個方法有個問題,必須長期手工維護。比如每次添加新的用例必須手動修改此文件以保持一致。

  Ruby語言是強大的,靈活的,我們可以利用元編程的一些基本特性比如eval來輕松解決這個問題。在解決方案2的基礎(chǔ)上新代碼如下:

require 'test/unit/testsuite'
 require 'test/unit/ui/console/testrunner'
 
 path = ARGV[0]    # 測試腳本所在的目錄
 $suite_names = []
 
 Dir.foreach(path) do |filename|
   if /d+_/ =~ filename    # 我們的命名規(guī)范是數(shù)字開頭,下劃線然后是簡單描述。
     require "#{path}/#{filename}"
     testcase_id = filename.split('_')[0]
     $suite_names << "TC_#{testcase_id}"
   end
 end
 
 class Suites << Test::Unit::TestSuite
   def self.suit
     suites = self.new('Suites')
     suite_names.each do |suite_name|
       suites << eval("::#{suite_name}.suite")    # 這段是關(guān)鍵,利用eval等于動態(tài)的插入了一段代碼。
     end
   end
 end
 
 Test::Unit::UI::Console::TestRunner.run(Suites)

  直接運行"ruby run.rb authentication/"能運行該目錄下所有腳本并得到Test-Unit的標準報告。

軟件測試工具 | 聯(lián)系我們 | 投訴建議 | 誠聘英才 | 申請使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權(quán)所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd