【问题标题】:Rails test hanging - how can I print the test name before execution?Rails 测试挂起 - 如何在执行前打印测试名称?
【发布时间】:2008-10-01 14:26:06
【问题描述】:

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

【问题讨论】:

    标签: ruby-on-rails ruby testing


    【解决方案1】:

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

    rake test:units TESTOPTS="-v" 
    

    【讨论】:

      【解决方案2】:

      测试名称的打印是 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 任务是否有等效的方法?
      【解决方案3】:

      这是我在 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 使名称不会在每次测试之前显示(就在第一次运行之前)。

      【讨论】:

        【解决方案4】:

        博文中的定义是特定的(setup(&block) 方法在模块 Thoughtbot::Shoulda 中定义在 context.rb.should.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
        

        应该可以的

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

        【讨论】:

          【解决方案5】:

          如果其他人有同样的问题,但使用集成测试和无头 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
          

          【讨论】:

            【解决方案6】:

            您使用的是什么测试框架?测试/单元?

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

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

            如果您有任何失败的测试,特定测试会显示为红色,并且会扩展到测试失败的特定行,从而让您更清楚地了解测试失败的原因以及您应该在哪里解决问题。

            【讨论】:

            • 测试挂起,没有失败,所以这个答案不相关。
            猜你喜欢
            • 2011-12-09
            • 1970-01-01
            • 2018-02-24
            • 2013-04-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-09-07
            • 1970-01-01
            相关资源
            最近更新 更多