Hatena::Groupsubtech

#生存戦略 、それは

-> 10 { 10 / 27 }

Rails3 + RSpec2 + vim におけるテスト実行が遅い件

01:00 | はてなブックマーク - Rails3 + RSpec2 + vim におけるテスト実行が遅い件 - #生存戦略 、それは

もんだい

  • Rails3 + RSpec2 の単体のテストが Rails 全ロードため遅いよ。8秒ぐらいかかるよ
  • spork で drbd な rspec サーバたてて解決ソリューション
    • spork は Rails3 + RSpec2 じゃ一部挙動がおかしくなる
    • 「一部」おかしくなることがあるので時たまはまる・よくない
  • emacs の人はべつにおそいのなれてるしーという感じ
    • なんで?
    • 普通に非同期で実行できるからだ!
  • vim は非同期なテストができない!!!
    • vim 上で spec 走らせると待ち時間に
    • 解決ソリューションとしては QuickRun + async 等で解決できる
      • vimproc だと現在の QuickRun の仕様で stdout 出力が終わるまで ...F... とか出ない
      • あと手元の環境だとうまく動かないことがときどきある
  • autotest !
    • なつかしの autotest
    • 最近テスト実行は別の仮想端末上で行う事が多い
      • rvm + bundler 使ってると、環境がシェル上じゃないとちゃんとしないとうまく動かなかったりする(これ僕の環境も悪い)
      • シェルから bundle exec autotest でちゃんとした環境で起動できる
    • autotest + it '' :focus => true 相性良いな
    • でもファイル更新されたら自動実行は嫌だ
      • 自分の開発サイクルの外側で行われるとリズムが狂う

解決法

というわけで、autotest を USR2 シグナルによってテスト実行させるようにする。sleep の待ち時間を実行されないぐらい長めにとって、USR2 シグナルで実行されるようにする。

# ~/.autotest
Autotest.add_hook :initialize do |at|
  at.sleep = 100000
  at.instance_eval do
    trap 'USR2' do
      print "\n\033[1;34m%s\033[0m\n" % "catch USR2 signal"
      if find_files_to_test
        get_to_green
        if tainted? and not options[:no_full_after_failed]
          rerun_all_tests
        else
          hook :all_good
        end
      end
    end
  end
end

で、autotest を起動

bundle exec autotest -f -c 

あとは screen からでも vim からでも適当に USR2 シグナル投げれば、更新があったファイルだけ実行できる。もはや autotest じゃねーじゃん、という話は置いておきます。

pkill -USR2 -f 'bin/autotest'
nmap <silent> er :silent! exe '!/opt/local/bin/pkill -USR2 -f bin/autotest'<CR>

今のところこの方法が一番効率よいかなー…。

ちなみに :focus => true でその spec だけ実行するというのをいままで知りませんでした、便利!

# in spec/spec_helper.rb
RSpec.configure do |c|
  c.filter_run :focus => true
end

# in any spec file
describe "something" do
  it "does something", :focus => true do
    # ....
  end
end

ujihisaujihisa2010/10/27 09:09http://vim-users.jp/2010/10/hack176/

secondlifesecondlife2010/10/27 10:39その方法、どれも手元の環境だとうまくいかなかったんだよね。

ujihisaujihisa2010/10/27 11:50どんなエラーがでましたか?

