Как в Ruby контролировать порядок запуска тестов Test::Unit?

Например, при запуске этих тестов я хочу убедиться, что 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, который тоже выйдет из строя, но с гораздо более сложным выводом в результатах теста.


person FMc    schedule 20.11.2009    source источник
comment
почему ты хочешь сделать это? Я, конечно, надеюсь, что порядок ваших тестов не повлияет на результаты тестов. Если да, то вы делаете что-то ужасно неправильное.   -  person gotgenes    schedule 20.11.2009
comment
Я согласен с Gotgenes. Я вижу ваше обновление, но если батончик зависит от шипения, вам следует протестировать шипение, а затем заглушить результаты шипения при тестировании батончика, чтобы избежать перекрестного загрязнения, а не обеспечивать выполнение тестов в определенном порядке. Если fizz тестирует функциональность более высокого уровня, возможно, вам следует вместо этого сделать функциональный тест.   -  person Kyle    schedule 21.11.2009
comment
Наличие набора упорядоченных утверждений — это хорошо, но это уже не модульное тестирование. Его Функциональность/Интеграция/Поведение (как бы вы это ни называли... это все одно и то же). Вы должны использовать инструмент, предназначенный для этого, например, rspec   -  person ryber    schedule 21.11.2009
comment
Связанный: stackoverflow.com/questions/1376267/   -  person Andrew Grimm    schedule 30.04.2010


Ответы (3)


Назовите тесты, которые вы хотите запустить первыми, с помощью алфавитного имени с низким уровнем сортировки.

def test_AAA_fizz

Для удобочитаемости кода это может считаться уродливым или полезным, в зависимости от вашей точки зрения.

person Jonathan Julian    schedule 21.11.2009

Вы можете определить тестовый заказ с помощью 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
.
person knut    schedule 01.07.2014

Тесты внутри одного тестового класса вызываются в том порядке, в котором они определены. Однако тестовые классы запускаются в алфавитном порядке по имени класса.

Если вам действительно нужен точный контроль, определите методы fizz и bar с префиксом, отличным от test_, и внутри метода test_fizz_bar вызовите их по порядку и запустите bar условно после успешного запуска fizz.

РЕДАКТИРОВАТЬ: кажется, что разные среды модульного тестирования ведут себя по-разному. Для JUnit в Eclipse кажется, что тестовые примеры выполняются в случайном порядке: тесты в представлении Eclipse JUnit

person Joy Dutta    schedule 20.11.2009
comment
Спасибо за предложение. В опубликованном мной коде тесты не запускаются в том порядке, в котором они определены; скорее, test_bar запускается первым. - person FMc; 21.11.2009
comment
По моему опыту, тесты в одном тестовом классе вызываются в алфавитном порядке. - person Jonathan Julian; 21.11.2009
comment
@JonathanJulian: Действительно. Где -10, когда вам это нужно? - person Marc-André Lafortune; 26.02.2013