Fixtures Visualizerプラグインを公開しました
あけましておめでとうございます。今年もよろしくお願いいたします。
2008年の最初のエントリは、新年の挨拶もほどほどに、この冬休みの宿題の1つの成果報告をしてみよう。4つほどあった宿題だが、結果が出たのは1つのみである。なんとも情けない。。。
さて、昨年さんざん騒がれたRuby on Railsだが、「Javaな感覚」でRailsアプリを作ると、それはすなわち「Java以上の失敗プロジェクト」になる。「Javaな感覚」とは、つまり、コンパイラの存在。Javaにおいて、コンパイラが行ってくれる文法チェックやクラス間の依存性検証は、プログラマに対して非常に大きな安心感を与える。もっと言えば、非常に低いレベルとは言え、単体テストコードがなくても、コンパイラがあればなんとかリファクタリングができてしまうことも多いだろう。
しかし、Rubyにはコンパイラなどない。Railsの場合、プログラマがどこで保険を得れば良いか?そう、単体テストコードである。Javaのコンパイラが担っている作業は、Railsでは全て単体テストで実施しなければならない。そのため、Railsは単体テスト環境において非常に手厚いサポートを提供してくれている。このサポートによる単体テストの気持ちよさがあったために、僕はJavaよりもRailsを使うようになったと言える。
そんなRailsの単体テスト環境では、テストデータをfixturesという機構で準備する。このfixtures、実体はYAML形式のファイルである。例えば、
yoichiro: id: 1 name: Yoichiro Tanaka age: 32 goro: id: 2 name: Goro Kuroita age: 65
といった感じの内容になる。モデルクラス(=データベースの表)1つに対して、fixturesのYAMLファイル1つが対応する。つまり、データベースの表の数だけfixturesファイルが作成される。
もちろんRailsが対象にするのはリレーショナルデータベースなので、複数の表の間に関連がある。例えば、Departments表とEmployees表は、従属の関係があり、特にRailsの場合は、Employee表にdepartment_id列があることになる。department_id列の値が、Departments表の行、つまり所属部署を示すことになる。ま、当たり前の話だが。
この関連、fixtures上で管理するのは非常に難解な作業となる。ただでさえ列の値で関連を追うことが難しいのに、表ごとに分かれてしまっているテキストファイルであるため、ちょっと数が多くなれば、すぐにメンテが苦痛になってきてしまうだろう。せっかくの便利な機構が、これでは台無しになってしまう。fixturesの内容、特に関連について視覚的に把握できるようになれば、fixturesのメンテナンスや、それを元にした単体テストコードの記述がしやすくなるのではないだろうか。
そんな動機から開発してみたのが、Fixtures Visualizerプラグインである。ベタベタな名前が示す通り、fixturesの内容を視覚的に表示してくれるというプラグインだ。最初は、fixturesの内容をXMI形式でエクスポートし、それを各種UML作図ツールにインポートして閲覧する、というストーリーを考えていたのだが、あまりのXMIの仕様の難解さ&ツール独自仕様の氾濫さに嫌気が差して断念。その代わりに、Open JacobのDraw2Dライブラリを使って、Webブラウザ上でfixturesの内容をUMLのオブジェクト図ちっくに見れるようにした。
Trac: Fixtures Visualizer
インストール方法は、上記のページの[Install]の項目を、使い方については同じく上記ページの[Usage]の項目を参照して欲しい。ま、プラグインをインストールして、「http://localhost:3000/fixtures_visualizer」というURLにアクセスするだけの簡単な手順である。以下のような感じで、fixturesが見れるようになるはずだ。
Version 1.0としているが、いくつかのアルゴリズムがヘボいために、fixturesのファイル数およびその中に記述されているデータ数が多くなると、Webブラウザが固まってしまうことや、モデルのDrag&Dropでの移動がもたついてしまう、といった現象が発生する。今後改良を重ねていって改善していこうと思っている。
Railsを使った開発で「fixtures地獄」に悩まされている人々に対して、少しでもこのプラグインが役に立つことを願っている。2008年最初の僕からの成果物、皆さんからのご意見、ご感想などを聞かせて頂けると、とっても嬉しい。
ちょっとだけ余談。本当に不思議に思えてならないのだが、もっとテスト環境の良さをRails関連のコミュニティは訴えるべきなのに、そういうコミュニティは非常に少ない。「Railsだと立ち上がりが早いです」なんて言ってRailsを勧めているコミュニティは、今年中に滅んで欲しいと切に願う。末長くサービスを成長させて公開し続けるための施策こそが、Railsの重要な部分なのに、それに触れずに開発初期の立ち上がりの話のみに終始するなんて、100%ナンセンス。多くのJavaのプロジェクトで真面目に行われることが希少な単体テストのための工数をしっかり積まないといけないため、一般的なJavaなプロジェクトと、ちゃんとしたRailsなプロジェクトは、そう工数に違いはない or Railsの方が多くなるはず。単体テスト環境に触れないRails関連の勉強会があったら、それは使えないプログラマを量産していることになる。良い子のみんなは、そんな勉強会に行かないように。