htmlunitを使ってS2JSF Exampleをテストする。

 htmlunitの存在を知ってから、ぜひ使ってみたいと思っていたので、試してみました。
 直感的にテストが書けて非常に良いですね。ちなみに以前にJameleonを使おうとして、S2JSFが出力するHTMLの日本語がコード化されるために面倒なことになり、断念した過去があるのですが(^^;、htmlunitなら大丈夫でした。
 ちなみに、テストし易いようにS2JSF Exampleのhtmlにidを明確に記述したり、日本語を試すためにページ内に「足し算」と表示するなど、一部変更しています。

事前準備

  1. htmlunit-1.8.zipをDLし、jarをS2JSF Exampleに追加する。
  2. text.html.HtmlTestクラスをeclipseのウィザード使って新規作成する(JUnitのテストケース)。

 ソースは次のようになります。情報があまりないので、javadocを参考にあれこれ書いてみました。

メニュー画面からAddまでの遷移テスト

 public void testAddPage() throws Exception {
   final WebClient webClient = new WebClient();
   final URL url = new URL("http://localhost:8080/s2jsf-example/");
   final HtmlPage hogePage = (HtmlPage)webClient.getPage(url);
   assertEquals( "Home", hogePage.getTitleText() );
   
   final HtmlAnchor anchor = (HtmlAnchor)hogePage.getHtmlElementById("menu:Add");
   final HtmlPage addPage = (HtmlPage)anchor.click();   
   assertEquals( "Add", addPage.getTitleText() );
   
   String pageText = addPage.asText();
   assertTrue(pageText.contains("足し算"));   
 }

Addの正常系テスト

 public void testAddNormalPage() throws Exception {
   final WebClient webClient = new WebClient();
   final URL url = new URL("http://localhost:8080/s2jsf-example/add/add.html");
   final HtmlPage addPage = (HtmlPage)webClient.getPage(url);
   assertEquals( "Add", addPage.getTitleText() );
   
   String pageText = addPage.asText();
   assertTrue(pageText.contains("足し算"));
   
   final HtmlForm form = addPage.getFormByName("add");
   final HtmlSubmitInput button 
    = (HtmlSubmitInput)form.getInputByName("add:calculate");

   final HtmlTextInput textFieldArg1
    = (HtmlTextInput)form.getInputByName("add:arg1");

   textFieldArg1.setValueAttribute("1");

   final HtmlTextInput textFieldArg2 
    = (HtmlTextInput)form.getInputByName("add:arg2");

   textFieldArg2.setValueAttribute("2");

   final HtmlPage addResultPage = (HtmlPage)button.click();
   
   String page2Text = addResultPage.asText();

   assertTrue(page2Text.contains("1 + 2 = 3"));   
 }

Addの異常系テスト

 public void testAddErrorPage() throws Exception {
   final WebClient webClient = new WebClient();
   final URL url = new URL("http://localhost:8080/s2jsf-example/add/add.html");
   final HtmlPage addPage = (HtmlPage)webClient.getPage(url);
   assertEquals( "Add", addPage.getTitleText() );
   
   String pageText = addPage.asText();
   assertTrue(pageText.contains("足し算"));
   
   final HtmlForm form = addPage.getFormByName("add");
   final HtmlSubmitInput button 
    = (HtmlSubmitInput)form.getInputByName("add:calculate");

   final HtmlTextInput textFieldArg1
    = (HtmlTextInput)form.getInputByName("add:arg1");

   textFieldArg1.setValueAttribute("1");

   final HtmlTextInput textFieldArg2 
    = (HtmlTextInput)form.getInputByName("add:arg2");

   textFieldArg2.setValueAttribute("a");

   final HtmlPage addResultPage = (HtmlPage)button.click();

   String page2Text = addResultPage.asText();
   assertTrue(page2Text.contains("変換エラー"));   
 }