連載
» 2009年07月10日 00時00分 公開

Webアプリの常識をJSPとStrutsで身につける(10):JUnitとEclipseを使って学ぶ、“テスト”の常識 (2/4)

[中粼直樹,株式会社メセナ・ネットコム]

Javaの定番テストフレームワーク「JUnit」の4つの特徴

 JUnitとは、Javaの単体テストを自動的に実行するためのオープンソースのフレームワークです。繰り返しテストが実行できるように設計されています。JUnitには、次のような4つの特徴があります。

【1】実装方法

 テストクラスにテスト用のメソッドを実装して利用します。テスト対象とテストプログラムを分離できるため、テスト対象への影響がなくなります。

【2】テストプログラム管理

 複数のテストプログラムをまとめることができ、まとめたテストを一度にテストすることもできます。再作成にかかる手間を軽減し、テスト工程を効率的に消化できます。

【3】テストの評価と結果

 テストの結果が瞬時に表示されるため、テストを評価する負荷がなくなります。

【4】IDE(統合開発環境)との連携

 JUnit単体でも利用可能ですが、EclipseなどのIDEと連携することもできます。それによって、テストコードの作成を高速化させることもできます。最近のEclipseでは、JUnitが同梱して提供されています。

JUnit 3とStruts Testcaseを使った単体テスト

 実際に、サンプルアプリケーションのソースコードを用意して、JUnitでテストしてみましょう。Eclipseに同梱されているJUnit 3を使います。今回も連載第2回「Strutsの常識を知り、EclipseとTomcatの環境構築」と同様に、「PKG」ワークスペースを使用します。

「Struts Testcase」を組み込む

 まず、「PKG」に「Struts Testcase」を組み込みます。Struts TestcaseはJUnitを拡張して、Struts上でテストができるフレームワークです。

 「Struts Testcase for JUnit」へアクセスして、「strutstest214-1.2_2.2.zip」をダウンロードします。「strutstest214-1.2_2.2.zip」を解凍して、「strutstest」フォルダのstrutstest-2.1.4.jarを「PKG/WEB-INF/lib」配下にコピーして、準備完了です。

テストするソースコードなどの準備

 次に、「/PKG/pages」配下に下記の.jspファイルを用意してください。

JUnit_Input.jsp
<%@ page contentType="text/html; charset=Shift-JIS" %>
<%@ taglib uri="http://struts.apache.org/tags-html" 
  prefix="html" %>
<html:html>
  <head>
    <title>JUnitテスト用入力画面</title>
  </head> 
  <html:form action="/JUnit">
    <table border="0">
      <html:errors/>
      <tr><td>
                   <h2>JUnitテスト用入力</h2>
                      あなたの誕生日を8桁の数字で入力してください。</br>
                      生年月日:<html:text property="seireki_ymd" size="15" maxlength="8" />
      </td></tr>
      <tr><td>
        <p><html:submit value="OK" /></p>
      </td></tr>
    </table>
  </html:form>
</html:html>
JUnit_Result.jsp
<%@ page contentType="text/html; charset=MS932" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>
<html:html>
<head>
<title>JUnitテスト用結果画面</title>
</head>
<html:form action="/JUnit">
<table>
        <tr><td>
            <h2>JUnitテスト用結果</h2>
                あなたの誕生日は、<br>
                <bean:write name="JUnitForm" property="wareki_ymd" />なんですね!<br>
                <logic:equal name="JUnitForm" property="todayflg" value="1">
                <h2>おめでとうございます。</h2>
                </logic:equal>
                <logic:notEqual name="JUnitForm" property="todayflg" value="1">
                <h2>誕生日にはお祝いのお言葉を送ります。</h2>
                </logic:notEqual>
 
        </td></tr>
</table>
</html:form>
</html:html>

 次に、「/PKG/WEB-INF/src」配下に下記の.javaファイルを作成します。

JUnitForm.java
package junit.form;
 
import org.apache.struts.action.ActionForm;
 
/**
 * JUnitForm.java
 */
public class JUnitForm extends ActionForm {
 
    private String seireki_ymd;
    private String wareki_ymd;
    private int todayflg = 0;
    
    /**
     * 
     * @return seireki_ymd
     */
    public String getSeireki_ymd() {return seireki_ymd;}
    /**
     * @param seireki_ymd
     */
    public void setSeireki_ymd(String seireki_ymd) {this.seireki_ymd = seireki_ymd;}
    /**
     * @return wareki_ymd
     */
    public String getWareki_ymd() {return wareki_ymd;}
    /**
     * @param wareki_ymd
     */
    public void setWareki_ymd(String wareki_ymd) {this.wareki_ymd = wareki_ymd;}
    /**
     * @return todayflg
     */
    public int getTodayflg() {return todayflg;}
    /**
     * @param todayflg
     */
    public void setTodayflg(int todayflg) {this.todayflg = todayflg;}
}
JUnitAction.java
package junit;
 
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
 
