我在我们的Rails应用程序中遇到了一个测试挂起的问题,但无法确定是哪个测试(因为它挂起了,并且没有到达失败报告)。 我找到了这篇博客文章http://bmorearty.wordpress.com/2008/06/18/find-tests-more-easily-in-your-testlog/,其中添加了一个设置钩子来打印测试名称,但是当我尝试做同样的事情时,它给出了一个错误,说设置参数数量不正确(1个而不是0个)。 非常感谢任何帮助。
我在我们的Rails应用程序中遇到了一个测试挂起的问题,但无法确定是哪个测试(因为它挂起了,并且没有到达失败报告)。 我找到了这篇博客文章http://bmorearty.wordpress.com/2008/06/18/find-tests-more-easily-in-your-testlog/,其中添加了一个设置钩子来打印测试名称,但是当我尝试做同样的事情时,它给出了一个错误,说设置参数数量不正确(1个而不是0个)。 非常感谢任何帮助。
如果你使用rake运行测试,它会起作用:
rake test:units TESTOPTS="-v"
测试名称的打印是TestRunner的责任。如果您从命令行运行测试,可以指定-v选项以打印出测试用例名称。
例如:
ruby test_Foo.rb -v
Loaded suite test_Foo
Started
test_blah(TestFoo): .
test_blee(TestFoo): .
Finished in 0.007 seconds.
2 tests, 15 assertions, 0 failures, 0 errors
以下是我在 test_helper.rb 中使用的内容:
class Test::Unit::TestCase
# ...
def setup_with_naming
unless @@named[self.class.name]
puts "\n#{self.class.name} "
@@named[self.class.name] = true
end
setup_without_naming
end
alias_method_chain :setup, :naming unless defined? @@aliased
@@aliased = true
end
@@aliased变量可以防止在一次运行多个文件时重新进行别名设置;@@named则可以避免每次测试之前都显示名称(仅在第一个测试之前显示)。
博客文章中的定义是针对shoulda的(setup(&block)方法在context.rb模块的Thoughtbot::Shoulda中定义。shoulda.rb然后通过扩展该模块来扩展TestCase)。
纯test::unit的定义为
# File test/unit/testcase.rb, line 100
def setup
end
def setup
log_test
end
private
def log_test
if Rails::logger
# When I run tests in rake or autotest I see the same log message multiple times per test for some reason.
# This guard prevents that.
unless @already_logged_this_test
Rails::logger.info "\n\nStarting #{@method_name}\n#{'-' * (9 + @method_name.length)}\n"
end
@already_logged_this_test = true
end
编辑
如果你真的不想编辑你的文件,你可以冒险重新打开测试用例并扩展运行:
class Test::Unit::TestCase
alias :old_run :run
def run
log_test
old_run
end
end
这应该可以工作(我没有 Ruby 来测试)
我放弃了!(感到沮丧)
我检查了代码,Rails 实际上在幕后进行了魔法操作,这可能就是为什么重新定义 run 不起作用的原因。
问题在于:其中一部分魔法是包括 ActiveSupport::CallBack 并为设置和拆卸创建回调函数。
这意味着
class Test::Unit::TestCase
setup :log_test
private
def log_test
if Rails::logger
# When I run tests in rake or autotest I see the same log message multiple times per test for some reason.
# This guard prevents that.
unless @already_logged_this_test
Rails::logger.info "\n\nStarting #{@method_name}\n#{'-' * (9 + @method_name.length)}\n"
end
@already_logged_this_test = true
end
end
end
应该绝对可行
实际上,使用它运行测试确实有效。我困惑的是,这是我尝试的第一件事情,但却因为与您遇到相同的错误而失败了。
如果有其他人遇到了与集成测试和无头Web服务器相关的问题,以下Ruby代码将在运行测试之前打印出测试文件名
Dir["test/integration/**/*.rb"].each do |filename|
if filename.include?("_test.rb")
p filename
system "xvfb-run rake test TEST=#{filename}"
end
end
rake tests
任务中是否有相应的方法来完成这个? - Grant Hutchins