2013-04-08 66 views
4

我在使用我的測試類中定義的全局變量時遇到了問題,該類在庫文件中被引用。我使用的是Ruby 1.9.3p392和測試單元2.5.4。在ruby單元測試中訪問全局變量

這是一個運行測試代碼:

require 'rubygems' 
gem 'test-unit' 
require 'test/unit' 
require 'ci/reporter/rake/test_unit_loader' 
load '../lib/functions.rb' 
require 'watir' 

class Test_002 < Test::Unit::TestCase 

    include Functions 

    class << self 
    def startup 
     @browser = Watir::Browser.new :ie 
     @browser.speed = :fast 
    end 

    def shutdown 
     @browser.close 
    end 
    end 

    def test_001_login 
    login('some_url', 'some_user', 'some_passw') 
    end 
end 

這是包含登錄功能庫的一部分:

require 'rubygems' 

module Functions 

    def login(url, user, passw) 
    @browser.goto(url) 
    ... 
    end 
end 

這是輸出:

Started 
E 
=============================================================================== 
Error: test_001_login(Test_002) 
    NoMethodError: undefined method `goto' for nil:NilClass 
(...) 
    23: end 
    24: 
    25: def test_001_login 
    => 26:  login('some_url', 'some_user', 'some_passw') 
    27: end 
    28:  
    29: end 
=============================================================================== 

Finished in 3.0043 seconds. 

1 tests, 0 assertions, 0 failures, 1 errors, 0 pendings, 0 omissions, 0 notifications 
0% passed 

0.33 tests/s, 0.00 assertions/s 

任何想法?

回答

2

實例變量(即@browser)將無法使用到TES TS。基於這個舊的論壇主題,http://www.ruby-forum.com/topic/144884,它是由設計:

該行爲是有意設計的。 「測試隔離」的理想意味着每次測試用例開始時,您都不需要花太多精力去弄清楚問題。否則,測試可能依賴於以前測試中的@value,並且可能以您未注意到的方式依賴它。

當然,其他任何持久變量都可能會破壞測試隔離。我們不會在每個測試用例之間停止並重新啓動Ruby。但至少在發生時,@instance變量不會被指責。

我曾經使用過的一種解決方法是在測試中使用相同的瀏覽器使用類變量(即@@browser)。該創業公司看起來如下所示。其他方法同樣必須更新爲使用@@browser

def startup 
    @@browser = Watir::Browser.new :ie 
    @@browser.speed = :fast 
end 
+0

這是有道理的。也許這不是我想要實現的最佳設置。我創建了一個測試套件,並且構建它的方式是在Watir中自動包含測試用例,並將每個塊(步驟+驗證)定義爲單元測試用例。 這就是我試圖創建@browser實例,然後將其餘步驟作爲單元測試運行的原因。有沒有更好的方法來處理這個問題? – Tedi 2013-04-09 08:00:28

+4

這聽起來像是你計劃在測試用例中進行每個測試都依賴於之前的測試(即測試002取決於測試001結束時的瀏覽器狀態)。我曾經用過這樣的測試套件;這並不理想。如果一次測試失敗,則必須重新運行一切以重新檢查測試。共享瀏覽器實例(以保存瀏覽器的啓動/關閉)很好。但測試本身不應該依賴。 – 2013-04-09 12:49:03

3

您的預測試初始化​​代碼未運行。

的TestUnit框架預計設置代碼是在一個名爲setup方法和拆解代碼是在一個名爲teardown

你有兩個選擇要麼重命名方法startupsetup和方法shutdownteardown方法或者,如果你需要設置/關機用於其他目的,創建委託方法:在startup方法定義

def setup 
    startup 
end 

def teardown 
    shutdown 
end 
+1

我相信預測試初始化​​代碼正在運行。新版本的測試單元有一個[startup](http://test-unit.rubyforge.org/test-unit/Test/Unit/TestCase.html#method-c-startup)和[shutdown](http: //test-unit.rubyforge.org/test-unit/Test/Unit/TestCase.html#method-c-shutdown)方法。 – 2013-04-08 17:38:38