2012-03-23 4 views

答えて

8

。サブクラスそれと、救出スクリーンショットを取り、リレイズする#run_test上書き:

class MyAbstractTestCase < Test::Unit::TestCase 
    def run_test(*args) 
    super(*args) 
    rescue 
    snapshot() 
    raise 
    end 
end 

を代わりに、と私はあなたがbefore_teardownフック使用することができ、これは最も簡潔な方法で実際にあると思う:

class MyTestCase < Test::Unit::TestCase 
    add_teardown_hook do |tc| 
    screenshot() unless tc.passed? 
    end 
end 

をこれは1.8のテスト/ユニットでは動作しませんが、最小値は1.9で動作します。

3

あなたは好きなようにTest::Unit::Assertionsを拡張することができますが、これを行うための組み込みの方法はないと思います。おそらく、この(クイック&汚い)のようなもの:

require 'test/unit' 

module Test::Unit::Assertions 
    def safe_assert(test, msg=nil) 
    passed = msg.nil? ? assert(test) : assert(test,msg) 
    ensure 
    puts 'take screenshot' unless passed 
    end 
end 

class MyTest < Test::Unit::TestCase 
    def setup 
    puts 'setup' 
    end 

    def teardown 
    puts 'teardown' 
    end 

    def test_something 
    safe_assert true 

    puts 'before failing assert' 
    safe_assert false, "message" 
    puts 'after failing assert' 
    end 
end 

出力:

Loaded suite unittest 
Started 
setup 
before failing assert 
take screenshot 
teardown 
F 
Finished in 0.001094 seconds. 

    1) Failure: 
test_something(MyTest) [unittest.rb:5]: 
message 

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

Test run options: --seed 58428 

EDIT:あなたが実際に簡単な方法でassertに引数を渡すことができます。

module Test::Unit::Assertions 
    def safe_assert(*args) 
    passed = assert(*args) 
    ensure 
    puts 'take screenshot' unless passed 
    end 
end 

も、あなただけが必要ならば、標準assertbegin - ensure - endブロックにラップすることができますこの機能はあまりありません:

class MyTest < Test::Unit::TestCase 
    def test_something 
    safe_assert true 

    puts 'before failing assert' 
    begin 
     passed = assert false, "message" 
    ensure 
     puts 'take screenshot' unless passed 
    end 
    puts 'after failing assert' 
    end 
end 

または次の例のようなスクリーンショットを確実にするメソッドを作成します。これは実際に私にクリーンな方法のように思える:あなたは1.9にしている場合は、お使いのベースクラスとしてテスト::ユニット:: TestCaseクラスを使用していない

def screenshot_on_fail 
    passed = yield 
ensure 
    puts 'take screenshot' unless passed 
end 

class MyTest < Test::Unit::TestCase 
    def test_something_else 
    screenshot_on_fail do 
     assert true 
    end 

    screenshot_on_fail do 
     assert false, 'message' 
    end 
    end 
end 
+0

これは良い方法ですね、ありがとう! –

+0

あなたは大歓迎です!それがあなたの問題を解決した場合、答えを受け入れることを忘れないでください:) –

+0

私の編集をチェックしてください、実際に私の心に来たこれまでにもっとクリーンな方法があります ':)' –

関連する問題