将超时设置为ruby测试::单元运行
我使用rake任务来运行用Ruby编写的测试。 rake任务:将超时设置为ruby测试::单元运行,ruby,rake,testunit,Ruby,Rake,Testunit,我使用rake任务来运行用Ruby编写的测试。 rake任务: 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 结果是抛出了一个超时,但测试继续运行。此代码为整个套件添加了一个超时: def self.suite
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
结果是抛出了一个超时,但测试继续运行。此代码为整个套件添加了一个超时:
def self.suite
mysuite = super
def mysuite.run(*args)
Timeout::timeout(600) do
super
end
end
mysuite
end
我一直在寻找类似的东西,最后写了这样一篇:
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
需要“超时”
#为每个测试提供一个单独的超时。
#
#一般来说,测试的运行时间应少于1s,因此5s是一个相当长的超时时间。
#
#每个类都可以覆盖超时(在测试需要更多时间的少数情况下)
#通过设置例如'self.test_timeout=10#s`
模块TestTimeoutHelper
def自带(基本)
类我不知道一个干净的方法来做到这一点只使用Ruby。您可以将您的Timeout
调用包装在begin
/rescue
块中,以捕获它引发的异常,并使用此处提出的bash
解决方案之一,您将其放在何处?
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