Ruby Test:单元,如何知道测试套件中每个测试用例的失败/通过状态?

时间:2012-02-28 06:36:31

标签: ruby unit-testing testing testunit

这个问题听起来很愚蠢,但我从来没有在网上找到答案。 假设你有一个像这个页面的测试套件: http://en.wikibooks.org/wiki/Ruby_Programming/Unit_testing 或代码:

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},]

我是测试的新手,但我不顾一切地想知道答案......

4 个答案:

答案 0 :(得分:1)

您需要执行测试脚本文件,就是这样,结果将显示通过或失败。

假设您保存文件test_unit_to_rspec.rb,之后执行以下命令

ruby test_unit_to_rspec.rb

答案 1 :(得分: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)

结果将以适合每个测试用例的格式保存在io流中。

答案 2 :(得分:0)

您可以查看另一个Nat's posts以获取捕获结果的方法。对您的问题的简短回答是没有用于捕获结果的变量。你得到的只有:

  

加载套件我的特殊测试

     

发起者
  ..

     

以1.000935秒结束。

     

2次测试,2次断言,0次失败,0次错误

如果您想向其他人报告发生的事情,这对您没有多大帮助。 Nat的另一篇文章展示了如何在rspec中包装Test :: Unit以获得更好的结果和更大的灵活性。

答案 3 :(得分:0)

<?php the_posts_pagination(
array(
'prev_text' => __( 'Prev', 'btimes' ),
'next_text' => __( 'Next', 'btimes' ),
'screen_reader_text' => ' '
) ); ?>

示例输出:

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