Webアプリのテスト

Open Search Description を表示するほうほうも大体めどがたった(XMLBeans を使ったので、自動生成したライブラリが、com.a9 からはじまっちゃうのは、なんとなく、自分のドメインじゃないので、気持ち悪いところがあるのだが...。)ので、そろそろ、Webアプリケーションもテストしようと思い立つ。というか今までテストなしだったんかいっという気もするが、延々にしていたのだ。あはは...。ということで、色々調べてみたんだが、jWebUnit, HttpUnit, HtmlUnit, Cactus などなど...。色々あるけど、Cactus を使ってみることにした。他も、色々できるのだけど、Cactus で環境をセットアップしておけば、ServletContainer の起動停止も Cactus で面倒をみることが出来そうだったので、これにした。そうすれば、他の Unit テストライブラリもあとから使うことはできそうだし。いままで、まともなアクセステストすらやっていなかった(目視確認のみ!) ので、何か自動テストを入れたかったのだ。


まずは、Cactusをダウンロードしつつ、それを翻訳してあるサイト ( http://www.ingrid.org/jajakarta/cactus/doc/ ) を参考にサンプルを動かすことから始めてみる。今作っているビルド環境は、1つの ANT のプロジェクトからテストを実行するようにしている為、Cactus の実行も同じように 同じ build.xml から呼び出すようにしたい。 ANT を使っていて便利とおもったのは、 get というタスクだ。 http://hoge/foo/bar みたいなところにあるファイルを持ってくることができる。タイムスタンプの確認もして、新しければダウンロードなども可能だ。


getタスクでファイルを持ってきたら、unzip タスクで展開する(元々zipファイルをゲットしてくるようにしておく) 。適当な作業ディレクトリに展開するようにしておく。次に、 ant から ant を呼ぶ為のタスクもあるので、それを利用して呼び出してみた。。。。んだけど、次のエラーでビルドが止まる。

java.lang.NoClassDefFoundError: org/apache/xml/serialize/OutputFormat

うーん、こいつは何だ???と思っていろいろ探していたら、xerces-j というやつに入っているようだ。 http://xml.apache.org/xerces2-j/ に含まれているみたい。ということで、これを試しに、/lib に入れてみたが変わらず。ということで、build.xml をちゃんと読んでみると、残念ながら、片っ端から持ってくるようにはなっていない。うーん、と悩んでいたら、あらかじめファイルを用意しておいて、 ANT でコピーすればいいじゃんということに気が付いた。結局、今やってるのはとりあえず使い方のお勉強なので、バージョンアップで互換性とかそんなことは関係ない。目先の Cactus の実行だけだし。


適当にファイルを準備して copy タスクでコピーする。その他、build.properties と tomcat の server.xml を用意して、それぞれ filterset を利用して文字列を置換しつつコピーしてみた。


今度は、ディレクトリからおかしな場所を指しているエラーが出る。うーむ。みてみると、ディレクトリ文字列から\ が消えてる(Windows環境のFile.separator) 。なんでだろ....と、思っていたら、build.properties ってJavaのPropertiesクラスで読むような形式だから、エスケープ文字と間違えられているってことだ。くそー、Windowsめ!と心の中で叫びつつ、何か手を考える。色々、調べて楽そうなのは、replace タスクを使うのがいいんじゃないかと。最初、token に \\ とか指定してたら、さっぱり置換されねーとか、思っていたのだが、こんどは XML ファイルなので、エスケープとかそいうんじゃないよねーってことで、普通に \ で指定して、そいつを / に置換してしまう(\\ でもいいのだが、どうせ / でも解釈してくれるだろうから、、、)。という感じで、やれば問題なさそうだ。 Filterset とか Replace とか初めてつかったけど、結構便利だな。ちょっとづつ、自分のアイテムを増やしている感じだ。

参考までに、こんな感じ。フィルタの時は、tokenをfiltersetで指定するか、デフォルトの@ でTokenを囲うのかどちらか。最初しらなかった。あはは。なので、build.properties の中で 指定する文字列は、@test.tomcat.http.port@ みたいにしておく必要がある。

...







...

こんな感じでええんかなと思っているのだが、いまいちうごかねー。Tomcat起動まではしているっぽいんだが...。(続く)

参考

jWebUnit: http://jwebunit.sourceforge.net/
HttpUnit: http://www.httpunit.org/
HtmlUnit: http://htmlunit.sourceforge.net/
Cactus: http://jakarta.apache.org/cactus/