1
>rails -v
Rails 1.2.6

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

当我像这样运行测试夹具(测试 Rails 模型类)时,开始执行这些测试需要 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 秒以上。

4

7 回答 7

3

看看这个Rails 测试服务器

作者的一段话:

“每次在 Rails 应用程序中运行测试时,整个环境都会被加载,包括在两次连续运行之间不会发生变化的库。这可能需要相当长的时间。如果我们可以加载一次环境,并且只加载一次呢?在每次运行之前重新加载变化的部分?介绍 RailsTestServing。

使用 RailsTestServing,单个测试文件的运行时间在我的计算机上从 8 秒下降到 0.2 秒。这是 40 倍的速度提升。现在,在 TextMate 中点击 ⌘R 之前,我不会三思而后行。感觉很自由!”

(上周我在Rails Envy 播客上发现了这个。)

于 2008-12-01T13:13:38.580 回答
2

在开始任何测试时,Rails 首先加载您拥有的所有夹具(在 test/fixtures 中)并使用它们重新创建数据库。

不过, 20-30 秒听起来慢。在您的测试运行之前,您是否需要加载很多固定装置,或者您的数据库运行缓慢?

于 2008-11-27T11:02:53.380 回答
1

Ruby 的gem工具遵循一个路径发现算法,显然,它对 Windows(正如我从您的 中看到的ruby -v)不友好。

例如,如果您跟踪使用ProcMon加载的 Rails 应用程序,您可以获得清晰的画面。Every(我的意思是everyrequire开始扫描 Ruby 路径中的所有目录以及所有 gem 目录。一个典型require的在一台普通机器上需要 20 毫秒。由于 Rails 会产生数百个requires,因此每次启动 Rails 环境时,这 20 毫秒的时间很容易总计为几秒。花点时间初始化数据库中的固定装置,您就会更好地了解为什么开始运行测试用例需要这么多时间。

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

于 2008-12-15T15:39:31.727 回答
0

你的 test_helper.rb 是什么样子的?你在使用实例化的固定装置吗?

self.use_instantiated_fixtures  = true

[编辑]

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

于 2008-11-27T14:00:08.500 回答
0

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

尝试添加:

require 'socket'
Socket.do_not_reverse_lookup = true

在您的另一require行之后的测试文件的顶部。

于 2008-11-27T17:55:06.560 回答
0

似乎 Test::Unit 是使用 Ruby 进行单元测试的最简单但也是最慢的方法之一。ZenTest是一种替代方法。

于 2008-11-27T10:11:03.407 回答
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

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

于 2008-11-27T10:42:09.617 回答