すがブロ

sugamasaoのhatenablogだよ

rascut による autotest 環境

無限 FlexUnit

FlexUnit は現在 RC1 ですが、なかなか安定している感じですし、何よりも Adobe がきちんと開発しているので、AS3 というか Flex 界隈でも今後 UnitTest 文化も成熟してくると思われます。
で、そーなると、今後はいかに負担なく UnitTest を作成・実行していくか? という観点での話になってくると思うんですね。

FlexUnit を使ってみると

環境の構築とかは FlexUnitを試してみた - @sugamasao.blog.title # => ”コードで世界を変えたい” を見てもらうとして、実際にやってみる。
そうすると、

  1. テストケースを書く
  2. テスト実行する

というパターンや

  1. 実装する
  2. テスト書く
  3. テスト実行する

のようなパターンをちょくちょく行う事になります。
そうすると「よし、テスト実施だ!」テスト実行→「あ、間違ってた」修正→「テスト実行や!」とかのサイクルが面倒ですよね。

そこで autotest

autotest っていうのは ZenTest | zenspider.com by ryan davis の中に含まれる コマンドで、Ruby で使われてるツールの名前?なのかな。
ファイルの変更を監視して、変更があったら即座に RSpec を実行してくれるっていうモノ。
つまり、明示的にテストを実行するのではなく、とにかくひたすらテストは実行させておく。保存したらテストケースだろうがテストスイートだろうが、テスト対象のソースだろうがとにかく変更があったらテストする。

そうすることで

少なくとも手動で確認する操作が1ステップ減らせるし、画面の端にでも映るようにしておけば視線をエディタに向けたままの操作も可能だ*1

じゃあ環境を構築してみましょう

が必要になります。

FlexUnit を動かすために

まず、FlexUnit を実装できる環境は必ず必要。なので、上記のページ等から使えるようにしておきましょう。

rascut を動かすために

Ruby 製のツールのため、 Ruby が、そしてパッケージ管理ソフトの RubyGems が必要。
Windowsの人はここからインストールすると、両方入るようだ。Rumix - Ruby Starter Package with Installer
Mac の人は MacPorts に入ってるので、ports を入れて

sudo port install ruby
sudo port install rb-rubygems

ってやれば良いと思う。たぶん。
で、gem が入ったら以下のようにする。

sudo gem install rascut

これで rascut がインストールされる。
パスが通ってれば rascut --version でバージョンを確認できる。自分の環境だと 0.2.1 のようだ。

rascut の使い方

ここを見るのが良いと思う。パッチとかは当時の話しなので無視しても大丈夫だと思う。

ここまで来たら事前準備は終わり。実際に試してみよう。

稚拙のライブラリで試してみましょう

にはそこら辺を実行する環境を整えているので*2、実際に動かす調度良いサンプルになると思う。
http://github.com/sugamasao/BrowserUtility/downloads から新しい zip 等をDLしてもらい、以下のautotest.shを修正します。
30行目付近で各コマンドやライブラリのパスを設定していますので、そこを各自の環境にあわせてください。
Macでportsを使って Ruby をインストールしていれば FLEX_UNIT_PATH と LOG 以外は変更する必要が無いと思いますが。。。

というわけで実行

sugamasao@SIEGFRIED% ./autotest.sh
[./autotest.sh] fetch file.[/opt/local/bin/rascut]
[./autotest.sh] fetch file.[./src/TestRunner.mxml]
[./autotest.sh] fetch dir.[/opt/flex/flexunit/libs]
[05/11 23:43:55] Start Mongrel: http://0.0.0.0:3001/
[05/11 23:43:56] Compile Start
[05/11 23:43:57] Found update file(s)["./src/test/TestSuiteAll.as", "./src/com/github/sugamasao/browser_utility/BrowserUtility.as", "./src/test/com/github/sugamasao/browser_utility/BrowserUtilityUATest.as", "./src/com/github/sugamasao/browser_utility/Location.as", "./asdoc/print.css", "./src/com/github/sugamasao/browser_utility/Browser.as", "./src/test/com/github/sugamasao/browser_utility/BrowserUtilityTest.as", "./src/test/com/github/sugamasao/browser_utility/BrowserUtilityLocationTest.as", "./asdoc/style.css", "./src/com/github/sugamasao/version/BrowserUtilityVersion.as", "./src/TestRunner.mxml"]

こんな感じで色々出力されていますが、これですでにFlexUnitが起動しています。
http://localhost:3001 へアクセスしてみましょう。
アクセスすると、FlexUnit が実行されますね。おそらく、すべてのテストがパスされてグリーンになってるはずです。

ちなみに、autotest.sh は rascut を起動するときに引数を渡すのが面倒だからやっているだけで、rascut を直接実行しても問題ありません。以下と同等です。

rascut -s -c -compiler.library-path+=(FlexUnitへのパス) FlexUnitCore.run を実行してるファイルパス

準備完了

あとは粛々とファイルの編集をしてみるだけです。
試しに、以下のファイルを編集してみましょう。あ、FlexUnitを開いているブラウザは常に目にはいるようにしておいてくださいね。
最悪でも、右側の緑のチェックマークみたいのが視界に入ってるようにしておくと良いです。

src/test/com/github/sugamasao/browser_utility/BrowserUtilityUATest.as

例えば、17行目のObject の右端に、 ver:4.0 という値がありますね。ここを ver:5.0 にしてみましょう。
保存して1〜2秒くらいでブラウザがリロードされてテストNGの赤いアイコンに変わりましたね。

このまま、先程変更した箇所をもとに戻して保存すれば、同じようにテストが実行されます。
コンパイルして実行されるまで少しだけタイムラグがありますが、おそらく毎回自分で手動で実行するよりは速いレスポンスで実行されていると思います。また、色が目に入るようにしておけばテストが実行されるのはわかりますので、祈りながらバーが伸びていくのを見つめる必要もありません。

そんな訳で

FlexUnit で UnitTest が普及してくる今こそ、autotest で手間を省いたテストライフを送ってドヤ顔できるチャンスです!
enjoy!

*1:rascut のプラグインとか書けば Growl への通知とかできるかもしれない

*2:as_loggerも同様だけど