>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秒+。
答案 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
行之后的测试文件顶部。