StrutsTestCase for JUnit is an extension of the standard JUnit TestCase class that provides facilities for testing code based on the Struts framework. StrutsTestCase provides both a Mock Object approach and a Cactus approach to actually run the Struts ActionServlet, allowing you to test your Struts code with or without a running servlet engine. Because StrutsTestCase uses the ActionServlet controller to test your code, you can test not only the implementation of your Action objects, but also your mappings, form beans, and forwards declarations. And because StrutsTestCase already provides validation methods, it's quick and easy to write unit test cases.
StrutsTestCase for JUnit は標準のJUnit TestCaseクラスの拡張であり、 Strutsフレームワークベースでの便利なテスト用コードを提供します。 StrutsTestCaseは、擬似オブジェクト(Mock Object)アプローチと Cactus アプローチ の両方を、 実際に実行するStruts ActionServletに提供します。 なぜらなら、StrutsTestCaseはActionServletコントローラを使って、コードをテストします。 Actionオブジェクトだけでなく、マッピング、フォームビーンズとフォワードの定義もテストできます。 そして、StrutsTestCaseは、既に確認用メソッドを提供しています。それは、ユニットテストケースにおいて、 クイックで簡単です。
StrutsTestCaseは、Java Servlet2.2とServlet2.3仕様に従っており、Struts1.1とStruts1.0.2、そしてCactus1.2をサポートしています。
StrutsTestCase for JUnit はSourceForgeにあります。 最新のStrutsTestCaseのリリースは ここで見つける事ができます。 StrutsTestCaseのクラスの全てのJavadocは、ここで、見つける事ができます. また、よくある質問への答えのリストがあります。
サーバサイドのクラスをテストする2つの有名なアプローチがあります。 擬似オブジェクトは、サーバコンテナをシミュレートしてクラスをテストします。 そして、コンテナ内テストは、実際のサーバコンテナを実行してクラスをテストします。 StrutsTestCase for JUnitは、実際のユニットテストコードに最小の影響で、 いずれかのアプローチを提供します。 実際には、StrutsTestCaseセットアップおよびバリデーションメソッドは、両方のアプローチに対して、 正確に同じであるので、1つのアプローチを単に選べば、もう一方のアプローチへは、 その基底クラスを換えることで行えます。
StrutsTestCase for JUnit provides two base classes, both of which are extensions of the standard JUnit TestCase. MockStrutsTestCase uses a set of HttpServlet mock objects to simulate the container environment without requiring a running servlet engine. CactusStrutsTestCase uses the Cactus testing framework to test Struts classes in the actual server container, allowing for a testing environment more in line with the actual deployment environment.StrutsTestCase for JUnitは、2つのベースクラスを提供します。それぞれは、JUnit TestCaseの標準拡張です。 MockStrutsTestCase は、サーブレットエンジンの実行を必要としない、コンテナ環境をシミュレートする HttpServlet擬似オブジェクトのセットを使います。 CactusStrutsTestCase は実際のデプロイ環境に従って、より多くのテスト環境を考慮し、 実際のサーバコンテナ内のStrutsのクラスをテストするために、 Cactus テスティングフレームワーク を使います。
Please note that while the following examples use the MockStrutsTestCase approach, you could choose to use the Cactus approach by simply subclassing from CactusStrutsTestCase without changing another line of code!注意下記の例は、MockStrutsTestCaseアプローチを使っています、 単にサブクラスをCactusStrutsCaseにする事で、他の行を変える事なく、Cactusアプローチを選択出来ます。
注意ここで例示されるよりもさらに多くのメソッドがStrutsTestCaseライブラリにはあります。
-- あなたがStrutsTestCaseで出来る完全な描写であるjavadocsをチェックしてください!
有名なクックブックアプローチを使って、下記のコードの抜粋を検討してみましょう。
public class LoginAction extends Action {
public ActionForward perform(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
{
String username = ((LoginForm) form).getUsername();
String password = ((LoginForm) form).getPassword();
ActionErrors errors = new ActionErrors();
if ((!username.equals("deryl")) || (!password.equals("radar")))
errors.add("password",new ActionError("error.password.mismatch"));
if (!errors.empty()) {
saveErrors(request,errors);
return mapping.findForward("login");
}
// store authentication info on the session
HttpSession session = request.getSession();
session.setAttribute("authentication", username);
// Forward control to the specified success URI
return mapping.findForward("success");
}
|
そうすると、ここで、何を行っていますか? さて、私達は、ログイン情報を含んでいるはずのActionFormビーンを受け取ります。 はじめに、ユーザ名とパスワードの情報の入手を試みます。 そして、それが正しいかチェックします。 もし、それらユーザ名とパスワードの値がミスマッチなら、 メッセージカタログのキーをもったActionErrorメッセージを何処かに生成します。 そして、再びログインできるように、ログインスクリーンに遷移します。 もし、ユーザ名とパスワードがマッチしたら、 その時は、セッションに認証情報を格納します。そして、次のページに遷移します。
ここでいくつかの事がテスト出来ます。
LoginFormビーンは適切に動作していますか?リクエストに適切なパラメータを配置すれば、このビーンは正確に検証できますか?
もし、ユーザ名または、パスワードがマッチしなかったら、 適切なエラーが次のページに表示されますか? ログオンページにもどりますか?
正確なログイン情報を提供すれば、正確なページにたどり着けますか? エラーが報告されていないと確信できますか? 適切な認証情報がセッションに保存されていますか?
StrutsTestCaseは、よく知られているJUnitフレームワーク内のこれらの条件を全てテストする機能を提供します。 Strutsセットアップは、実際にどれが ActionServletの開始になるのかを、全て行ってくれます。
そうすると、実際には、どのようにそれを実現するのでしょう? ベースとなるStrutsTestCaseクラスから拡張した、空のテストケースの作成よりスタートしましょう:
public class TestLoginAction extends MockStrutsTestCase {
public void setUp() { super.setUp(); }
public void tearDown() { super.tearDown(); }
public TestLoginAction(String testName) { super(testName); }
public void testSuccessfulLogin() {}
}
|
setUp() method,
youmust explicitly call super.setUp().
This method performs some important initialization routines, and StrutsTestCase will not work if it is not called.
注意:もし、setUp()メソッドをオーバーライドする選択をしたなら、
super.setUp()を明示的に呼ばなければなりません。
このメソッドは、いくつかの重要な初期化ルーチンを事項します。
そして、もしそれが呼ばれない場合、StrutsTestCaseは動作しません。
最初に行う必要があることは、このテストで、どのマッピングを使用するべきであるかStrutsに伝える事です。 そうするために、Strutsマッピングに関係しているパスを指定します。これは、Strutsタグライブラリが使用する方法と同じメカニズムです。
public class TestLoginAction extends MockStrutsTestCase {
public TestLoginAction(String testName) { super(testName); }
public void testSuccessfulLogin() {
setRequestPathInfo("/login");
}
}
|
次は、再びStrutsに、リクエストオブジェクトを経由して、Beanプロパティを渡す必要があります
public class TestLoginAction extends MockStrutsTestCase {
public TestLoginAction(String testName) { super(testName); }
public void testSuccessfulLogin() {
setRequestPathInfo("/login");
addRequestParameter("username","deryl");
addRequestParameter("password","radar");
}
}
|
最後に、アクションを実行させる必要があります。それは、actionPerformメソッドを実行させる事を含みます。
WEB-INF/struts-config.xml,
so you must place the directory that contains WEB-INF in your CLASSPATH.
If you would like to use an alternate configuration file,
please see the setConfigFile() method for details on how this file is located.
注意標準では、Struts ActionServletは、WEB-INF/struts-conifg.xmlを探すでしょう。
したがって、クラスパスに contains WEB-INFディレクトリを置かなくてはなりません。
もし、代わりのコンフィグレイションファイルを使用したい場合、
このファイルがどのように探し出されるかの詳細に関しては、
setConfigFile()
を見てください。
public class TestLoginAction extends MockStrutsTestCase {
public TestLoginAction(String testName) { super(testName); }
public void testSuccessfulLogin() {
setRequestPathInfo("/login");
addRequestParameter("username","deryl");
addRequestParameter("password","radar");
actionPerform();
}
}
|
それは、ActionServletにリクエストを処理させるためにしなければならない、全てです。そして、全てがうまくいく場合、何もおこりません。 しかし、まだ終わっていはいません。 期待した、全ての場合が起こったことを確認する必要があります。 はじめに、正しいページに行き着いたことを確かめたいなら・・・
public class TestLoginAction extends MockStrutsTestCase {
public TestLoginAction(String testName) { super(testName); }
public void testSuccessfulLogin() {
setRequestPathInfo("/login");
addRequestParameter("username","deryl");
addRequestParameter("password","radar");
actionPerform();
verifyForward("success");
}
}
|
それは、どのページで終了したかを確認する場合に、Strutsフォワードマッピングを使えることに注目してください。 ファイル名をハードコードしなくてもよいのです。StrutsTestCaseフレームワークがこれを行ってくれます。 したがって、もし“success”のポイントが変化しても、テストはまだ、正確に働くでしょう。Strutsの精神の全てです。
次に、認証情報が適切に格納されたかを確かめたいなら・・
public class TestLoginAction extends MockStrutsTestCase {
public TestLoginAction(String testName) { super(testName); }
public void testSuccessfulLogin() {
setRequestPathInfo("/login");
addRequestParameter("username","deryl");
addRequestParameter("password","radar");
actionPerform();
verifyForward("success");
assertEquals("deryl",(String) getSession().getAttribute("authentication"));
}
}
|
ここで、リクエストからセッションオブジェクトを得ており、 それが適切な属性と値をもっているかどうかチェックします。 セッション内から、あなたのアクションオブジェクトは、 オブジェクトを簡単に見つけられます。
最後に、ActionErrorメッセージがともに送られなかったことを確かめたいなら・・・
この条件では、組み込み機能を使う事ができます。
public class TestLoginAction extends MockStrutsTestCase {
public TestLoginAction(String testName) { super(testName); }
public void testSuccessfulLogin() {
setRequestPathInfo("/login");
addRequestParameter("username","deryl");
addRequestParameter("password","radar");
actionPerform();
verifyForward("success");
assertEquals("deryl",(String) getSession().getAttribute("authentication"));
verifyNoActionErrors();
}
}
|
以上で、1つのテストケースを書いたので、別のものを書くことは簡単です。 例えば、ユーザが正しくないログイン情報を提供する場合をテストしたいと思うでしょう。 そのときは、下記のようなテストケースを書けば良いでしょう。
public void testFailedLogin() {
addRequestParameter("username","deryl");
addRequestParameter("password","express");
setRequestPathInfo("/login");
actionPerform();
verifyForward("login");
verifyActionErrors(new String[] {"error.password.mismatch"});
assertNull((String) getSession().getAttribute("authentication"));
}
|
さて、これは正しくない情報を渡している以外は、 私たちの最初のテストケースによく似ているように見えます. また、異なるフォワードが使われたか、すなわち、 ログインページに戻ったか、そして、認証情報がセッションにないことを、確認しています.
verifyActionErrors() method takes a String array, we can verify more than
one error message, and StrutsTestCase will make sure there is an exact match.
If the test
produced more error messages than we were expecting, it will fail; if it produced fewer, it
will also fail. Only an exact match in name and number will pass.
正しいエラーメッセージが送られたことも確認しています. 私たちが実際のテキストではなく記号の名前を使用したことに注意してください. verifyActionErrors()メソッドがストリングの配列をとるので、 私たちは1つを越えるエラー・メッセージを確認することができます. また、StrutsTestCaseは、正確な適合があることを確かめるでしょう.
それは簡単に見ることができます。StrutsTestCaseは、アクションオブジェクトのテストだけでなく、
マッピングの実行、引数が渡されたActionFormBean、エラーメッセージ、
実行結果によるフォワード文もテストできます。
これで、完璧です!