teardown
が実行される前に、Test::Unit
のRubyユニットテストで失敗したアサートの直後に自分のコードを実行する方法がありますか?Rubyユニットテスト:それぞれ失敗したテストの後にいくつかのコードを実行します
私はいくつかの自動GUIテストを行っており、何かが失敗した直後にスクリーンショットを撮りたいと考えています。
teardown
が実行される前に、Test::Unit
のRubyユニットテストで失敗したアサートの直後に自分のコードを実行する方法がありますか?Rubyユニットテスト:それぞれ失敗したテストの後にいくつかのコードを実行します
私はいくつかの自動GUIテストを行っており、何かが失敗した直後にスクリーンショットを撮りたいと考えています。
。サブクラスそれと、救出スクリーンショットを取り、リレイズする#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で動作します。
あなたは好きなように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
も、あなただけが必要ならば、標準assert
をbegin
- 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
これは良い方法ですね、ありがとう! –
あなたは大歓迎です!それがあなたの問題を解決した場合、答えを受け入れることを忘れないでください:) –
私の編集をチェックしてください、実際に私の心に来たこれまでにもっとクリーンな方法があります ':)' –