Minitest允许您通过覆盖test_order
到alpha
来按顺序运行测试。 (您也可以使用i_suck_and_my_tests_are_order_dependent!
方法。)
执行此操作后,如何控制测试在多个文件中运行的顺序? 有没有办法从一个文件运行一些测试,然后切换到另一个文件?
查看source code,似乎应该能够控制方法的排序方式。但是你如何指定这个顺序呢?
答案 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