JUnitとEclipseを使って学ぶ、“テスト”の常識:Webアプリの常識をJSPとStrutsで身につける(10)(2/4 ページ)
本連載は、JSP/サーブレット+StrutsのWebアプリケーション開発を通じて、Java言語以外(PHPやASP.NET、Ruby on Railsなど)の開発にも通用するWebアプリケーション全般の広い知識・常識を身に付けるための連載です
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ファイルを用意してください。
<%@ 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>
<%@ 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ファイルを作成します。
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;} }
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ファイルを編集します。
<?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.