【问题标题】:How do you specify the exact order of Minitest tests?您如何指定 Minitest 测试的确切顺序?
【发布时间】:2015-05-01 17:29:58
【问题描述】:

Minitest 允许您通过将test_order 覆盖为alpha 来按顺序运行测试。 (也可以使用i_suck_and_my_tests_are_order_dependent!方法。)

完成此操作后,如何控制跨多个文件运行测试的顺序?
有没有办法从一个文件运行一些测试然后切换到另一个文件?

查看source code,似乎应该能够控制方法的排序方式。但是您如何指定该顺序?

【问题讨论】:

    标签: ruby-on-rails ruby testing minitest testunit


    【解决方案1】:

    i_suck_and_my_tests_are_order_dependent!(或def self.test_order; :alpha;end 定义字母顺序。

    除了字母顺序之外,只定义了一个随机顺序(至少在 'minitest'、'>5.5.1'、'

    但您可以修补MiniTest::Test.runnable_methods 以获得另一个订单。

    gem 'minitest'
    require 'minitest/autorun'
    
    class MiniTest::Test
        #Add a test order :defined
        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 :defined then  # <-new
            methods
          when :alpha, :sorted then
            methods.sort
          else
            raise "Unknown test_order: #{self.test_order.inspect}"
          end
        end
    end
    
    class TestOrder < MiniTest::Test
      def self.test_order; :defined; end
    
      #Alphabetic order
      #~ def self.test_order; :alpha;end
      #~ i_suck_and_my_tests_are_order_dependent!
    
      def test_4;    p __method__;  end
      def test_3;    p __method__;  end
      def test_2;    p __method__;  end
      def test_1;    p __method__;  end
    end
    

    但测试顺序仅针对每个测试子类定义,并非对所有测试都是全局的。所以这不会让您访问多个测试类中的测试方法的顺序。

    我估计您的文件中有不同的测试类,因此这与您的问题相对应。 (不是文件是标准,而是测试类。)

    如果您在测试文件中只定义一个测试类,那么您可以定义自己的顺序。

    【讨论】:

    • 谢谢。您可以在一个测试类中测试多个控制器吗?由于get 似乎可以与给定的控制器一起使用。
    • @Ari 抱歉,我不是 rails 用户,所以对此我无能为力。
    【解决方案2】:

    您可以将i_suck_and_my_tests_are_order_dependent! 添加到您的测试类中。

    例子:

    class TestClass < Minitest::Unit::TestCase
    
      i_suck_and_my_tests_are_order_dependent!
    
      def test_true
        assert true
      end
    
    end
    

    根据ruby-doc

    当您绝对需要订购测试时,请在测试的顶部调用它。这样一来,您就承认自己很烂,而且您的测试很弱。

    您也可以简单地将以下内容添加到您的测试类中:

    def self.test_order
     :alpha
    end
    

    i_suck_and_my_tests_are_order_dependent!方法使用它。

    【讨论】:

    • 我在我的问题中提到了这一点。之后你如何指定确切的顺序?
    • 您可以将 test_order 定义为 :alphabetical、:random 或 :defined。我相信您正在寻找:已定义。看看这个:test-unit.rubyforge.org/test-unit/en/Test/Unit/…
    • @AlexPan 实际的version 5.6.1 of Minitest 不支持 test_order :defined。你用的是哪个版本的?
    • @knut 有没有办法为 5.6.1 的测试定义总体顺序?
    • @ari 据我所知,我的帖子中有一些细节。评论有点太长了。我只使用 minitest 几天,所以也许有解决您问题的方法。让我们等待一些其他的答案,
    【解决方案3】:

    还可以为所有测试套装全局更改:

    # in your test_helper.rb
    require "minitest" # or "minitest/autorun"
    class Minitest::Test
      def self.test_order
       :alpha
      end
    end
    

    【讨论】:

      【解决方案4】:

      对@knut 答案的添加很少(或可能被覆盖 %)。您无需修补 Minitest,只需在您的 TestClass 中覆盖 self.runnable_methods,并以任何合适的顺序放置您的测试。

      def self.runnable_methods
         super | ['run_last']
      end 
      

      比@knuts 回答更好,因为原始答案在内部依赖于模块方法 instance_methods(include_super=true),它会以更不可预测且部分按字母顺序排序的方式返回它们:

       module A
         def method3()  end
       end
       class B
         include A
         def method2()  end
       end
       class C < B
         def method4() end
         def method1()  end
       end
       C.instance_methods(true) # -> [:method1, :method4, :method2, :method3 ...
      

      所以我假设在之前给出的解决方案中,您的测试将需要按字母排序的名称来保持它们的顺序。所以看起来这只是 :alpha 或 :sorted 方式的另一种方式

      【讨论】:

        猜你喜欢
        • 2019-02-27
        • 2015-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-14
        • 2011-06-10
        • 1970-01-01
        • 2011-02-26
        相关资源
        最近更新 更多