2012-01-06 27 views
7

我知道。这是不鼓励的。由于我不会涉及的原因,我需要按照他们编写的顺序运行我的测试。根据文档,如果我的测试类(我们称之为TestClass)扩展了Minitest :: Unit :: TestCase,那么我应该可以调用公共方法i_suck_and_my_tests_are_order_dependent!(Gee - 你认为创建Minitest的人有一个对那个人的意见?)。此外,还可以选择调用称为test_order的方法,并指定:alpha覆盖:random的默认行为。这些都不适合我。我如何有效地强制Minitest按顺序运行我的测试?

下面是一个例子:

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 

我的测试运行,但我可以从puts知道每种方法,仍然是事物每次运行测试时都以随机顺序进行。

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

回答

3

i_suck_and_my_tests_are_order_dependent!可能是稍后添加到minitest &不可用作为Ruby核心方法。在这种情况下,你会想迫使你的宝石版本使用:

require 'rubygems' 
gem 'minitest' 
+0

同意;不要使用内置的minitest。使用宝石。 – naomik 2013-08-24 20:58:42

+0

n.b.这被重新命名为https://github.com/seattlerb/minitest/pull/400 – 2017-05-17 20:29:25

+0

Aww。我喜欢那个名字。 – 2017-05-18 00:28:19

2

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

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

如果你只需要添加test_order:阿尔法测试类,测试将在顺序运行:

class TestHomePage 

def self.test_order 
:alpha 
end 

def test_a 
puts "a" 
end 

def test_b 
puts "b" 
end 

end 
1

需要注意的是,由于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更广泛的社区实践。有没有人有任何指针?

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'。

相关问题