2012-03-23 12 views
5

के बाद कुछ कोड चलाएं Test::Unit में रूबी यूनिट परीक्षणों में विफल असर के बाद मेरे कोड को निष्पादित करने के लिए कुछ साफ और सुरुचिपूर्ण तरीका है, teardown निष्पादित होने से पहले?रूबी यूनिट परीक्षण: प्रत्येक असफल परीक्षण

मैं कुछ स्वचालित जीयूआई परीक्षण कर रहा हूं और कुछ विफल होने के बाद स्क्रीनशॉट लेना चाहता हूं।

उत्तर

8

आप 1.9 पर हैं, तो अपने आधार वर्ग के रूप में उपयोग नहीं करते टेस्ट :: यूनिट :: testcase। उपवर्ग यह और #run_test ओवरराइड, बचाव स्क्रीनशॉट लेकर उसे reraise रहे हैं:

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 

संपादित करें: आप वास्तव में एक सरल तरीका था assert को आर्ग गुजारें सकता:

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

, आप begin - ensure - end ब्लॉक में केवल मानक assert को लपेट सकते हैं यदि आपको केवल आवश्यकता है यह कार्यक्षमता अकसर:

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 

या आप एक विधि बनाते हैं जो निम्न उदाहरण में स्क्रीनशॉट सुनिश्चित करता है। यह वास्तव में मेरे लिए स्पष्ट तरीका की तरह लगता है:

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

मेरा संपादन देखें, वास्तव में मेरे मन में आने के लिए वास्तव में एक बहुत साफ तरीका है:: ' –

संबंधित मुद्दे