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

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

 def test_order :alpha end 

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

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

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

 class TestHomePage def self.test_order :alpha end def test_a puts "a" end def test_b puts "b" end end 

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

 require 'rubygems' gem 'minitest' 

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

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

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

编辑:自Minitest 5.3.4以来,这是一个众所周知的问题:请参阅seattlerb / minitest#514 ,了解哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇

你和我不是那些“吮吸”的人。 我们需要的是一个Ruby的BDD规范工具,没有RSpec的膨胀,没有兄弟会的态度和对MiniTest更广泛的社区实践的蔑视。 有没有人有任何指针?

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