テスティングフレームワーク調査

今日は大人の事情によりテスティングフレームワークについて調査。
対象となるフレームワークの要件としてはサーブレットJSPをテストできること。
できれば単体が良いけど、無理ならデプロイ系のやつでも仕方ないかと思ってます。
対象となるコードはサーブレットとか言ってる時点でJAVA
 
 
JUnit
まずは、王道のJUnitから調べてみる。
JUnitにはそもそもリクエストとかそんな小洒落た機能なんぞ持ち合わせていない(と思う)。
じゃあ、ダメだなぁ。
と、諦める前にモックオブジェクト方式のやり方を検討してみたい。
実際に必要なものはHttpServletRequestとか自分で作成することが困難なオブジェクトが必要なだけ。
んだば、こうした面倒くさいものをモックで用意してやれば良い。*1
JUnit*2との連携を考えると資料が揃っているjMockかEasyMockを使いたいところ。
また動的にモックオブジェクトを作成してくれるのもありがたいですね。
どっちもどっちの性能だし、開発もどっちもどっちな感じ。
ライセンスとしてはjMockは独自ライセンスで、EasyMockはApacheライセンス。
独自ライセンスは少し怖いけどね。
どちらも以下のようにモックを作成できるので、サーブレットテストを行う分には問題なさそうですね。
 

jMock
Mock mock = new Mock(HttpServletRequest.class);

EasyMock
HttpServletRequest req = createMock(HttpServletRequest.class);

 
jMockは独自にMockインスタンスを持っているようで、それで他のインスタンスをラップしてるのでしょうか。*3
EasyMockの方が視認性は高そうですね。
単純に別インスタンスを生成するだけならばEasyMockの方がわかりやすいかも。
しかし、どちらのフレームワークであっても、モックオブジェクト方式の最低限のルールは守らなければなりません。
それはインタフェースを介した呼び出しが可能なインスタンスしか取り込めないこと(らしい)。
独自クラスや既存クラスの場合はこれが障害になりそうですね。*4
HttpServletRequestのMockObjectを作るよりは、素直にコンテナの中でテストしたほうが良いという場合もありますけど。
 
参考:
jMock
EasyMock
いがっちの覚書(java/JUnit)
Strategic Choice(テストに関するパターン・Mock Object(モックオブジェクト))
 
 
Cactus
Cactusは言わずと知れたサーブレットJSP、フィルターなどをテストするフレームワーク
Apacheプロジェクトのため何となく安心できるのは、多分気のせいでしょう。
サイトの最終更新日が2009年(2011/04現在)となっているのがなんとも微妙な気分にさせてくれます。
 
CactusはJUnitを拡張したものであり、基本的な利用に関してはJUnitを踏襲しています。*5
問題点としてはコンテナを必要とする点でしょうか。
純粋な単体テストとは微妙に異なるかもしれません。*6
また、コンテナ依存してしまうようなテストも難しいでしょう。
テストの取捨選択の必要がありますね。
 
CactusにはRedirector Proxyという強い味方がいます。
Redirector Proxyとは、クライアントとサーバ間のHTTP通信制御や処理を行うプロキシです。
このプロキシはサーブレット用、JSP用、フィルター用といくつか用意されており、テスト対象に合わせてweb.xml荷記述することになります。*7
面倒くさいですね。
テストのためにweb.xmlを書き換えなければならないとかガッカリします。*8
Cactusは比較的によく利用されているテストツールのため様々なTipsがあるので、参考サイトを見ると良いかもしれません。
 
参考:
Apache Cactus
TECHSCORE
 
 
HTTPUnit
目的からは大分離れていますが、物のついでに調べてみました。
HTTPUnitはxUnit系列のテスティングフレームワークです。
主にwebアプリケーションの画面テストなんかを取り扱うもの。
ブラウザエミュレーションしてテストを行うようですが、それならJMeterでもあんまり変わらないんじゃないだろうかとか思わない。
開発履歴が2008年とかで止まっているのがミソで、成熟しているのか枯れているのかは不明なところ。
記法はxUnit系列なのでJUnitなんかとあまり変わらないのは良いかも知れませんね。
基本的にブラウザ動作のテストになるので、完全に結合テストになってしまいますね。
 
参考:
HttpUnit
 
 
3つのテスティングフレームワークを調査しましたが、何となく楽そうなのはモックオブジェクト方式のものですね。
メンテナンス性で言えばCactusなのでしょうが、コード書きにはjMockやEasyMockなどのように感じます。

とかなんとか。

*1:ご承知の通り、モックオブジェクト方式とはテストに必要な外部インスタンスを擬似的にメモリ上に用意し、それを利用してテストする手法

*2:あと、Eclipse

*3:コード見てないので不明

*4:回避方法としては指定クラスをオーバーライドすればいいらしい

*5:JUnitライブラリが必要ですし

*6:と言っても、Redirector Proxyの恩恵によりクラスを直接扱える模様

*7:とかとかで囲むあれです。

*8:antで何とかしたい