Rails测试挂起-如何在执行之前打印测试名称?
我在rails应用程序中挂了一个测试,无法确定哪个挂起(因为它挂起了并且无法获取故障报告)。我发现此博客文章http://bmorearty.wordpress.com/2008/06/18/find-tests-more-easily-in-your-testlog/添加了用于显示测试名称的设置钩子,但是当我尝试做同样的事情,它给我一个错误,提示设置的参数数量错误(1表示0)。任何帮助将不胜感激。
解决方案
我们正在使用什么测试框架?测试/单位?
我将看一下RSpec,它将为测试提供更多的上下文。我们还可以获得一个漂亮的HTML报告,如下所示:
RSpec结果http://myskitch.com/robbyrussell/rspec_results-20070801-233809.jpg
如果我们有任何失败的测试,则特定的测试将显示为红色,并且会扩展到特定的行,在特定的行中测试失败,从而使我们可以更清楚地了解测试失败的原因以及应该在哪里解决该问题。
博客文章中的定义应该是特定的(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
这应该工作(虽然我没有红宝石可以测试)
我放弃 ! (无奈中)
我检查了代码,Rails确实在幕后发挥了魔力,这可能是为什么重新定义运行不起作用的原因。
问题是:魔术的一部分包括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
应该肯定可以工作
并实际使用它运行测试。我感到困惑的是,这是我尝试的第一件事,但由于出现相同的错误而失败
测试名称的打印由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可以防止在每次测试之前(正好在第一次运行之前)显示该名称。
感谢大家的帮助,我最后进行了测试,并在最后两个答案出炉之前,在每个测试文件的每个设置方法中添加了对log_name的调用。再次感谢。
如果使用rake运行测试,它将起作用:
rake test:units TESTOPTS="-v"