2012-02-28 62 views
1

這個問題聽起來很愚蠢,但我從來沒有在網上找到答案來做到這一點。 假設你有一個測試套件,這樣的頁面: http://en.wikibooks.org/wiki/Ruby_Programming/Unit_testing 或代碼:Ruby測試:單元,如何知道測試套件中每個測試用例的失敗/傳遞狀態?

require "simpleNumber" 
require "test/unit" 

class TestSimpleNumber < Test::Unit::TestCase 

    def test_simple 
    assert_equal(4, SimpleNumber.new(2).add(2)) 
    assert_equal(4, SimpleNumber.new(2).multiply(2)) 
    end 

    def test_typecheck 
    assert_raise(RuntimeError) { SimpleNumber.new('a') } 
    end 

    def test_failure 
    assert_equal(3, SimpleNumber.new(2).add(2), "Adding doesn't work") 
    end 

end 

運行的代碼(什麼樣的)

>> ruby tc_simpleNumber2.rb 
Loaded suite tc_simpleNumber2 
Started 
F.. 
Finished in 0.038617 seconds. 

    1) Failure: 
test_failure(TestSimpleNumber) [tc_simpleNumber2.rb:16]: 
Adding doesn't work. 
<3> expected but was 
<4>. 

3 tests, 4 assertions, 1 failures, 0 errors 

現在,如何使用一個變量來保存測試結果? 例如,像這樣的數組:

[{:name => 'test_simple', :status => :pass}, 
    {:name => 'test_typecheck', :status => :pass}, 
    {:name => 'test_failure', :status => :fail},] 

我是新來的測試,而是不顧一切地知道答案......

+0

你到底想幹什麼?據我所知,你可以從命令行運行文件,在這種情況下,測試/單元將報告單個失敗的測試。 – 2012-02-28 23:36:25

+0

將結果保存在Excel文件中。我的目標是將每個測試用例的通過/失敗狀態保存到一個Excel文件中。結果如'已啓動F ..在0.016001秒內完成.3次測試,3次斷言,1次失敗,0次錯誤'不能說明細節;它確實告訴行號失敗,但仍然不好格式 – 2012-02-29 04:13:13

+0

我有測試套件包括許多測試用例,單獨運行它們是一種方式,但仍然需要編寫一個幼稚的函數來收集屏幕結果...似乎繞道而行... – 2012-02-29 04:17:47

回答

0

您可以檢查出其他的Nat's posts一種方式來捕獲結​​果。你的問題的簡短答案是沒有變量來捕獲結果。你得到的是:

加載套房我的特別測試

開始
..

在1.000935秒完成。

2的測試中,2個斷言,0失敗,0錯誤

,如果你想給別人發生了什麼報告,該報告是不是非常有幫助。 Nat的另一篇文章演示瞭如何在rspec中包裝Test :: Unit以獲得更好的結果和更大的靈活性。

+0

感謝您的建議,確實有所幫助,我需要更多研究......謝謝! – 2012-02-29 04:34:13

1

您需要執行您的測試腳本文件,就是這樣,結果將顯示通過或失敗。

假設你保存文件test_unit_to_rspec.rb,之後執行以下命令

ruby test_unit_to_rspec.rb 
+0

是的,像這樣的'3個測試,3個斷言,1個失敗,0個錯誤'的結果報告結果,但它不夠詳細......除非我分別分開每個test_case,分別運行它們,使用樸素的函數收集這些輸出結果...似乎工作太多,而不是一個優雅/ Ruby的方式來做事情... – 2012-02-29 04:19:56

+0

你正在使用哪個操作系統?如果你使用Mac或Unix/Linux,我會回覆你如何使用優雅的方式來顯示紅寶石。 – 2012-02-29 16:39:10

+0

我在Windows上使用它,但稍後將在Linux上部署它。所以,請以優雅的方式去探索。欣賞它,阿米特。 – 2012-02-29 21:54:56

1

與設定較高的詳細級別,在測試運行通話問題解決了。

http://ruby-doc.org/stdlib-1.8.7/libdoc/test/unit/rdoc/Test/Unit/UI/Console/TestRunner.html

require 'test/unit' 
require 'test/unit/ui/console/testrunner' 

class MySuperSuite < Test::Unit::TestSuite 
    def self.suite 
     suites = self.new("My Super Test Suite") 
     suites << TestSimpleNumber1 
     suites << TestSimpleNumber2 
     return suites 
    end 
end 

#run the suite 
# Pass an io object 
#new(suite, output_level=NORMAL, io=STDOUT) 
runner = Test::Unit::UI::Console::TestRunner.new(MySuperSuite, 3, io) 

結果將在一個不錯的格式FO每個測試用例被保存在IO流。

0
class Test::Unit::TestCase 
    def setup 
    @id = self.class.to_s() 
    end 


    def teardown 
    @test_result = "pass" 

    if(@_result.failure_count > 0 || @_result.error_count > 0) 
     @test_result = "fail" 
     # making sure no errors/failures exist before the next test case runs. 
     i = 0 
     while(i < @_result.failures.length) do 
     @_result.failures.delete_at(i) 
     i = i + 1 
     end 
     while(i < @_result.errors.length) do 
     @_result.errors.delete_at(i) 
     i = i + 1 
     end 
     @test_result = "fail" 
    end # if block ended 
    puts"#{@id}: #{@test_result}" 
    end # teardown definition ended 
end # class Test::Unit::TestCase ended 

輸出示例:

test1: Pass 
test2: fail 
so on.... 
相關問題