テスティングフレームワークというものも、大規模開発向けなんだろうと思いつつ、流してきた。
折角、Model-Glue でCFコンポーネントにロジックをまとめることを調査しているので、
この機に、ちょっと調べてみよう。
cfcUnit と、CFUnit というものがあるらしいけど、最初に見つけた cfcUnit を調査。
http://sourceforge.net/project/showfiles.php?group_id=100854&package_id=126568
から、ファイルを拾ってくる。現在、1.2.0 beta1 らしい。
cfcUnit ディレクトリと、org ディレクトリを WEB のルートに入れる。
この2つに分かれているディレクトリにどういう意味があるのかは、わからない。
余談だが、cfcUnit は、Mac で開発してるようだ。
http://localhost/cfcunit/index.cfm でテスト実行用画面が表示される。
cfcunit.tests.AllTests というあらかじめ用意されているテストプログラムをテストしてみる。
「Run Test」ボタンを押すと、程なく、テスト完了。
では実際に、テストプログラムを作ってみよう。
今まで使ってきた shopping.model.CartProcess というCFコンポーネントのテストプログラムを作成する。
org.cfcunit.framework.TestCase を継承(extend)して、test で始まる関数を作ればいいようだ。
ここで問題が。この CartProcess コンポーネントは、ColdSpring によるDIを使っているので、そのままでは利用できない。
ColdSpring の機能を Model-Glue 経由で利用しているため、純粋に ColdSpring を利用する方法で初期化することになる。
<cfset variables.cartProcess = "">
<cffunction name="setUp" returntype="void" access="private">
<cfset testBeanFactory = createObject("component","coldspring.beans.DefaultXmlBeanFactory").init()/>
<cfset testBeanFactory.loadBeansFromXmlFile("/shopping/config/ColdSpring.xml",true)/>
<cfset variables.cartProcess = testBeanFactory.getBean("cartProcess")>
</cffunction>
この記述を使って CartProcess インスタンスを取得すればよい。setUp という初期化関数が使えるようだ。
そして、いろんなテストを作成する。
実際にテストを作成してみると、いろんなことを考えないといけないことがよくわかる。
予想はしていたけど、このテストプログラムを作るのは、仕様についても、プログラム言語のことも、
よく理解した上で作らないといけない。
このテストプログラムを作るのにもそれなりの工数がかかると思うのだが、実際の開発では、どれぐらい生産性が上がるものなのだろうか。
こうして作成した CartProcessTest.cfc を CartProces.cfc を同じディレクトリに入れる。
どのようなテストが入っているかは、http://localhost/shopping/model/CartProcessTest.cfc で一覧できる。
テスト実行用画面で、shopping.model.CartProcessTest をテストしてみる。
実際にテストしてみると、一つテストが失敗する。
カートに一つしか商品がない場合に削除ボタンを押しても、カートから削除できないという不具合がある。
CartProces での手抜きがばれてしまうわけだが、ちゃんと作り込んでやれば、全てのテストをクリアできる。
複数のテストプログラムをまとめるために、suite という概念があるようだ。
複数のコンポーネントをテストする場合に、便利なのだろう。
また、cfcUnit には、FLEX で作られたテスト実行用画面もある。
http://localhost/cfcunit/flex/index.html
でその画面が見られるだろう。FLEX だからどうなんだ。と言われても、困るというものだ。