secondlifesecondlife2010/10/27 11:55エラーと言うより、vim 自体の応答がときたま無くなりました。
いちおう vim 環境はこんな。
vim --version
VIM - Vi IMproved 7.2 (2008 Aug 9, compiled Aug 2 2010 19:31:21)
MacOS X (unix) version
Included patches: 1-446
Compiled by yuichi-tateno
Big version without GUI. Features included (+) or not (-):
+arabic +autocmd -balloon_eval -browse ++builtin_terms +byte_offset +cindent
-clientserver -clipboard +cmdline_compl +cmdline_hist +cmdline_info +comments
+cryptv -cscope +cursorshape +dialog_con +diff +digraphs -dnd -ebcdic
+emacs_tags +eval +ex_extra +extra_search +farsi +file_in_path +find_in_path
+float +folding -footer +fork() -gettext -hangul_input +iconv +insert_expand
+jumplist +keymap +langmap +libcall +linebreak +lispindent +listcmds +localmap
+menu +mksession +modify_fname +mouse -mouseshape +mouse_dec -mouse_gpm
-mouse_jsbterm +mouse_netterm -mouse_sysmouse +mouse_xterm +multi_byte
+multi_lang -mzscheme -netbeans_intg -osfiletype +path_extra +perl +postscript
+printer -profile +python +quickfix +reltime +rightleft +ruby +scrollbind
+signs +smartindent -sniff +startuptime +statusline -sun_workshop +syntax
+tag_binary +tag_old_static -tag_any_white -tcl +terminfo +termresponse
+textobjects +title -toolbar +user_commands +vertsplit +virtualedit +visual
+visualextra +viminfo +vreplace +wildignore +wildmenu +windows +writebackup
-X11 -xfontset -xim -xsmp -xterm_clipboard -xterm_save
system vimrc file: "/opt/local/etc/vimrc"
user vimrc file: "$HOME/.vimrc"
user exrc file: "$HOME/.exrc"
fall-back for $VIM: "/opt/local/share/vim"
Compilation: /usr/bin/gcc-4.2 -c -I. -Iproto -DHAVE_CONFIG_H -I/opt/local/include -DMACOS_X_UNIX -no-cpp-precomp -I/Developer/Headers/FlatCarbon -pipe -O2 -arch x86_64 -D_FORTIFY_SOURCE=1 -O2 -arch x86_64 -DPERL_DARWIN -I/opt/local/include -no-cpp-precomp -fno-strict-aliasing -I/opt/local/include -I/opt/local/lib/perl5/5.8.9/darwin-2level/CORE -I/opt/local/Library/Frameworks/Python.framework/Versions/2.5/include/python2.5 -I/opt/local/lib/ruby/1.8/i686-darwin10 -DRUBY_VERSION=18
Linking: /usr/bin/gcc-4.2 -L. -L/opt/local/lib -arch x86_64 -L/opt/local/lib -arch x86_64 -o vim -lncurses -liconv -framework Carbon -L/opt/local/lib -arch x86_64 -L/opt/local/lib/perl5/5.8.9/darwin-2level/CORE -lperl -lm -lutil -lc -L/opt/local/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/config -lpython2.5 -u _PyMac_Error /opt/local/Library/Frameworks/Python.framework/Versions/2.5/Python -lruby -lobjc

ShougoShougo2010/10/27 12:38> 解決ソリューションとしては QuickRun + async 等で解決できる
> vimproc だと stdout 出力が終わるまで ...F... とか出ない
それはvimprocの問題ではなく、現在のQuickRunの仕様です。vimproc自体は非同期の出力に対応しています。

>その方法、どれも手元の環境だとうまくいかなかったんだよね。
それはvimshell使ってもということですか?
んー、私はMac使っていないので分からないですね。
ひとまず、私の環境では動いているし。
まぁ、基本的にMacVimは不安定なので……。

ujihisaujihisa2010/10/27 12:56いかにもMacVimっぽい感じですがひょっとしてMacVimですか? Vim Hacksにも書いていますが、MacVimは恐ろしい罠の宝庫です。fork()で固まるバグなど・・・。(って投稿済みの未来の記事でした。)

回避方法はありまして、僕のvimrcにそのあたりの設定を記述しています。ノーフリーズでイケます。

secondlifesecondlife2010/10/27 13:24> Shougo さん
vimproc はちゃんと非同期でIO出力できるんですね。ありがとうございます。エントリー訂正します。

> ujihisa
おー、回避方法があるなら試してみたいですね。未来記事に期待です。

takkan_mtakkan_m2010/10/27 16:21> ちなみに :focus => true でその spec だけ実行するというのをいままで知りませんでした、便利!
:forcus => true と書くから、そのspecだけとかでなくて、RSpec.configure{|config| 〜 }でconfig.filter_runで指定したメタタグのもののみ走るようです。
config.filter_run :hoge => true
ってやれば、:hogeになります

secondlifesecondlife2010/10/27 18:55おー、filter すごいですね。夢が広がりそう!

mirakuimirakui2010/10/28 00:10sassのリセットの件ですが、compassとかつかうとreset機能ついてますね

secondlifesecondlife2010/10/28 10:42compass にある global-reset はコード見る限り、ブラウザデフォルトの挙動のみを打ち消すだけなんですよね。
ほかに定義されてる mix-in あるのかな。

トラックバック - http://subtech.g.hatena.ne.jp/secondlife/20101027