Wicket Tester
Wicket勉強会の懇親会で、ちょっと話題になったWicketTesterについてまとめ。
WicketのTestFrameworkがWicketTester。
パッケージでいうとorg.apache.wicket.util.testerあたりに色々入っている。
基本的な使い方
例えば以下のようなWebPageクラスがあったする.
HomePage.java
public class HomePage extends WebPage { public HomePage() { add(new Label("message", "If you see this message wicket is properly configured and running")); } }
これのテストケースはこんな感じになる.
TestHomePage.java
public class TestHomePage{ private WicketTester tester; @Before public void before() { tester = new WicketTester(new WicketApplication()); } @Test public void testRenderHomePage() { // HomePageをレンダリング tester.startPage(HomePage.class); // HomePageがレンダリングされているか確認 tester.assertRenderedPage(HomePage.class); // messageという名前のLabelコンポーネントのメッセージを確認 tester.assertLabel("message","If you see this message wicket is properly configured and running"); } }
Formのテスト基本
まずシンプルなFormテスト。Formのページがあったとする。
FormPage.java
public class FormPage extends WebPage { private String text; private String password; public FormPage() { Form form = new Form("form", new CompoundPropertyModel(this)) { @Override protected void onSubmit() { setResponsePage(new NextPage(text, password)); } }; add(form); form.add(new TextField("text")); form.add(new PasswordTextField("password")); } }
NextPage.java
public class NextPage extends WebPage { public NextPage(String text, String password) { super(); add(new Label("text", text)); add(new Label("password", password)); } }
テストケースはこんな感じ
TestFormPage.java
public class TestFormPage { private WicketTester tester; @Before public void before() { tester = new WicketTester(new WicketApplication()); } @Test public void testFormPage() { tester.startPage(FormPage.class); tester.assertRenderedPage(FormPage.class); // FormTesterを生成 FormTester formTester = tester.newFormTester("form"); // "text"に値を設定 formTester.setValue("text", "テストテキスト"); // "password"に値を設定 formTester.setValue("password", "テストパスワード"); // submitを実行 formTester.submit(); tester.assertRenderedPage(NextPage.class); tester.assertLabel("text", "テストテキスト"); tester.assertLabel("password", "テストパスワード"); } }
上記のようにFormTesterを利用するとFormのテストが簡単に実施できる。
Formのテスト - バリデーションのテストとか
Formのバリデーションチェックを行うときに使えます。
FormPage.java
public class FormPage extends WebPage { private String text; public FormPage() { add(new FeedbackPanel("feedback")); Form form = new Form("form", new CompoundPropertyModel(this)) { @Override protected void onSubmit() { setResponsePage(NextPage.class); } }; add(form); final TextField textField = new TextField("text"); textField.setRequired(true); textField.add(new PatternValidator("^[0-9]{4}$")); form.add(textField); } }
NextPage.java
public class NextPage extends WebPage {}
TextFormPage.java
public class TestFormPage { private WicketTester tester; @Before public void before() { tester = new WicketTester(new WicketApplication()); } @Test public void testFormPage() { tester.startPage(FormPage.class); tester.assertRenderedPage(FormPage.class); FormTester formTester = tester.newFormTester("form"); formTester.setValue("text", "0000"); formTester.submit(); tester.assertRenderedPage(NextPage.class); } @Test public void testFormTextRequire() { tester.startPage(FormPage.class); FormTester formTester = tester.newFormTester("form"); formTester.submit(); tester.assertErrorMessages(new String[] { "'text' 欄 は必須です。" }); } @Test public void testFormTextPatternValidator() { tester.startPage(FormPage.class); FormTester formTester = tester.newFormTester("form"); formTester.setValue("text", "00000"); formTester.submit(); tester.assertErrorMessages(new String[] { "'00000' はパターン '^[0-9]{4}$' にマッチしません。" }); } }
assertErrorMessagesを使えばバリデーションテストができます。引数に与えるのは、Stringの配列ですので、コンポーネントが複数あって複数のエラーメッセージが同時に出力される場合は
tester.assertErrorMessages(new String[] { "Message1", "Message2", "Message3" });
このように複数のメッセージを格納してあげればOKです。
徐々に書く