如何有效地强制Minitest按顺序运行我的测试?

时间:2012-01-06 02:20:19

标签: ruby minitest

我知道。这是不鼓励的。由于我不会进入的原因,我需要按照他们编写的顺序运行我的测试。根据文档,如果我的测试类(我们称之为TestClass)扩展Minitest :: Unit :: TestCase,那么我应该能够调用公共方法i_suck_and_my_tests_are_order_dependent!(Gee - 你认为创建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方法调用la:

def test_order
  :alpha
end

我的测试运行,但我可以从每个方法的puts告诉我每次运行测试时事物仍以随机顺序运行。

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

5 个答案:

答案 0 :(得分:4)

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

class TestHomePage

def self.test_order
 :alpha
end

def test_a
 puts "a"
end

def test_b
 puts "b"
end

end 

答案 1 :(得分:3)

i_suck_and_my_tests_are_order_dependent!可能是minitest&amp; amp;不适用于Ruby核心方法。在这种情况下,您需要强制使用您的宝石版本:

require 'rubygems'
gem 'minitest'

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

请注意,从i_suck_and_my_tests_are_order_dependent! 5.10.1开始,MiniTest::Spec方法/指令在使用Minitest.test_order语法的测试套件中完全无法正常运行。 % bytes_int(+ByteList, -IntegerRepresentation) % converts a list of bytes to integer representation % I accounts for bitshifting bytes_int(BytesList, _) :- bytes_int(BytesList, 0, 0). bytes_int([], _, Num) :- format('~w', Num). bytes_int([B|Bs], I, Num) :- B0 is B << I, Num0 is B0 + Num, I0 is I + 8, bytes_int(Bs, I0, Num0). 方法显然根本没有被调用。

编辑:自从Minitest 5.3.4以来,这是一个众所周知的问题:请参阅seattlerb/minitest#514了解惨叫和整理。

你和我不是那些&#34;吮吸&#34;。所需要的是Ruby的BDD规范工具,没有RSpec 的膨胀,没有兄弟会的态度和对MiniTest更广泛的社区实践的蔑视。有没有人有任何指示?

答案 4 :(得分:0)

干扰此链的最佳方法可能是覆盖类方法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

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

在我的示例中,我需要确保只在一个特定的测试中运行最后一次,所以我保持整个套件的随机顺序并放置&#39; run_last&#39;在它的最后。