2013-08-21 163 views
0

考慮下面的代碼:按順序而不是平行運行最小運行測試?

require 'minitest/autorun' 
require '<some other stuff> 

class test < MiniTest::Unit::TestCase 
    def setup 
<setup some stuff> 
    end 
    def teardown 
    <teardown some stuff> 
    end 

    def test1 
    <test1 code> 
    end 
    def test2 
    <test2 code> 
    end 
end 

我怎樣才能讓MINITEST運行測試1和測試2都使用初始設置做呢?我問的原因是安裝程序實例化一個Selenium Webdriver實例並花費一些時間進行登錄/設置,並且我想使用同一個實例(而不是每次都實例化一個新實例)以縮短它花費的時間測試功能。

回答

0

你可以通過創建一個custom test runner type來做你想做的事情,它有一個前後測試方法。然後,您可以在所有測試之前創建一個selenium-webdriver實例,並在所有測試之後關閉它。

以下是啓動瀏覽器並在所有測試前轉到Google的示例。每個測試然後重新使用相同的瀏覽器。

require 'minitest/autorun' 
require 'selenium-webdriver' 

#Add before and after suite hooks using a custom runner 
class MyMiniTest 
    class Unit < MiniTest::Unit 
    def _run_suite(suite, type) 
     begin 
     suite.before_suite if suite.respond_to?(:before_suite) 
     super(suite, type) 
     ensure 
     suite.after_suite if suite.respond_to?(:after_suite) 
     end 
    end 
    end 
end 
MiniTest::Unit.runner = MyMiniTest::Unit.new 

class GoogleTest < MiniTest::Unit::TestCase 
    def self.before_suite 
    p "before all tests" 
    @@driver = Selenium::WebDriver.for :firefox 
    @@driver.navigate.to 'http://www.google.com' 
    end 

    def self.after_suite 
    p "after all tests" 
    @@driver.quit 
    end 

    def setup 
    p 'setup before each test' 
    end 

    def teardown 
    p 'teardown after each test' 
    end 

    def test1 
    p 'test1' 
    assert_equal(0, @@driver.find_elements(:xpath, '//div').length) 
    end 

    def test2 
    p 'test2' 
    assert_equal(0, @@driver.find_elements(:xpath, '//a').length) 
    end 
end 

你可以看到,事情是由輸出運行的順序:

"before all tests" 
"setup before each test" 
"test1" 
"teardown after each test" 
"setup before each test" 
"test2" 
"teardown after each test" 
"after all tests" 

注意,你想跨越測試共享變量將需要的類變量(即@@前綴)。

0

這是從一個測試點壞主意,但

你可以在一次測試中兩者都做測試和重用設置

還是把它拿出來安裝和拆卸,並添加一個輔助的方法來設置如果它還不是 並且從測試中調用它。第一次測試運行得當,其他人只是重複使用它。

然而,你應該做的是在單元測試中做一個模擬或存根,並將實際交易留給一個集成測試。

0

您是否需要Minitest,或者您可以更改爲測試單元?

隨着測試單位你可以使用 '測試::單位:: TestCase.startup and測試::單位:: TestCase.shutdown':

gem 'test-unit'#, '>= 2.1.1' #startup 
require 'test/unit' 
#~ require '<some other stuff> 

class MyTest < Test::Unit::TestCase 
    def self.startup 
    puts '<setup some stuff>' 
    end 
    def self.shutdown 
    puts '<teardown some stuff>' 
    end 

    def test1 
    puts '<test1 code>' 
    end 
    def test2 
    puts '<test2 code>' 
    end 
end 

參見can't get test unit startup to work in ruby 1.9.2

2

有一個在這個問題上我會嘗試解決很多假設。首先,Minitest不會並行運行測試。默認情況下Minitest按隨機順序運行測試。您可以通過覆蓋測試類中的test_order方法來更改測試的運行順序。

class MyTest < MiniTest::Unit::TestCase 
    def self.test_order 
    :sorted # Or :alpha, they both behave the same 
    end 
end 

但是,這不會讓你我想你問。這隻會使test1總是在test2之前運行。如果你已經編寫了你的​​測試,他們需要按順序運行,這纔有用。 (按字母順序排列,不一定是它們在類中定義的順序)。

測試類中的實例變量不在測試之間共享。意思是,test1MyTest的另一個實例上運行,而在test2上運行。爲了在測試之間共享對象,您需要將它們設置爲全局變量或類變量。

class MyTest < MiniTest::Unit::TestCase 
    def setup 
    @@this_thing ||= begin 
     # Really expensive operation here 
    end 
    end 
end 

希望這會有所幫助。

相關問題