なんでもターミナルで完結させたい病

最近Objective-Cをお仕事で書いてたりするんだけど、試行錯誤しながらじゃなくてある程度量書くようになってくるとXcodeじゃかったる過ぎるので、ObjC対応済みのctagsをインストールしたりxcodebuildをよしなに叩いてくれるRakefile書いたりしてvimで作業する環境を整えた。もちろんiPhoneシミュレータを起動したりリファレンス読んだりするのでXcodeは開きっぱなしなんだけど、それでも書くのをvimでやれるようになったら大分楽になった。

書くのは楽になったけど、そうなると今度は動作の検証もいちいちシミュレータ起動してあれこれ操作してってのが馬鹿馬鹿しくなってくる。そもそもテストも書かないでアプリ開発とか泣けてくる。幸いiPhoneSDKでもOCUnitが使えるので、ライブラリとして切り出せる部分を別プロジェクトに切り出した上でユニットテストを書くことにする。OCUnitがUnitTest Bundleっていうテンプレートを用意してくれてるので、プロジェクトにUnitTestのターゲットを追加してそれをビルドするだけでテストが走るようになっている。これならrakeからも簡単に実行できていい。

読めないよ

が。OCUnitでのテストをやったことある人は知ってると思うけど、OCUnitの実行結果はそんなに見易くない。

ocunitbuild

読めるかっつー話。もちろんこれはXcode上でも表示されるので、何の装飾もないのも当然。UnitTest Bundleのターゲットをビルドしたときに走るカスタムスクリプトを自分でごにょごにょすればいいっていえばいいんだけど、同じXcodeのプロジェクトを他の人がいじったりすることも有り得るのであんまりそっちで特殊なことをしたくない。Xcode上でビルドしたときはこれはこれでいいのだし。かといってそのままならビルドしてテストまで走らせてくれるようになってるのに、自前でビルドしてパッケージしてテストして表示するRakeタスクを作るのもなんだかなあ。それ両方メンテするの途中で面倒になって結局どっちか放置しそう。

見辛いなら見易くしてやればいいのです

というわけで、xcodebuildを実行した結果を綺麗に整形して表示するスクリプト書いた。さっきのテストがこんな感じに表示される。

rocu

こういうのでいいんだよ、こういうので。緑色になってるとテンション上がるだろ。

ちなみに、STAssert系、NSAssert系のアサーションや、実行時のエラーなどもちゃんと拾う(拾ってくれなきゃ意味ない)。failさせるとこんな感じになる。

rocu_fail

STAssertでこける、つまりテストケースで期待した結果が出てないときは赤字でアサーションのメッセージを出す。アプリ内のアサーションでひっかかってるときは黄色。それ以前にランタイムエラーで実行中に落ちる場合は赤の太字。ちなみに別に自前でテストツール作ったわけじゃないので(あくまでxcodebuild実行時の出力をフィルタしてるだけ)、ランタイムエラーがどこで出てるかまではわからない。そういうのはXcodeのデバッガとかでやってくだしあ。でもNSAssert系のマクロを使うとこけた場所も取れるので、ある程度厳密にやっておきたい値の検証とか積極的にNSAssert使うといいと思う。OCUnitの実行時にはNSLogでprint debugってわけにも行かないしねぇ。

一応コマンドにしてgistに上げてみた。色付き表示にするにはTerm::ANSIColorがいるので注意。色がいらなければ無くてもいい。使い方はソース読むといいと思います。元々Rakefileの中に書いてたのを抜き出してきてやっつけでコマンドにしたやつなので、全然動作の検証とかしてない。なんかツール郡にまとめようかと思ったけど満足しちゃったので。