autotest,RSpec,Emacsで快適テスト環境をつくる(あとGrowlも)


前回RSpecを設定したので調子に乗ってautotestと連携させてみる。

autotestとRSpecを連携させると何がおいしいか?

・保存の度にテストが裏で走るので常にテストに通るコードを書ける。
・とにかくテストが癖になる。
・とにかくテストが好きになる。

下二つは個人的な感想ですけど、ほんとに楽しくテストができる。


なにはともあれ設定してみる

まずは毎度おなじみgemでZenTestをインストールする。(autotestはZenTestに含まれる)

sudo gem install ZenTest

インストールが終わったら、~/.autotestを作る。
さっきインストールしたZenTestに叩き台があるのでまずはそれをコピー

cp /Library/Ruby/Gems/1.8/gems/ZenTest-3.10.0/example_dot_autotest.rb ~/.autotest

そのままじゃあRSpecが動かなかったのでるびきちさんの設定をまねて.autotestにRSpecを使いための設定を書く(RSpecのバージョンは1.1.4です)

以下を.autotestの末尾につける。

Autotest.add_hook :initialize do |at|
  if defined? Autotest::Rspec
    def at.ruby
      "#{super} -I.:lib:spec"
    end
  end
end

あとはテストコードとテストしたいコードを適切なディレクトリに配置する。

mkdir ~/www       #←プロジェクトホーム?っぽいディレクトリ。なんでもいい
mkdir ~/www/lib   #←ソースコードディレクトリ 
mkdir ~/www/spec  #←テストコードディレクトリ

wwwに移動してautotestを叩くと動くはず。

Emacsへの設定とGrowlでの通知

まずはautotest.elを落としてelispフォルダに入れる

wget http://www.emacswiki.org/cgi-bin/emacs/download/autotest.el
mv autotest.el ~/elisp/

続いてemacs.elに以下の設定を追加

(require 'autotest)

これでMx autotestを打つとEmacs上でautotestが動いてくれる。


最後に私の開発環境はMacなのでおなじみのGrowlで通知するように設定する。

ザリガニが見ていたさんを参考に設定

Growlをダウンロードして中に入っているGrowl.mpkgをインストール。
そのあとExtrasに入っているgrowlnotiryをインストール

cd /Volumes/Growl-1.1.4/Extras/growlnotify
./install.sh

つづいて.autotestのgrowlの設定箇所のコメントアウトを外す

require 'autotest/growl'

そのままだと成功=>成功と2回以上成功が続いた時には通知されないのでautotest/growlid:willnetさんのZenTest,autotest,redgreen,growlでテストファーストのように書き換えてちょこっといじる。

# -*- ruby -*-

module Autotest::Growl
  def self.growl title, msg, img="~/.rails_ok.png", pri=0
    title += " in #{Dir.pwd}"
    msg += " at #{Time.now}"
    system "growlnotify -n autotest --image #{img} -p #{pri} -m #{msg.inspect} #{title}"
  end

  Autotest.add_hook :run do  |at|
    growl "autotest running", "Started", "OK画像のパスに書き換える"
  end

  Autotest.add_hook :red do |at|
    growl "Tests Failed", "#{at.files_to_test.size} tests failed", "NG画像のパスに書き換える", 2
  end
#すべてのテストがすべて成功だったときにGrowlの通知を毎回だすようにしてみた
#  Autotest.add_hook :green do |at|
#    growl "Tests Passed", "Tests passed", "~/.rails_ok.png", -2 if at.tainted
#  end

  Autotest.add_hook :all_good do |at|

#    growl "Tests Passed", "All tests passed", "~/.rails_ok.png", -2 if at.tainted
    growl "Tests Passed", "All tests passed", "OK画像のパスに書き換える", -2
  end
end

これで保存の度にGrowlがテスト結果をすてきに通知してくれるようになった。
Growlで通知してくれるようになるとさらにテストが楽しくなった。