Я использую задачу rake для запуска тестов, написанных на Ruby. Рейк-задача:

desc "This Run Tests on my ruby app"
Rake::TestTask.new do |t|
  t.libs << File.dirname(__FILE__)
  t.test_files = FileList['test*.rb']
  t.verbose = true
end

Я хотел бы создать тайм-аут, чтобы, если какой-либо тест (или весь набор) зависает, выдается исключение тайм-аута, и тест завершится ошибкой.

Я попытался создать новую задачу, которая запускала бы тестовую задачу с таймаутом:

desc "Run Tests with timeout"
task :run_tests do
  Timeout::timeout(200) do
    Rake::Task['test'].invoke
  end
end

В результате был сгенерирован тайм-аут, но тест продолжался.

2
Deddy 1 Янв 2018 в 18:41

2 ответа

Лучший ответ

Этот код добавляет тайм-аут для всего набора:

def self.suite
    mysuite = super
    def mysuite.run(*args)
        Timeout::timeout(600) do
            super
        end
    end
    mysuite
end
0
Deddy 7 Янв 2018 в 19:41

Я искал что-то подобное и в итоге написал следующее:

require 'timeout'

# Provides an individual timeout for every test.
#
# In general tests should run for less then 1s so 5s is quite a generous timeout.
#
# Timeouts can be overridden per-class (in rare cases where tests should take more time)
# by setting for example `self.test_timeout = 10 #s`
module TestTimeoutHelper
  def self.included(base)
    class << base
      attr_accessor :test_timeout
    end

    base.test_timeout = 5 # s
  end

  # This overrides the default minitest behaviour of measuring time, with extra timeout :)
  # This helps out with: (a) keeping tests fast :) (b) detecting infinite loops
  #
  # In general however benchmarks test should be used instead.
  # Timeout is very unreliable by the way but in general works.
  def time_it
    t0 = Minitest.clock_time

    Timeout.timeout(self.class.test_timeout, Timeout::Error, 'Test took to long (infinite loop?)') do
      yield
    end
  ensure
    self.time = Minitest.clock_time - t0
  end
end

Этот модуль должен быть включен либо в конкретные тестовые примеры, либо в общий тестовый пример.

Работает с MiniTest 5.x

1
Marcin Raczkowski 18 Ноя 2019 в 19:38