Rails测试挂起 - 如何在执行之前打印测试名称?

32

我在我们的Rails应用程序中遇到了一个测试挂起的问题,但无法确定是哪个测试(因为它挂起了,并且没有到达失败报告)。 我找到了这篇博客文章http://bmorearty.wordpress.com/2008/06/18/find-tests-more-easily-in-your-testlog/,其中添加了一个设置钩子来打印测试名称,但是当我尝试做同样的事情时,它给出了一个错误,说设置参数数量不正确(1个而不是0个)。 非常感谢任何帮助。

6个回答

47

如果你使用rake运行测试,它会起作用:

rake test:units TESTOPTS="-v" 

6

测试名称的打印是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

从Rails的rake tests任务中是否有相应的方法来完成这个? - Grant Hutchins

4

以下是我在 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则可以避免每次测试之前都显示名称(仅在第一个测试之前显示)。


3

博客文章中的定义是针对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

应该绝对可行

实际上,使用它运行测试确实有效。我困惑的是,这是我尝试的第一件事情,但却因为与您遇到相同的错误而失败了。


0

如果有其他人遇到了与集成测试和无头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

-2
你使用什么测试框架?是 Test/Unit 吗?
我建议你看一下 RSpec,它可以为你的测试提供更多上下文信息。你还可以获得一个漂亮的 HTML 报告,就像这样: RSpec Result http://myskitch.com/robbyrussell/rspec_results-20070801-233809.jpg 如果你有任何失败的测试,具体的测试将会变成红色,并展开到具体的行数,以便更好地了解测试失败的原因和应该查找问题的位置。

2
测试卡住了,没有失败,因此这个答案不相关。 - James Baker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接