cfneo実装機能の棚卸

SeasarConference2008Autumnでお話しさせて頂いた内容を思い返していまして、ふとcfneoの全容を伝えなかった事に思い至りました。(激しくいまさらorz。

SC2008Autumnでは、UnitTestへのアプローチという点を中心に、テストという仕事をほぼサポートしてないColdfusionにどういったテストへのアプローチが良いかという事を模索した過程をお話したつもりなのですが、実はそのUnitTestへのアプローチの為に、色々な機能を作りこんでいます。
なので、Watijの開発は続けておりますし、それ以外にも色々個人的に勉強してはいるのですが、ちょっとcfneoの機能の棚卸をしようと思います。


主たる機能は、TestRunnerというコンポーネントに代表されるexpectedとactualの比較を行うメソッドです。
これはSC2008Autumnで簡単にお見せした機能で、ようはパラメータに想定の値と実際の値を渡すとHTMLで結果を出力してくれるよ、という奴です。

メリットは、ColdfusionでJUnitちっくなUnitTestが可能となる点、CFUnitのように全て成功してしまうとどんなケースをテストしたか見えなくなってしまう事がない点で、これは何度かここに書いたと思います。

この機能はまだいくつか課題がありまして、現時点では多次元配列に対応していないとか、見栄えや繰り返し閲覧する、継続的にレポートを溜め込んでいく、等について対応が必要だと認識してます。


続いて、Moduleとそれが集約されたコンポーネントの擬集度を高め結合度を下げる為、関数的な(同じパラメータを渡せば同じ結果を返す)Functionの設計の推奨をしていると同時に、簡単にコンポーネントを取得、利用できるような仕組みもあります。簡易DIなどと呼んでいた機能ですが、コンポーネントの取得が配置されたパッケージに依存する事なく簡単に生成、取得する事が出来るようにしたComponentManagerというコンポーネントが存在します。
これを使用する事で、たとえばhttp://hoge.jp/app1というドメインディレクトリの配下にあるコンポーネントでも、app1をルートとしたパスの指定(コンポーネントのファイルがapp1/comp/comp1.cfcであれば、)"comp.comp1"と指定する事が可能となります。


続いて、SessionManagerというものもあります。

これはColdfusionがJRE上で稼動していて結構なフレームワークになっているにもかかわらず、どうもSessionなどは非同期でしか扱っておらずcflockのタグなどを使わないとヒドイ目にあう、というシロモノなので(普通に考えて、Sessionを排他ロックをかけずに扱いたいというシチュエーションがあるようには思えないのですが。。。まぁいいや)、一括して排他ロックを行うものとして利用するものです。

同一のスコープを指定したcflockをネストして使うと、当然のようにデッドロックするので、こういったものは一箇所でやってしまった方がよく、ついでに言うとやる事が同じなので作ってしまった方が良い、という事ですね。


また、このSessionManagerを使う事でColdfusionでおなじみの「URL崩れ」も回避する事が可能です。

ColdfusionではPOSTメソッド実行時のformパラメータを受け取った後にcflocationを使用するとformスコープが参照できなくなってしまう為、、cfincludeでコピー句のように他のファイルを読み込まざる得なくなる、という事態が発生します。これがURL崩れを生む要因の最大のものです。そして、これを回避するにはSessionへ一時的にパラメータを退避させる必要があるのですが、それを画面個別にごりごりと操作するコードがあるというのはあまり良い状態じゃありません。という訳で、それを操作する為のユーティリティ的なポジションのSessionManagerを作った、という訳です。


URL崩れが無くなれば、Seleniumなどを使ってブラウザ側からテストをする際も、URLの変化を意識しながらテストケースを作る必要がありませんので、ぐっと楽になっていくと思います。(SeleniumIDEを活用すればさほど気にならないかも知れませんがw)


これらの機能は、まぁどのフレームワークでもある機能だと思うのですが、全て「テストという仕事をする」という目的の為に作った機能ですので、もしかしたら今後ちょっとずつ差異が出てくるかも知れません。