因?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)告。