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

时间:2015-05-01 17:29:59

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

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

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

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

4 个答案:

答案 0 :(得分:6)

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

但测试顺序仅针对Test-subclass定义,而不是针对所有测试的全局。因此,这不允许您访问多个测试类中的测试方法的顺序。

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

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

答案 1 :(得分: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!方法使用它。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

对@knut回答很少添加(或可能会覆盖%))。您不需要修补Minitest,而只是覆盖TestClass中的self.runnable_methods,并以适当的顺序放置测试。

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

然后@knuts回答更好,因为原始答案在内部依赖于Module方法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排序的名称来保持其顺序。所以看起来它只是另一种方式:alpha或:sort way