Как эффективно заставить Minitest выполнять свои тесты по порядку? - PullRequest
7 голосов
/ 06 января 2012

Я знаю.Это не рекомендуется.По причинам, в которые я не пойду, мне нужно запускать тесты в том порядке, в котором они написаны.Согласно документации, если мой тестовый класс (назовем его TestClass) расширяет Minitest :: Unit :: TestCase, то я должен иметь возможность вызывать публичный метод i_suck_and_my_tests_are_order_dependent! (Ну и дела - вы думаете, парень, который создал Minitest?было мнение по этому поводу?).Кроме того, существует также возможность вызова метода с именем test_order и указания :alpha для переопределения поведения по умолчанию :random.Ни один из них не работает для меня.

Вот пример:

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 для каждого метода, что все еще выполняется в случайном порядке каждый раз, когда я запускаютесты.

Кто-нибудь знает, что я делаю не так?Благодаря.

Ответы [ 5 ]

4 голосов
/ 03 ноября 2014

Если вы просто добавите test_order: alpha к вашему классу тестов, тесты будут выполняться в следующем порядке:

class TestHomePage

def self.test_order
 :alpha
end

def test_a
 puts "a"
end

def test_b
 puts "b"
end

end 
3 голосов
/ 10 февраля 2012

i_suck_and_my_tests_are_order_dependent! может быть более поздним дополнением к minitest и недоступно в качестве основного метода Ruby. В этом случае вы захотите принудительно использовать свою версию гема:

require 'rubygems'
gem 'minitest'
2 голосов
/ 09 марта 2013

Я думаю, что метод * test_order * должен быть методом класса, а не методом экземпляра, например:

# tests are order dependent
def self.test_order
  :alpha
end
1 голос
/ 17 марта 2017

Обратите внимание, что по состоянию на minitest 5.10.1 метод / директива i_suck_and_my_tests_are_order_dependent! является полностью нефункциональной в наборах тестов, использующих синтаксис MiniTest::Spec.Метод Minitest.test_order, по-видимому, вообще не вызывается.

РЕДАКТИРОВАТЬ: Эта проблема известна со времен Minitest 5.3.4: см. seattlerb / minitest # 514 для всхлипывания плача и прихорашивания.

Мы с тобой не те, кто "сосет".Что нужно, так это инструмент спецификации BDD для Ruby без раздувания RSpec и без отношения брата и презрения к более широкой общественной практике MiniTest.У кого-нибудь есть указатели?

0 голосов
/ 17 октября 2017

Лучший способ вмешаться в эту цепочку - переопределить метод класса 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' в его конец.

...