autotestの結果をgrowlに通知する
先日TDD Boot Camp Tokyo 1.6に参加してきた。参加記事はまたいずれ。
同僚と一緒に参加したらすっかり熱が上がってしまい、翌週「社内TDDBC」なんてのを開催してしまった。この記事も近いうちに。
ということで最近テスト方面が盛り上がっているのだが、TDDBCにautotestの準備が間に合わなかったのが悔やまれる。社内TDDBCでは使っているペアがいたので、悔しくなって急遽セットアップしてみた。
まずはコマンドラインで
必要なrubygemsのインストール
% gem install rspec
% gem install ZenTest
% rspec --version #=> 2.6.4
ディレクトリ構成
kvs/
|-- autotest
| `-- discover.rb
|-- kvs.rb
`-- spec
`-- kvs_spec.rb
実装クラスがkvs.rb、テストコードがspec/kvs_spec.rb。
autotest/discover.tb
Autotest.add_discovery { "rspec2" }
実行してみる
プロジェクトのルートで
% autotest
これでテストファイルの変更を監視している状態。kvs_spec.rbに変更を加えるとテストが実行される。kvs.rbは特に監視していない。
Growlで通知
Macで開発しているので、テストの結果をGrowlに通知してくれると楽しい。
必要なソフトウェアのインストール
セットアップはこちらを参考にした。
% gem install ruby-growl
% gem install redgreen
% brew install growlnotify
通知画像の取得
97きのこ本のイラストを書かれた@mayucoさんの素材を使わせていただくことにした。
% mdkir ~/.autotest.d/
% cd ~/.autotest.d/
% wget http://cocooooooon.com/kinotan/rails_ok.png
% wget http://cocooooooon.com/kinotan/rails_fail.png
% wget http://cocooooooon.com/kinotan/rails_pending.png
~/.autotest
autotestの結果を受け取ってgrowlに流すのは、~/.autotestで行う。
一応全文を書いておくが、修正するかもなので参考にされる際はGitHubをご覧いただきたい。
# -*- ruby -*-
module Autotest::Growl
def self.growl title, msg, img="~/.autotest.d/rails_ok.png", pri=0, sticky=""
msg += " at #{Time.now.strftime('%Y-%m-%d %H:%M:%S')}"
system "growlnotify -n autotest --image #{img} -p #{pri} -m #{msg.inspect} #{title} #{sticky}"
end
Autotest.add_hook :ran_command do |at|
results = [at.results].flatten.join("\n")
output = results.slice(/\d+\s+examples?,\s*(\d+)\s+failures?(,\s*(\d+)\s+pendings?)?/)
if output
if $~[1].to_i > 0
growl "Tests Failed", "#{output}", "~/.autotest.d/rails_fail.png", 2
else
if $~[3].to_i > 0
growl "Pending", "#{output}", "~/.autotest.d/rails_pending.png", 2
else
growl "Tests Passed", "#{output}", "~/.autotest.d/rails_ok.png", -2
end
end
else
growl "Tests Errored #{output}", "errors", "~/.autotest.d/rails_fail.png", 2
end
end
end
まとめとLinks
そういえばずいぶん前の勉強会(たぶんこれのA-4…かくたにさんとわださんじゃないか!)を見て、画面の下からredとかgreenがあがってくる光景(たぶんGrowlの「Music Video」)にえらく感動した記憶がある。3年も前に見たデモに今頃たどり着くなんて不勉強この上ないが、正しい道を進んでいることは確認できたような気がする。
https://github.com/rspec/rspec/wiki/autotest
Autospecを使ってRSpecのテストを自動化 with Growl – ほくの日記
http://d.hatena.ne.jp/hkj/20100810/p1
プログラマの覚書: RSpec+autotest+Snarl その1
http://kiyorin-net.blogspot.com/2008/12/rspec-zentest-autotest-snarl.html