【问题标题】:How do I effectively force Minitest to run my tests in order?我如何有效地强制 Minitest 按顺序运行我的测试?
【发布时间】:2012-01-06 02:20:19
【问题描述】:

我知道。这是不鼓励的。由于我不会进入的原因,我需要按照编写的顺序运行我的测试。根据文档,如果我的测试类(我们称之为TestClass)扩展了Minitest::Unit::TestCase,那么我应该能够调用公共方法i_suck_and_my_tests_are_order_dependent!(哎呀——你认为创建Minitest的人对那个有意见?)。此外,还可以选择调用名为test_order 的方法并指定:alpha 以覆盖:random 的默认行为。这些都不适合我。

这是一个例子:

class TestClass < Minitest::Unit::TestCase

  #override random test run ordering
  i_suck_and_my_tests_are_order_dependent!

  def setup
    ...setup code
  end

  def teardown
    ...teardown code
  end

  def test_1
    test_1 code....
    assert(stuff to assert here, etc...)
    puts 'test_1'
  end

  def test_2
    test_2_code
    assert(stuff to assert here, etc...)
    puts 'test_2'
  end

end

当我运行它时,我得到:

undefined method `i_suck_and_my_tests_are_order_dependent!' for TestClass:Class (NoMethodError)

如果我用顶部的方法替换 i_suck 方法调用:

def test_order
  :alpha
end

我的测试运行了,但我可以从 puts 中得知每种方法在我每次运行测试时仍然以随机顺序运行。

有谁知道我做错了什么? 谢谢。

【问题讨论】:

    标签: ruby minitest


    【解决方案1】:

    如果您只是将 test_order: alpha 添加到您的测试类,测试将按顺序运行:

    class TestHomePage
    
    def self.test_order
     :alpha
    end
    
    def test_a
     puts "a"
    end
    
    def test_b
     puts "b"
    end
    
    end 
    

    【讨论】:

      【解决方案2】:

      i_suck_and_my_tests_are_order_dependent! 可能是稍后添加到 minitest 的,并且不能作为 Ruby 核心方法使用。在这种情况下,您需要强制使用您的 gem 版本:

      require 'rubygems'
      gem 'minitest'
      

      【讨论】:

      • 同意;不要使用内置的 minitest。使用宝石。
      • 哇。我喜欢这个名字。
      • 它没有被重命名。那个 PR 被拒绝了。
      【解决方案3】:

      我认为方法 *test_order* 应该是类方法,而不是像这样的实例方法:

      # tests are order dependent
      def self.test_order
        :alpha
      end
      

      【讨论】:

        【解决方案4】:

        请注意,从 minitest 5.10.1 开始,i_suck_and_my_tests_are_order_dependent! 方法/指令在使用 MiniTest::Spec 语法的测试套件中完全不起作用。 Minitest.test_order 方法显然根本没有被调用。

        编辑:这是自 Minitest 5.3.4 以来的一个已知问题:请参阅 seattlerb/minitest#514 以了解吹气的哀号和整理。

        你和我都不是“糟透了”的人。所需要的是一个用于 Ruby 的 BDD 规范工具,没有 RSpec 的臃肿,没有兄弟会的态度和对 MiniTest 更广泛的社区实践的蔑视。有没有人指点一下?

        【讨论】:

          【解决方案5】:

          干预这个链的最好方法可能是重写一个类方法runnable_methods:

          def self.runnable_methods
            ['run_first'] | super | ['run_last']
          end
          
          #Minitest version:
          def self.runnable_methods
            methods = methods_matching(/^test_/)
          
            case self.test_order
            when :random, :parallel then
              max = methods.size
              methods.sort.sort_by { rand max }
            when :alpha, :sorted then
              methods.sort
            else
              raise "Unknown test_order: #{self.test_order.inspect}"
            end
          end
          

          您可以通过任何合适的方式重新排序测试。如果您使用

          定义您的特殊排序测试
          test 'some special ordered test' do 
          end
          

          ,不要忘记将它们从超级调用的结果中删除。

          在我的示例中,我需要确保仅在一个特定测试中最后运行,因此我在整个套件中保持随机顺序并将“run_last”放在它的末尾。

          【讨论】:

            猜你喜欢
            • 2020-04-25
            • 1970-01-01
            • 2013-11-02
            • 2015-12-21
            • 2015-09-21
            • 1970-01-01
            • 2014-08-06
            • 1970-01-01
            相关资源
            最近更新 更多