【问题标题】:Rake tests running very slowRake 测试运行非常缓慢
【发布时间】:2012-10-13 02:12:04
【问题描述】:

在运行了一些测试之后,我确信我的设置(windows、rubymine 和最新的 ruby​​ 版本)一定有问题。我现在的时间是:

Finished tests in 14.289817s, 0.0700 tests/s, 0.3499 assertions/s.

1 tests, 5 assertions, 0 failures, 0 errors, 0 skips

Process finished with exit code 0

通过 5 个非常简单的测试(只需检查对空字段的验证是否有效)。这 5 个单元测试的总时间为 160 秒,超过 2 分钟。

我可以做些什么来提高这个速度?

这里是测试:

require 'test_helper'

class ItemTest < ActiveSupport::TestCase
  test 'item attributes must not be empty' do
    item = Item.new
    assert item.invalid?
    assert item.errors[:name].any?
    assert item.errors[:description].any?
    assert item.errors[:image_url].any?
    assert item.errors[:rating].any?
  end
end

【问题讨论】:

  • 购买更快的机器?老实说,没有 - 如果没有对您的测试有更深入的了解,这很难说。
  • 现在我对缓慢印象深刻。您甚至没有访问数据库。可能是加载 Rails 环境需要很多时间。 rake -vT 运行多长时间?
  • 20 秒多一点。我刚刚发现这可能与在 Windows 上运行 ruby​​ 有关。这是真的吗?
  • 试试time ruby config/environemnt.rb,这是最有趣的部分(如果window$没有这样的命令,也可以手动测量)

标签: ruby windows unit-testing rubymine


【解决方案1】:

您的问题是 Windows。我们在 Windows 上使用 JRuby,它实际上比 Windows 上的 RubyInstaller(mingw) ruby​​ 运行得更快,但是在运行测试套件或启动 Rails 服务器时,我们确实看到了非常慢的结果。由于加载了 Rails 环境,单次测试运行大约需要 1 分钟。 您有几个选择:

  1. 切换到 linux/osx
  2. 使用 spork 为您的测试预加载几个 rails 环境。请注意,这并不完美,但会大大减少您的时间。使用此选项,您可能想要使用 minitest 或 rspec,但我无法让 spork 使用 testunit 在 Windows 上工作。使用 spork,您应该能够将单次测试运行时间缩短到 10 秒左右。
  3. 编写尽可能多的测试以在 Rails 之外运行,换句话说,不需要 Rails 堆栈。这将非常快,您应该能够在几秒钟内运行测试,但正如您所猜测的那样,很难在 rails 之外测试很多东西(控制器、视图)。虽然对于您已经分解成模块的功能,这些功能已经不需要任何来自 Rails 的东西,但效果很好。

祝你好运!

【讨论】:

  • 感谢您的评论。最初进入它时,我不知道 rails 在 Windows 上运行得如此糟糕。我想基于 Unix 的 Mac 环境可以让它运行得更快?我决定推迟 RoR,直到我可以使用可以让我正常运行 rails 的机器。我想这将是 Rails 不受欢迎的主要原因(在我个人看来)。
  • 是的,Rails 和许多与此相关的脚本类型语言都是为 *nix 环境编写的,所以是的,Mac 可以正常工作。 Windows 就像是事后才想到的,尤其是在 Rails 中,它的速度要慢得多。如果您开始并坚持大多数 Rails 工作所在的环境,您将节省大量时间。
  • 我创建了一个虚拟机(virtualbox)并在上面安装了linux。测试时间从 32 秒下降到(仍然不是特别好)11 秒。我可以看到,几乎所有的 ruby​​ 都在 linux 中运行得更快,即使是通过软件仿真完成的。
  • 尝试使用 spork ,我敢打赌你可以把它缩短到几秒钟。
【解决方案2】:

您的宝石堆栈的其余部分是什么?有时第三方 gem 由 rails 初始化,并会尝试打电话回家(New Relic,Airbrake),这可能会增加您的测试时间(尽管可能不会这么多)。如果您的测试套件不严格要求某些东西,您应该尝试将其拉入适当的环境组,或通过捆绑器设置require :false

组:生产做 宝石'newrelic_rpm' 结尾

【讨论】:

    【解决方案3】:

    启动时间似乎正在扼杀你,所以你和我可能在同一条船上。在 Jodell 和 Dark Castle 之间,其中很多内容已经涵盖,但这是我列出的几乎全部有用的东西,按功效降序排列。

    1. 获得一个修补过的 1.9.3,其中 2.0 文件系统改进被向后移植。第一个得到 2 倍更好的数字,但我使用第二个,因为我觉得第一个不稳定
    2. 设置您的 GC 选项
    3. 关闭收集覆盖数据(我的 IDE 一直自愿这样做)
    4. 运行 Spork 和 set SPEC_OPTS=--drb
    5. 关闭病毒扫描程序(实际上不要这样做,反正对我来说只值 10%)
    6. 仔细检查您的 Gem,使用 require: false 延迟加载 Gem

    6 实际上并没有给我买多少。我们最大的错误是无条件加载 Thin(它会拉入 Eventmachine,安装了 21 兆字节),但堆栈中的下 3 个实际上被 RSpec 使用。我没有查看网络流量,但 Jodell 可能对此有所了解。

    【讨论】:

      猜你喜欢
      • 2017-03-20
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多