読者です 読者をやめる 読者になる 読者になる

すがブロ

sugamasaoのhatenablogだよ

Ruby の開発環境として ZenTest(autotest)を入れた

tdd test ruby イベント

この間 BPStudy#29 に参加してきました

そこで TDD とペアプロを行なってきました。

やってみた感想

TDDに関しては、言われた通りの事が実感できました。
たとえば、テストを書く時点でインターフェイスについて考えるとか。

ただ、絶望的な問題があった

テストを実行するのが面倒という点。
編集する→テスト(テストコマンドを実行)する、というのはまったくもって刺身たんぽぽな作業であり、DRYですらない。
で、以前からZenTest というのは聞いていたので、その環境を構築しておくべきだった、と痛感した。

なので、環境をつくってみたよ

autotest による RSpec の自動テストと、その結果を Growl に通知するように設定しました。

gemのインストール
  • sudo gem install zentest
  • sudo gem install ruby-growl(必要なのかよくしらない)

ちなみに、 ZenTestは 4.2.1 で、 ruby-growl は 1.0.1 です。

autotest の設定

まず、RSpec 厨のみなさんは export RSPEC=true をしてください。
これが無いと rspec のファイルを読み込んでくれません。
コマンドラインからで追加できたなら、お使いの .bashrc とかに記載しておくと良いです(これ、環境変数じゃなくて .autotest に書く方法ないんですかね?)。
(追記)
コメント欄で、id:ursmさんから助言頂きました。
autotest の代わりに autospec でテストを実行すると良いみたいです。ありがとうございます!

rspec 付属のコマンド "autospec" を使うといいです。
必要な環境変数をセットして autotest を起動してくれます。

(追記終わり)
そして、その次に自動でテストを実行してくれる autotest の設定ファイルを記載する。
基本的には雛形をコピーして編集していくことになる*1

cp -ip /opt/local/lib/ruby/gems/1.8/gems/ZenTest-4.2.1/example_dot_autotest.rb ~/.autotest

僕は Growl に通知したいので追記しましたが、特に不要であれば追記する必要もない(はず)。
ここの設定を参考にしました(ちょっと改変したところもある)。

# -*- ruby -*-

# require 'autotest/autoupdate'
# require 'autotest/once'
# require 'autotest/rcov'
# require 'autotest/restart'
# require 'autotest/timestamp'

# Autotest::AutoUpdate.sleep_time = o# Autotest::AutoUpdate.update_cmd = o
# Autotest::RCov.command = o
# Autotest::RCov.pattern = o


# ref.http://aerial.st/archive/2009/07/21/display-autospec-results-with-growl
module Autotest::Growl
  def self.growl title, msg, img="~/.rails_ok.png", pri=0, sticky=""
    msg += " at #{Time.now.strftime('%Y-%m-%d %H:%M:%S')}"
    # autotestは使わないので、-nで指定するアプリケーション名はautospecで良いと思う
    # -Hで通知先のGrowlのあるホスト名を指定する
    system "growlnotify -n autotest -p #{pri} -m #{msg.inspect} #{title} #{sticky}"
    #system "growlnotify -n autospec -H localhost --image #{img} -p #{pri} -m #{msg.inspect} #{title} #{sticky}"
  end

  Autotest.add_hook :ran_command do |at|
    results = at.results.last
    examples = results[/(\d+)\s+examples?/].to_i  # テストの総数
    failures = results[/(\d+)\s+failures?/].to_i  # 失敗の数
    errors = results[/(\d+)\s+errors?/].to_i # エラーの数
    if examples >= 0
      if failures > 0 || errors > 0
        growl "Tests Failed", "#{examples} examples, #{failures} failures, and #{errors} errors", "~/.rails_fail.png", 2
      else
        growl "Tests Passed", "#{examples} examples, #{failures} failures, and #{errors} errors", "~/.rails_ok.png", 0
      end
    else
      growl "Tests Errored", "errors", "~/.rails_fail.png", 2
    end
  end
end

画像の部分はそのうちイカしたの見つけたらそれに変えるつもりw

Growl の設定

Growl はインストールされていると過程して、コマンドラインから growlnotify が使えるか確認してみる。

growlnotify -m "hoge" -t "title"

これででれば上記のままで作業は完了。ない場合は Growl から Growl の本体を一度DLして、

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

で、growlnotify をインストールしましょう。
これで準備はおk
autotest を実行すると、せっせとテストして、Growl で通知をしてくれます。

まだだ、まだ終わらんよ

これだけどツマラナイ。何がツマラナイかと言うと、Growl の見た目がつまらん。
なので、Growl の設定を変えていく。
TDD厨なら、OKなら緑だし、エラーだったら赤くしたいよね。
そー言う場合は、Growl のプライオリティの設定を変えると良い。
「システム環境設定」→Growlで管理画面を開く。
「表示オプション」のSmoke という欄で、プライオリティ別にGrowlの通知ウィンドウの文字色や背景色を変えることができる。

プライオリティの数値は -2 から 2 までの間で、2が緊急。
あとは、各アプリケーション毎の growl の設定を変えてあげれば良い。
実は、一度でも実行すると、こちらのリストに名前が入り、各アプリケーション毎の挙動を変えることができる。
今回は .autotest に追記した設定で autotest というアプリケーション名になっているので、こいつを選択する。

ここで autotest を選択して設定ボタンを押す。

通知ボタン(タブ?)を押して、「表示スタイル」を"Smoke"にしてみる。
こうすることで、テスト結果が Pass ならグリーン、NGなら レッドになる。これで勝つる!

これで準備は完了

あとは自分のゴーストの囁きのままにTDDすればおっけーです。

*1:が、全部コメントアウトの状態なのでイチから書いてもおk