1
>rails -v
Rails 1.2.6

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

このようなテスト フィクスチャ (Rails モデル クラスをテストする) を実行すると、これらのテストの実行を開始するのに 20 ~ 30 秒かかります ("Loaded suite..." が表示されます)。何を与える?

>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 Test Serverを見てください。

著者からの引用:

「Rails アプリケーションでテストを実行するたびに、2 つの連続した実行間で変更されないライブラリを含め、環境全体が読み込まれます。これにはかなりの時間がかかる可能性があります。環境を 1 回だけ読み込むことができたらどうでしょうか。各実行前に変更部分をリロードしますか? RailsTestServing の紹介。

RailsTestServing を使用すると、単一のテスト ファイルの実行時間が、私のコンピューターで 8 秒から 0.2 秒に短縮されました。これは 40 倍の速度向上です。今、私は TextMate で ⌘R を押す前によく考えません。解放感があります!」

(これは先週、 Rails Envy Podcastで取り上げられたもので、そこで見つけました。)

于 2008-12-01T13:13:38.580 に答える
2

テストを開始するとき、Railsは最初に(テスト/フィクスチャにある)フィクスチャをロードし、それらを使用してデータベースを再作成します。

ただし、 20〜30秒は非常に遅く聞こえます。テストを実行する前にロードする必要のあるフィクスチャがたくさんありますか、それともデータベースの実行速度が遅くなっていますか?

于 2008-11-27T11:02:53.380 に答える
1

Ruby のgemツールはパス検出アルゴリズムに従いますが、これはどうやら Windows (あなたの からわかるようにruby -v) フレンドリーではありません。

たとえば、ProcMonをロードする Rails アプリケーションをトレースすると、明確な全体像を得ることができます。Every (本当にeveryという意味です)requireは、Ruby のパス内のすべてのディレクトリとすべての gem ディレクトリのスキャンを開始します。通常require、平均的なマシンで 20 ミリ秒かかります。Rails は何百requireもの s を作成するため、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

テストユニットの起動は特に遅くはなく、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 に答える
0

暗闇の中での完全なショットですが、ほとんどの場合、物事の起動に長い時間がかかります。これは通常、途中のどこかで TCP ソケット通信で発生するある種の逆 DNS ルックアップが原因です。

追加してみてください:

require 'socket'
Socket.do_not_reverse_lookup = true

require他の行の後のテストファイルの上部。

于 2008-11-27T17:55:06.560 に答える
0

Test::Unit は最も単純なようですが、Ruby で単体テストを行う最も遅い方法の 1 つでもあります。代替手段の 1 つはZenTestです。

于 2008-11-27T10:11:03.407 に答える