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

时间:2008-10-01 14:26:07

标签: ruby-on-rails ruby testing

我在我们的rails app中有一个测试挂起无法找出哪一个(因为它挂起并且没有得到失败报告)。我发现这篇博文http://bmorearty.wordpress.com/2008/06/18/find-tests-more-easily-in-your-testlog/添加了一个设置挂钩来打印测试名称,但是当我尝试做同样的事情时,它给出了一个错误,指出错误的设置参数数量(1表示0)。任何帮助都将不胜感激。

6 个答案:

答案 0 :(得分:41)

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

rake test:units TESTOPTS="-v" 

答案 1 :(得分: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

答案 2 :(得分: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 :(得分:3)

博客文章中的定义应该是特定的(setup(& block)方法是在context.rb中的Thoughtbot :: Shoulda模块中定义的.adna.rb然后让TestCase扩展该模块)。

pure 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

绝对应该有用

并且实际运行测试确实有效。令我感到困惑的是,这是我尝试的第一件事,它失败了你得到的同样的错误

答案 4 :(得分:0)

您使用的是哪种测试框架?测试/单元

我会看一下RSpec,它会为你的测试提供更多的上下文。您还可以获得一个很好的HTML报告,如下所示:

RSpec Result http://myskitch.com/robbyrussell/rspec_results-20070801-233809.jpg

如果您有任何失败的测试,特定的测试将是红色的,它将扩展到测试失败的特定行,以便您更清楚地了解测试失败的原因以及您应该在哪里解决问题。

答案 5 :(得分: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