7

我知道。这是不鼓励的。由于我不会进入的原因,我需要按照编写的顺序运行我的测试。根据文档,如果我的测试类(我们称之为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

我的测试运行了,但我可以从putsfor each 方法中看出,每次我运行测试时,事情仍然以随机顺序运行。

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

4

5 回答 5

5

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

class TestHomePage

def self.test_order
 :alpha
end

def test_a
 puts "a"
end

def test_b
 puts "b"
end

end 
于 2014-11-03T19:34:47.870 回答
3

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

require 'rubygems'
gem 'minitest'
于 2012-02-10T01:55:06.143 回答
2

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

# tests are order dependent
def self.test_order
  :alpha
end
于 2013-03-09T11:10:12.653 回答
2

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

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

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

于 2017-03-17T16:04:04.683 回答
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

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

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

于 2017-10-17T08:55:50.607 回答