在Ruby中,如何控制Test :: Unit测试的运行顺序?

时间:2009-11-20 19:59:17

标签: ruby unit-testing testunit

例如,运行这些测试时,我想确保test_fizz始终先运行。

require 'test/unit'
class FooTest < Test::Unit::TestCase
    def test_fizz
        puts "Running fizz"
        assert true
    end

    def test_bar
        puts "Running bar"
        assert true
    end
end

更新:我为什么要这样做?我的想法是某些测试的早期失败(那些测试更简单,更基本的方法)将使得更容易追踪系统中的问题。例如,bar的成功取决于fizz正常工作。如果fizz被破坏,我想立即知道,因为没有必要担心bar,这也会失败,但测试结果的输出要复杂得多。

3 个答案:

答案 0 :(得分:6)

您可以使用Test::Unit::TestCase#test_order = :defined

定义测试订单

示例:

gem 'test-unit'  #I used 2.5.5
require 'test/unit'
class Mytest < Test::Unit::TestCase
  self.test_order = :defined
  #~ self.test_order = :random
  #~ self.test_order = :alphabetic #default
  def test_b
    p :b
  end
  def test_a
    p :a
  end
  def test_c
    p :c
  end
end

结果:

Loaded suite test
Started
:b
.:a
.:c
.

Finished in 0.001 seconds.

如果没有test_order = :defined,您将获得字母顺序:

Loaded suite test
Started
:a
.:b
.:c
.

答案 1 :(得分:5)

同一测试类中的测试按其定义的顺序调用。但是,测试类按类名按字母顺序运行。

如果你真的需要精确控制,请使用test_之外的前缀定义fizz和bar方法,并在test_fizz_bar方法内定义fizz和bar方法,按顺序调用它们并在运行fizz成功时有条件地运行bar

编辑: 看起来不同的单元测试框架表现不同。对于Eclipse中的JUnit,似乎测试用例以随机顺序运行:Ordering unit tests in Eclipse's JUnit view

答案 2 :(得分:3)

使用低排序字母名称命名要运行的测试。

def test_AAA_fizz

对于代码可读性,根据您的观点,这可能被视为丑陋或有用。