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

  因?yàn)楣咀詣?dòng)化測(cè)試框架的一些要求,我們的ruby測(cè)試腳本(使用Test Unit)以如下形式組織:

  authentication(目錄名為feature名字)

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

  - 101_signature_with_invalid_key.rb

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

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

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

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

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

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)

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

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

require 'test/unit/testsuite'
 require 'test/unit/ui/console/testrunner'
 
 path = ARGV[0]    # 測(cè)試腳本所在的目錄
 $suite_names = []
 
 Dir.foreach(path) do |filename|
   if /d+_/ =~ filename    # 我們的命名規(guī)范是數(shù)字開頭,下劃線然后是簡(jiǎn)單描述。
     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等于動(dòng)態(tài)的插入了一段代碼。
     end
   end
 end
 
 Test::Unit::UI::Console::TestRunner.run(Suites)

  直接運(yùn)行"ruby run.rb authentication/"能運(yùn)行該目錄下所有腳本并得到Test-Unit的標(biāo)準(zhǔn)報(bào)告。

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