2011-07-20 8 views
11

組み込みのRuby Minitestフレームワークを使用すると、スイート全体が実行される前に、あるいはTestClass全体が実行される前に一度コードを実行する方法がありますか? this questionの答えでは、すべてのテストが実行された後にTest :: Unit :: after_testsを使用してコードを実行することができます。すべてのテストを実行する前にコードを実行するのと同じ方法がありますか?Ruby Minitest:スイートレベルまたはクラスレベルの設定ですか?

この機能を使用して、テストが実行される前にテストデータベースを初期化し、テストが実行された後に引き裂くことができます。

ありがとうございます!

答えて

16

これは、MiniTest docs(カスタマイズ可能なテストランナータイプの下)から変更されています。もし私がMiniTest::Unit.runnerメソッドを持っていなかった代わりに、バンドル版の宝石を使用するを含ま

class Burger 
    def initialize 
    puts "YOU CREATED A BURGER" 
    end 

    def has_cheese? 
    true 
    end 

    def has_pickle? 
    false 
    end 
end 

gem 'minitest' 

require 'minitest/unit' 
MiniTest::Unit.autorun 

class MyMiniTest 
    class Unit < MiniTest::Unit 

    def before_suites 
     # code to run before the first test 
     p "Before everything" 
    end 

    def after_suites 
     # code to run after the last test 
     p "After everything" 
    end 

    def _run_suites(suites, type) 
     begin 
     before_suites 
     super(suites, type) 
     ensure 
     after_suites 
     end 
    end 

    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 BurgerTest < MiniTest::Unit::TestCase 

    def self.before_suite 
    p "hi" 
    end 

    def self.after_suite 
    p "bye" 
    end 

    def setup 
    @burger = Burger.new 
    end 

    def test_has_cheese 
    assert_equal true, @burger.has_cheese? 
    end 

    def test_has_pickle 
    assert_equal false, @burger.has_pickle? 
    end 

end 

注意。ここに出力があります。

Run options: --seed 49053 

# Running tests: 

"Before everything" 
"hi" 
YOU CREATED A BURGER 
.YOU CREATED A BURGER 
."bye" 
"After everything" 


Finished tests in 0.000662s, 3021.1480 tests/s, 3021.1480 assertions/s. 

2 tests, 2 assertions, 0 failures, 0 errors, 0 skips 

あなたは私が考えて探しているものである、だから、二回#setupを呼び出しますが、一度だけ.before_suite.after_suite

+0

D'OH!完全にドキュメントでそれを逃した。ありがとう!残念ながらバージョン5のランナーは –

+3

が削除されました...なぜ、minitestには非常に多くのフォークがあるのか​​説明していますが、動作させる前にパッチを当てるだけです。 – nus

0

前とMiniTestスイートのすべてのテストが実行された後の時間のハンドルを取得する別の方法は、これらのブロックは一度だけ呼び出されることを制御するsetup & teardown方法でifブロックを配置することです。

このようにして、テストスイートの開始時にブラウザやページオブジェクトなどの依存関係を一度だけロードし、最後にすべてのテストが完了したらブラウザを閉じることができます。ここで

はMiniTest 5.5.1とワチールを使用して、この例だ:

class CoolTests < Minitest::Test 

    @@setupComplete = false # tracks whether 1-time setup has completed, so we only instantiate a browser and dependent pages/modules one time per suite run 
    @@testsRun  = 0  # tracks how many tests have run so we can close the browser when all tests complete 

    def setup             # Minitest#setup runs before every #test method 
    @@testsRun+=1            # increment tetsRun indicating that a test has run 
    if ([email protected]@setupComplete)          # we load the browser and necessary page objects here one-time if we haven't already 
     @@driver = Watir::Browser.new :chrome     # instantiate new chrome browser 
     @@driver.window.maximize        # maximize the browser window so we expect to test against Desktop UI/UX rather than Mobile UI/UX 
     @@setupComplete = true         # setupComplete is now true as we've loaded up everything we need for our tests 
    end 
    end 

    def teardown             # Minitest#teardown runs after every #test method 
    if (@@testsRun == CoolTests.runnable_methods.length) # if we've run all the tests in the suite we are finished and can then close the browser 
     @@driver.quit 
    end 
    end 

    #Tests 

    def test_one 
    p __method__ 
    @@driver.goto('www.google.com') 
    assert_equal 'Google', @@driver.title, 'browser should be at google.com' 
    end 

    def test_two 
    p __method__ 
    @@driver.goto('www.bing.com') 
    assert_equal 'Bing', @@driver.title, 'browser should be at bing.com' 
    end 
関連する問題