【问题标题】:How assertion counts are calculated in test unit如何在测试单元中计算断言计数
【发布时间】:2015-09-07 06:47:57
【问题描述】:

方法一:-

test.rb

class Test < Test::Unit::TestCase
  def test_sample
    assert_true(test)
    assert_equal(a,b)
  end
end

结果:- 在 38.329532529 秒内完成。

1 tests, 2 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
100% passed

方法二:-

test.rb

class Test <  Test::Unit::TestCase
require 'helper'
include AssertionHelper
  def test_sample
    test_assertion
  end
end

helper.rb

include Test::Unit::Assertions
module AssertionHelper
  def test_assertion
    assert_true(test)
    assert_equal(a,b)
  end
end

结果:-

Finished in 38.329532529 seconds.

1 tests, 2 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
100% passed

方法三:-

test.rb

class Test <  Test::Unit::TestCase
require 'helper'
  def test_sample
    AssertionHelper.test_assertion()
  end
end

helper.rb

 include Test::Unit::Assertions
    module AssertionHelper
      def self.test_assertion
        assert_true(test)
        assert_equal(a,b)
      end
    end

结果:-

Finished in 38.329532529 seconds.

1 tests, 0 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
100% passed

使用方法 3 时,我得到的断言计数为“0”而不是“2”。

我可以使用方法 2 将断言计数设为 2 吗?

【问题讨论】:

  • 为什么要将断言包装到一个单独的模块中?
  • @Anatoly 我有共同的断言语句要验证更多的测试文件。所以我把常见的断言放在一个帮助文件中,并从测试文件中调用它。
  • test_helper.rb 用于常用功能,但 assertions 必须在测试中
  • @Anatoly 是的,我明白了。我不想在所有测试失败中重复断言语句。有没有办法从帮助文件中获取断言计数。
  • 好问题。很想看到它的好答案。

标签: ruby assertions testunit


【解决方案1】:

您可以将当前的TestCase 传递给您的模块,如下所示:

sample_test.rb:

require 'test-unit'
require 'helper'

def a; true ; end
def b; true ; end
def test; true ; end

class SampleTest < Test::Unit::TestCase
    def test_sample
        AssertionHelper.my_assertion(self)
    end
end

helper.rb:

module AssertionHelper   
    def self.my_assertion(test_case)
      test_case.instance_exec do
        assert_true(test)
        assert_equal(a, b)
      end
    end
end

【讨论】:

    【解决方案2】:

    对不起,我无法重现您的情况,请您提供Test::Unit 版本和您的ruby 版本吗?最棒的是你的 Gemfile 和 Gemfile.lock。以下设置适用于我(我使用 ruby​​ 2.2.0 和 test-unit 3.0.8):

    ruby-2.2.0 in ~/projects/test-unit ♥ tree
    .
    ├── Gemfile
    ├── Gemfile.lock
    └── test
        ├── helper.rb
        └── sample_test.rb
    
    1 directory, 4 files
    
    ruby-2.2.0 in ~/projects/test-unit ♥ cat Gemfile
    # A sample Gemfile
    source "https://rubygems.org"
    
    # gem "rails"
    gem 'test-unit', '~> 3.0.8'
    ruby-2.2.0 in ~/projects/test-unit ♥ cat Gemfile.lock
    GEM
      remote: https://rubygems.org/
      specs:
        power_assert (0.2.2)
        test-unit (3.0.8)
          power_assert
    
    PLATFORMS
      ruby
    
    DEPENDENCIES
      test-unit (~> 3.0.8)
    

    sample_test.rb:

    require 'test-unit'
    
    def a; true ; end
    def b; true ; end
    def test; true ; end
    
    class SampleTest < Test::Unit::TestCase
        require 'helper'
        include AssertionHelper
        def test_sample
            my_assertion
        end
    end
    

    helper.rb:

    module AssertionHelper
        def my_assertion
            assert_true(test)
            assert_equal(a, b)
        end
    end
    

    运行 testrb 给出 2 个断言,正如预期的那样。

    ruby-2.2.0 in ~/projects/test-unit ♥ testrb 
    Loaded suite .
    Started
    .
    
    Finished in 0.000828 seconds.
    
    1 tests, 2 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
    100% passed
    
    1207.73 tests/s, 2415.46 assertions/s
    ruby-2.2.0 in ~/projects/test-unit ♥ 
    

    更新:这实际上很奇怪,您没有收到任何错误(在您的方法 3 上),因为我得到了这个:NoMethodError: undefined method 'assert_true' for AssertionHelper:Module 这是真的,因为 AssertionHelper 没有t 实现任何其他方法,您不能在其上运行任何 assert_* 方法。只需使用我上面的代码(你的方法2),你应该没问题。如果您仍然好奇可以做什么,请查看Test::Unit::Assertions,其中还定义了很多内置断言,也许您会觉得有用。

    或者,更好的是,使用 MiniTest 或 RSpec,因为 Test::Unit is deprecated 并且仅保留在标准库中用于旧版测试套件。

    【讨论】:

    • 在 helper.rb 中包含“include Test::Unit::Assertions”。您的 assert_true 错误将得到解决。
    • 你应该extend它,而不是include。是的,这修复了错误,但这并不能解决您的问题 - 模块中的断言仍然不计算在内。这是因为add_assertion 方法在Test::Unit::Assertions 中为空。要使其工作,您需要将Test::Unit::TestCase 的实例传递给它,以便您可以从模块的add_assertion 调用它的add_assertion 方法以使其计数。总而言之,实现起来太麻烦了,所以我更喜欢我上面的解决方案。你为什么不喜欢它?
    • 哦,现在我明白了。你在module AssertionHelperoutside 中包含了Test::Unit::Assertions,永远不要在你的代码中这样做。 Test::Unit::Assertions 的所有方法都包含在Object 中,现在它们存在于系统中的每个对象中,这很糟糕。您应该在 AssertionHelper 模块中完成 extend Test::Unit::Assertions ,尽管如上所述并不能解决断言计数器的问题。
    • 感谢您的回答。我现在应该怎么做才能从助手那里获得断言计数。你能给我示例代码或编辑我的代码并发送它
    • 你为什么不想使用我上面的解决方案?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多