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

kuhbmx9i  于 2023-02-03  发布在  Ruby
关注(0)|答案(5)|浏览(170)

这个问题听起来很愚蠢,但是我从来没有在网上找到过这样做的答案。假设你有一个像这个页面一样的测试套件: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},]

我是测试新手,但迫切想知道答案...

pieyvz9o

pieyvz9o1#

你需要执行你的测试脚本文件,就是这样,结果会显示通过或失败。
假设您保存文件test_unit_to_rspec.rb,然后执行以下命令

ruby test_unit_to_rspec.rb
uhry853o

uhry853o2#

解决了在测试运行器调用中设置高详细级别的问题。
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流中。

xt0899hw

xt0899hw3#

使用'-v'(详细)会怎样:

ruby test_unit_to_rspec.rb -v

这将显示更多信息

yhived7q

yhived7q4#

您可以查看另一个Nat's posts来获取结果。对您的问题的简短回答是没有用于获取结果的变量。您得到的是:
加载套件我的特殊测试
开始日期
..
用时1.000935秒。
2个测试,2个Assert,0个失败,0个错误
如果你想向其他人报告发生了什么,这不是很有帮助。Nat的另一篇文章展示了如何在rspec中 Package Test::Unit以获得更好的结果和更大的灵活性。

vojdkbi0

vojdkbi05#

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....

相关问题