为什么Test :: Unit测试用例启动速度如此之慢?

时间:2008-11-27 10:01:08

标签: ruby-on-rails ruby unit-testing testunit

>rails -v
Rails 1.2.6

>ruby -v
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]

当我运行这样的测试夹具(测试轨道模型类)时,开始执行这些测试需要20-30秒(显示“已加载的套件......”)。是什么给了什么?

>ruby test\unit\category_test.rb

require File.dirname(__FILE__) + '/../test_helper'

class CategoryTest < Test::Unit::TestCase
    def setup
        Category.delete_all
    end
    def test_create
        obCategoryEntry = Category.new({:name=>'Apparel'})
        assert obCategoryEntry.save, obCategoryEntry.errors.full_messages.join(', ')
        assert_equal 1, Category.count

        assert_not_nil Category.find(:all, :conditions=>"name='Apparel'")
    end
    #.. 1 more test here
end

这是使用没有灯具的MySql DB的Rails。这次它启动时间为30秒+。

7 个答案:

答案 0 :(得分:3)

看看这个Rails Test Server

作者的一句话:

  

“每次在Rails中运行测试时   应用,整个环境是   加载,包括没有的库   两次连续运行之间的变化。   这可能需要相当多的时间   时间。如果我们可以装载该怎么办?   环境曾经,只有重装   每次运行前更换零件?   介绍RailsTestServing。

     

使用RailsTestServing,运行时间为   单个测试文件已从8开始   秒钟降到.2秒钟   电脑。那是x40的速度   改进。现在,我不会三思而后行   在TextMate中点击⌘R之前。它   感到自由!“

(这是过去一周Rails Envy Podcast的特色,这是我发现的地方。)

答案 1 :(得分:2)

当开始任何测试时,Rails首先加载你拥有的任何灯具(在测试/灯具中)并用它们重新创建数据库。

20-30秒听起来非常慢。在测试运行之前是否需要加载很多灯具,或者数据库运行缓慢?

答案 2 :(得分:1)

Ruby的 gem 工具遵循路径发现算法,该算法显然不是Windows(正如我从ruby -v所见)友好的。

如果您跟踪加载ProcMon的Rails应用程序,则可以获得清晰的图片。每个(我的意思是每个require开始扫描Ruby路径中的所有目录以及所有gem目录。典型的require在平均机器上需要20毫秒。由于Rails产生了数百require秒,因此每次启动Rails环境时,这些20毫秒很容易相加。花点时间初始化数据库中的灯具,你就可以更好地了解为什么开始运行测试用例需要花费很多时间。

也许是因为每个文件系统架构和实现(路径缓存等),这在Linux中比在Windows中少一个问题。不过,我不知道你应该责怪谁。看起来NTFS文件系统可以通过更好的路径缓存实现来改进,但显然 gem 工具可以实现缓存本身,并且其性能不依赖于平台。

答案 3 :(得分:0)

看起来Test :: Unit是最简单的,但也是使用Ruby进行单元测试的最慢方法之一。其中一个选择是ZenTest

答案 4 :(得分:0)

测试单元启动不是特别慢,并且不到20秒。

(11:39) ~/tmp $ cat test_unit.rb 
require 'test/unit'
class MyTest < Test::Unit::TestCase
  def test_test
    assert_equal("this", "that")
  end
end

(11:39) ~/tmp $ time ruby test_unit.rb 
Loaded suite test_unit
Started
F
Finished in 0.007338 seconds.

  1) Failure:
test_test(MyTest) [test_unit.rb:4]:
<"this"> expected but was
<"that">.

1 tests, 1 assertions, 1 failures, 0 errors

real    0m0.041s
user    0m0.027s
sys     0m0.012s

这可能是你在测试中所做的事情。你在做什么复杂的事吗?设置数据库?从互联网上检索一些东西?

答案 5 :(得分:0)

test_helper.rb是什么样的?你在使用实例化的灯具吗?

self.use_instantiated_fixtures  = true

[编辑]

如果设置为true,请尝试将其设置为false。

答案 6 :(得分:0)

在黑暗中完成拍摄,但大多数时候我看到事情的启动时间很长,这通常是由于某些反向DNS查找在某处发生了某些TCP套接字通信。

尝试添加:

require 'socket'
Socket.do_not_reverse_lookup = true

在您的其他require行之后的测试文件顶部。