import junit.form.JUnitForm;
 
import org.apache.struts.action.*;
 
/**
 * JUnitAction.java
 */
public class JUnitAction extends Action {
 
    public ActionForward execute(
            ActionMapping mapping,
            ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response)
            throws Exception {
        
        HttpSession session = request.getSession(true);     
        JUnitForm junitForm = (JUnitForm) form;
        
        // 西暦8けた取得
        String s_ymd = junitForm.getSeireki_ymd();        
        // 西暦 → 和暦変換
        junitForm.setWareki_ymd(getDateStoW(s_ymd));
        // 現在日を取得
        String today =getToday();
        // 現在日が誕生日であるとき
        if(today.substring(5).equals(junitForm.getWareki_ymd().substring(5))){
            junitForm.setTodayflg(1);
        }else{
            junitForm.setTodayflg(0);    
        }
        
        session.setAttribute("JunitForm", junitForm);
        return mapping.findForward("success");
    }
 
    /**
     * 西暦 → 和暦変換処理
     * @param String
     * @return ymd
     */
    public static String getDateStoW(String s_ymd){
        
        // 起点日の文字列を数値に変換する
        int year = Integer.parseInt(s_ymd.substring(0,4));
        // 年号取得処理
        String s_year = Nengo(year,s_ymd);
        // 年月日の結合
        String w_year = s_year + "年" + s_ymd.substring(4,6) + "月" + s_ymd.substring(6) + "日";
        
        return w_year;
    }
    /**
     * 現在日取得
     * @return w_year
     */
    public static String getToday(){
        
        //サーバの日付け取得
        Date sysDate = Calendar.getInstance().getTime();
        
        //年号比較用の日付けフォーマット処理
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy");
        int i_year = Integer.parseInt(formatter.format(sysDate));
        
        // 結合用の日付けフォーマット処理
        String year = new SimpleDateFormat("yyyy").format(sysDate);
        String month = new SimpleDateFormat("MM").format(sysDate);
        String day = new SimpleDateFormat("dd").format(sysDate);
        
        // 年号取得処理
        year = Nengo(i_year,year+month+day);
        
        // 年月日の結合
        String ymd = year +"年" + month + "月" + day + "日";
 
        return ymd;
    }
    
    /**
     * 年号取得処理
     * @param int
     * @return year
     */
    public static String Nengo(int i_year , String ymd){        
        String year ="";
        
        // 年号の振り分け
        if(Integer.parseInt(ymd) > 19120729 && Integer.parseInt(ymd) < 19261225){
            year = "大正" + String.valueOf(i_year - 1911);
        }else if(Integer.parseInt(ymd) > 19261224  && Integer.parseInt(ymd) < 19890108){
            year = "昭和" + String.valueOf(i_year - 1925);
        }else if(Integer.parseInt(ymd) > 19890107){
            year = "平成" + String.valueOf(i_year - 1988);     
        }      
        return year;
    }
}

 最後に「/PKG/WEB-INF」配下のstruts-config.xmlファイルを編集します。

struts-config.xml
<?xml version="1.0" encoding="Shift_JIS" ?>
<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
          "http://struts.apache.org/dtds/struts-config_1_3.dtd">
<struts-config>
<!-- ================================================ Form Bean Definitions -->
    <form-beans>
        <form-bean name="HelloForm" type="hello.form.HelloForm" />
<!-- ここから追加 -->
        <form-bean name="JUnitForm" type="junit.form.JUnitForm" />
<!-- ここまで追加 -->
    </form-beans>
<!-- ========================================= Global Exception Definitions -->
    <global-exceptions>
    </global-exceptions>
<!-- =========================================== Global Forward Definitions -->
    <global-forwards>
    </global-forwards>
<!-- =========================================== Action Mapping Definitions -->
    <action-mappings>
        <action
      attribute="HelloForm"
      input="/pages/Who.jsp"
      name="HelloForm"
            path="/hello"
            type="hello.HelloAction"
            scope="session"
            validate="true">
            <forward name="success" path="/pages/Hello.jsp" />
        </action>
<!-- ここから追加 -->
        <action
            attribute="JUnitForm"
            input="/pages/JUnit_Input.jsp"
            name="JUnitForm"
            path="/JUnit"
            type="junit.JUnitAction"
            scope="session"
            validate="true">
            <forward name="success" path="/pages/JUnit_Result.jsp" />
        </action>
<!-- ここまで追加 -->
    </action-mappings>
  <!-- ====================================== Message Resources Definitions -->
  <!-- ============================================= Plug Ins Configuration -->
  <!-- ======================================================= Tiles plugin -->
  <!-- =================================================== Validator plugin -->
</struts-config>

 これで、テストをする準備は完了です。次ページからは、JUnitAction.javaのJUnitのテストクラスを、Eclipseを使用して作成していきます。JUnitのテストメソッドも16個紹介します。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。