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

时间:2020-03-06 14:58:42  来源:igfitidea点击:

我在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"