rake specの実行時間を短くするための簡単なお仕事です ※ただし、(何か)に限る

TDDで開発している人の目下の悩みはSlow test問題、すなわちテストの実行時間がかかりすぎて辛い、という問題です。
が、ふと思うところがあって、次のようなタスクを定義していたら、なんということでしょう、劇的に早くなったではありませんか。

namespace :spec do
  spec_prereq = Array(File.exist?(File.join(RAILS_ROOT, 'config', 'database.yml')) ? "db:test:prepare" : :noop)

  desc "faster version of rake spec, but why?"
  task :faster => spec_prereq do
    %w[spec:models spec:controllers spec:views spec:helpers spec:lib].each do |spec|
      Rake::Task[spec].invoke
    end
  end
end

これは、rake specで全部を一気にやるのではなく、spec:models spec:controllers、、、の分割された各タスクを順次実行するというものです。普通に考えると遅くなりそうなものです。

が。私がいま入ってるプロジェクトでは、ふつうのファイルIOなども多く、約2300exampleで2000sec以上という、だいぶうんざりする時間がかかるようになっていました。で、CIを立てて全テスト流すのはそちらに任せたり、もちろん不要になったテストを削ったりしていました。そのうえで2000sec以上。

それがなんと、1000secくらいになったではありませんか。2倍強くらい速くなりました。

これって一般的なんですかね。なぜ速くなるのかはまだ追いかけてませんが、他の皆さんのプロジェクトでの状況を聞いてみたいなぁ、と思ってます。

※ただし、(何か)に限る@2009-12-16T15:45追記

twitterid:t-wadaさんに試してみてもらったんですが、そちらはあんまり速くなっていない模様(改行は私)。

rake spec:faster=>[real:7m56.698s, user:6m51.194s, sys:0m32.522s],
rake spec=>[real:8m21.141s, user:6m57.710s, sys:0m29.410s]
あまりかわらないかも。

http://twitter.com/t_wada/status/6721319401
それでも5%くらいは速くなってるんですよね、いろんなオーバーヘッドがありそうなのに。

このあたり、うちのチームメンバーではみんな速くなってるのでオカルトではないと思うんですが、それがテストの書き方(がまずくてrake specが遅い)なのか、件数なのか、もとの実行時間のせいなのか、そのあたりはもう少し要検証です。
用法用量にご注意の上お試しください。