3. Servletのテスト
本章では、Cactusを使用してServletのテストを行う方法について、説明します。
3.1. ServletTestCase
それでは、Cactusを使用してサーブレットのテストクラスを記述してみましょう。以下は、SampleServletのコードです。
1:import javax.servlet.*;
2:
3:...
4:public class SampleServlet extends HttpServlet
5:{
6:
7: public void doGet(HttpServletRequest theRequest,
8: HttpServletResponse theResponse) throws IOException{
9: PrintWriter pw = theResponse.getWriter();
10: theResponse.setContentType("text/html");
11: String test=theRequest.getParameter("test");
12: pw.print("<html><head/><body>A GET request:"+test+"</body></html>");
13: }
SampleServletでは、getで送信されたパラメータの値を取得し、表示します。以下がSampleServletのテストクラスの例です。
1:import org.apache.cactus.*;
2:import junit.framework.*;
3:...
4:public class TestSampleServlet extends ServletTestCase
5:{
6: String test="CactusTest";
7: public TestSampleServlet(String theName)
8: {
9: super(theName);
10: }
11:
12: public void beginShowTest(WebRequest request)
13: {
14: request.addParameter("test", test);
15: }
16:
17: public void testShowTest() throws IOException
18: {
19: SampleServlet servlet = new SampleServlet();
20: servlet.doGet(request, response);
21: }
22:
23:
24: public void endShowTest(WebResponse theResponse)
25: throws IOException
26: {
27: String expected = "<html><head/><body>A GET request:"+test+"</body></html>";
28: String result = theResponse.getText();
29: assertEquals(expected, result);
30: }
31:
32: }
1、2行目でCactusに必要な、org.apache.cactusおよびjunit.frameworkをインポートします。サーブレットのテストクラスは、ServletTestCaseを拡張して作成します。7-10行目でコンストラクタを設定しています。ServletTestCaseはjunit.framework.TestCaseを拡張しているので、コンストラクタはString引数を一つ取るものとなります。
3.2. Testのメソッド
サーブレットに限らず、サーバサイドJavaのテストプログラムには、以下の処理を記述します。
- サーバに送るHTTPRequestに値をセットする
- サーバサイドプログラムを実行する
- 返されたHTTPResponseの値を評価する。
この3つの処理はそれぞれ、beginXXX、testXXX、endXXXというメソッドに記述します。"XXX"の部分が共通です。通常、一つのテストクラスには、複数のテストが記述されていますが、TestRunnerは"XXX"の部分が共通のメソッドを一グループとして、begin->test->endの順で実行します。
例えば、Cactusを使用せずにSampleServletのテストを行う場合、以下の手順で行うと思います。
- SampleServletに、GETメソッドでtestパラメータとその値を送信する。
- (サーブレットエンジンが)SampleServletはHTTP GETリクエストをうけ、doGetメソッドを実行する。
- doGetメソッドより返されたHTTP レスポンスブラウザなどで表示し、意図した結果が得られているか、確認する。
CactusでSampleServletのテストを行う際は、1.の処理をbeginメソッドに、2.の処理をtestメソッドに、3.の処理をendメソッドに記述します。
なお、beginメソッドとendメソッドは必須メソッドではありません。requestに特に何も設定しない場合や、テスト結果の評価をtestメソッド内で行うことが可能な場合は、beginメソッド、endメソッドは必要ありません。