目次

チュートリアル3(内部動作)

仮に CartHtml のコーディングは済んでいるが、ShopHtml が終わっていない、としましょう。 今から CartHtml の動作確認を行いたいと考えています。 全てのページにスケルトンソースがあるので、他のページが未完成でもブラウザ上で容易にテストが可能ですが、今回はセッションを使用しており ShopHtml が無ければカートが発生しません。

Paraselene では、単体テストを行うための paraselene.test パッケージがあり、テスト用の RequestParameter(TestRequestクラス) と HttpSession(TestSessionクラス) を準備しています。 これらを使うと、サーブレットコンテナ無しで動作を再現する事ができます。

内部動作

まず最初に、Paraselene の動作概要です。Paraselene は以下の事を行っています。

スタートアップ

Gateクラスの startup が実行されます。以下のメソッドを実行しています。

  1. PageLoader.init( 5, 2 );
  2. PageType.init();

ページIDの生成と、ページファクトリーにページ生成のためのエントリーを行い、バックグラウンドでページインスタンス生成が開始されます。

クライアントからのリクエスト処理
  1. クライアントからのリクエストパラメータを元に RequestParameter へ値を設定。必要であればセッションの生成。
  2. URL から遷移元・遷移先の特定。
  3. 遷移元ページの reflect メソッドの呼び出し。
    RequestParameter の内容を、ページのフォームへフィードバックするメソッドです。
    テキストボックス等への値の設定の他、ボタンのクリック判定(isClicked で取得できる状態にする)などを行います。
  4. 遷移元ページの input 呼び出し(SuperPage 経由で inputMain が呼ばれます)。
  5. 遷移先ページの output 呼び出し(SuperPage 経由で outputMain が呼ばれます)。

テスト

各ページの動作検証は、inputMain の動作が正しいか?と outputMain の動作が正しいか?の2点です。 内部処理の条件分岐に合わせ、入力データを準備する事になります。

例えば、ShopHtml の初期表示(ブラウザで初めてサイトを開いた状態)は以下のようなコードで再現できます。

UnitTest.java
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
import paraselene.*;
import paraselene.supervisor.*;
import paraselene.test.*;
import test.*;
import test.base.*;
 
public class UnitTest {
    public static void main( String[] argc ) throws Exception {
        Gate.startup();
        Page    page = PageLoader.getPageFactory().getPage( PageType.SHOP_HTML );
        TestRequest req = new TestRequest(
            RequestParameter.Method.GET,    // リクエスト時のメソッド
            null,                           // セッション
            null,                           // クッキー
            null,                           // クライアントのIPアドレス
            null,                           // リクエスト時のURI
            new Gate()
        );
 
        page = page.output( null, req );
        System.out.println( page.toString() );
    }
}

TestRequest の各引数はページの実処理で参照していなければ null で構いません。 これの実行結果(画面エコー)が以下です。 <FORM>の action が正しいURLではありませんが(<A>の href 等も同様の表示になります)、テスト時には気にする必要はありません。

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
<html>
<head>
<meta content="text/css" http-equiv="Content-Style-Type">
<title>商品</title></head>
<body>
<form action="PARASELENE(PAGE)399851037" method="post">
<input name="paraselene$form" value="e" type="hidden">
<table name="list">
<tr>
<td>A4ノート</td>
<td>&nbsp;</td>
<td align="right">189円</td>
<td>&nbsp;</td>
<td>数量
<input name="count" value type="text" size="3"></td>
<td>
<input name="buy" value="カートに入れる" type="submit"></td></tr>
<tr>
<td>ボールペン</td>
<td>&nbsp;</td>
<td align="right">99円</td>
<td>&nbsp;</td>
<td>数量
<input name="count$0" value type="text" size="3"></td>
<td>
<input name="buy$0" value="カートに入れる" type="submit"></td></tr>
<tr>
<td>セロハンテープ</td>
<td>&nbsp;</td>
<td align="right">45円</td>
<td>&nbsp;</td>
<td>数量
<input name="count$1" value type="text" size="3"></td>
<td>
<input name="buy$1" value="カートに入れる" type="submit"></td></tr>
<tr>
<td>A4コピー用紙&nbsp;500枚</td>
<td>&nbsp;</td>
<td align="right">298円</td>
<td>&nbsp;</td>
<td>数量
<input name="count$2" value type="text" size="3"></td>
<td>
<input name="buy$2" value="カートに入れる" type="submit"></td></tr></table></form></body></html>

チュートリアル4(テスト実施)