您如何指定 Minitest 测试的确切顺序?

How do you specify the exact order of Minitest tests?

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

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

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

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

示例:

class TestClass < Minitest::Unit::TestCase

  i_suck_and_my_tests_are_order_dependent!

  def test_true
    assert true
  end

end

根据ruby-doc

Call this at the top of your tests when you absolutely positively need to have ordered tests. In doing so, you’re admitting that you suck and your tests are weak.

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

def self.test_order
 :alpha
end

i_suck_and_my_tests_are_order_dependent!方法使用那个。

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

除了字母顺序之外,仅定义了一个随机顺序(至少在 'minitest'、'>5.5.1'、'<=5.6.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

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

我估计你的文件中有不同的 test-classes,所以这符合你的问题。 (不是文件是标准,而是测试-class。)

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

也可以对所有测试服进行全局更改:

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

对@knut 的回答进行了少量补充(或者可以覆盖 %)。您不需要修补 Minitest,只需覆盖您的 TestClass 中的 self.runnable_methods,并以任何合适的顺序将您的测试放在那里。

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

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

 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 排序的名称来保持它们的顺序。所以看起来它只是 :alpha 或 :sorted 方式的另一种方式