In Ruby, how to I control the order in which Test::Unit tests are run?
Asked Answered
A

3

8

For example, when these tests are run, I want to ensure that test_fizz always runs first.

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

Update: Why do I want to do this? My thought is that early failure by certain tests (those testing the simpler, more fundamental methods) will make it easier to track down problems in the system. For example, the success of bar hinges on fizz working correctly. If fizz is broken, I want to know that right off the bat, because there's no need to worry about bar, which will fail too, but with much more complicated output in the test results.

Artery answered 20/11, 2009 at 19:59 Comment(4)
Why do you want to do this? I certainly hope the order of your tests does not affect the test results. If it does, you're doing something terribly wrong.Telangiectasis
I agree with gotgenes. I see your update, but if bar relies on fizz, you should test fizz, then stub the results of fizz when testing bar to avoid cross-contamination rather than ensuring your tests run in a particular order. If fizz is testing higher level functionality, maybe you should make it a functional test instead.Imes
Having a suite of ordered assertions are fine, but it's not unit testing anymore. Its Functional/Integration/Behavioral (whatever you want to call it....its all just the same). You should do with a tool designed for it like rspecFilter
Related: #1376767Germanophobe
G
3

Name the tests you want to run first with a low-sorting alphabetical name.

def test_AAA_fizz

For code readability, this could be considered ugly, or helpful, depending on your point of view.

Gallimaufry answered 21/11, 2009 at 20:40 Comment(1)
test "01) should run first test" do ... endRalf
F
8

You can define the test order with Test::Unit::TestCase#test_order = :defined

Example:

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

The result:

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

Finished in 0.001 seconds.

Without test_order = :defined you get the alphabetic order:

Loaded suite test
Started
:a
.:b
.:c
.
Fund answered 1/7, 2014 at 9:31 Comment(0)
A
5

Tests within the same test class are called in the order they are defined. However, test classes are run in alphabetical order by classname.

If you really need fine control, define the fizz and bar methods with a prefix other than test_ and from inside a test_fizz_bar method, call them in order and run bar conditionally upon success of running fizz.

EDIT: It seems like different unit test frameworks behave differently. For JUnit in Eclipse, it seems that the test cases run in random order: Ordering unit tests in Eclipse's JUnit view

Alfeus answered 20/11, 2009 at 20:16 Comment(3)
Thanks for the suggestion. In the code I posted, the tests are not run in the order they are defined; rather, test_bar runs first.Artery
In my experience, tests within the same test class are invoked in alphabetical order.Gallimaufry
@JonathanJulian: Indeed. Where's the -10 when you need it?Whereof
G
3

Name the tests you want to run first with a low-sorting alphabetical name.

def test_AAA_fizz

For code readability, this could be considered ugly, or helpful, depending on your point of view.

Gallimaufry answered 21/11, 2009 at 20:40 Comment(1)
test "01) should run first test" do ... endRalf

© 2022 - 2024 — McMap. All rights reserved.