Excelを使ったDB初期化
テストを実施すると、その結果によってデータが更新される場合があります。そこで、テストを実施する前に毎回データを初期化する必要があります。そのような要件を満たすために、ここでは以下の2つの方法を組み合わせて使用します。
- DbUnit
- DB初期化サーブレット
今回作成したSeleniumTestプロジェクトは、Webアプリケーションとして動作するため、SeleniumTestアプリケーション内にサーブレットを作成することで、Seleniumからopen
コマンドで初期化処理を起動させることが可能になります。
DbUnitの導入
以下の手順でDbUnitを使用する準備を行います。
1. DbUnitのダウンロード
以下のURLにアクセスして、DbUnitをダウンロードします。2006年5月26日時点の最新バージョンは2.1です。
zipファイル、またはtar.gzファイルをダウンロードして解凍すると、「dbunit-2.1.jar」と「docs」フォルダ、「LICENSE.txt」が展開されます。「dbunit-2.1.jar」をSeleniumTestプロジェクトの「WEB-INF/lib/」フォルダにコピーします。
2. POIのダウンロード
DbUnitはExcelファイルを扱うために内部でApache POIを使用しているので、POIもダウンロードします。最新のリリース版であるバージョン2.5.1を使用します。下記URLへアクセスします。
zipファイル、またはtar.gzファイルをダウンロードして解凍すると、「poi-2.5.1-final-20040804.jar」とその他のフォルダ、およびjarファイルが展開されます。「poi-2.5.1-final-20040804.jar」をSeleniumTestプロジェクトの「WEB-INF/lib/」フォルダにコピーします。
3. DBのconnectorをコピー
また、DBに接続するためconnectorも追加しましょう。初期化対象となるDBは、当然テスト対象のWebアプリケーションで用いているDBですから、テスト対象のWebアプリケーションで使用しているconnectorを使用すれば良いでしょう。SeleniumTestの「WEB-INF/lib/」フォルダにコピーします。ここではMySQLを使っているので、「mysqlconnector-java-3.1.12-bin.jar」をコピーしてきました。
4. jarファイルをクラスパスへ追加
eclipseで、追加したjarファイルをSeleniumTestプロジェクトのクラスパスに追加します。
クラスとファイルの作成
今回、新たに以下のクラスおよびファイルを作成します。
フォルダ | ファイル名 | 概要 |
WEB-INF/src/test/util/ | ConnectionManager.java | DB接続用クラス。DB初期化サーブレットで使用する。 |
DbInitServlet.java | DB初期化サーブレット。DbUnitの機能を利用する。 | |
WEB-INF/src/ext/initxls/ | init_xxxx.xls | 初期化するデータを設定したExcelファイル(必要に応じて複数作成)。 |
WEB-INF/ | web.xml | DB初期化サーブレットを登録する。 |
init-ok.html | 初期化正常終了表示用html | |
init-err.html | 初期化エラー表示用html |
eclipseのナビゲータで、以下の手順で作成していきます。
- 「WEB-INF/」配下に、ファイル「web.xml」を作成。
- 「WEB-INF/」配下に、ファイル「init-ok.html」と「init-err.html」を作成。
- 「WEB-INF/src/」配下に、フォルダ「test/util/」と「ext/initxls/」を作成。
- 「WEB-INF/src/test/util/」配下に、クラス
DbInitServlet
とConnectionManager
を作成。 - 「WEB-INF/src/ext/initxls/」配下に、別途作成した初期化データ用Excelファイル(「初期化データ用Excelファイルの作成方法」を参照)を置く。ここでは「init_common.xls」「init_search1.xml」「init_search2.xml」という3ファイルを作成。
ここまで作成したプロジェクトの状態は次のようになります。
初期化データ用Excelファイルの作成方法
初期化データ用のExcelファイルを次のとおり作成します。
- ファイル名は任意
- 1シート=1テーブルに該当(シート名=テーブル名)
- 1行目にカラム名を記述
- 各行に設定したデータを記述
例えば、「ADMIN」「BOOK」「CATEGORY」という3つのテーブルを使用している場合、次のようになります。
DB初期化処理クラスの作成
先ほど作成したクラスに内容を記述していきます。
ConnectionManagerクラス
DBとの接続を行うクラスです。DB初期化サーブレットがDBへ接続する際に利用します。DBのURLやuserの設定などを記述します。ソースコードの内容については「AppendixII:DB初期化処理クラスのソースコード」を参照してください。
…(中略)… /** * DBとのコネクションを管理するクラス */ public class ConnectionManager { /*--- 定数設定 -------------------------------------------------*/ /** URL */ private static final String URL = "jdbc:mysql://localhost:3306/myapp "; /** user */ private static final String USER = "testuser"; /** password */ private static final String PASS = "testpass"; /** driver */ private static final String DRIVER = "com.mysql.jdbc.Driver"; /*--------------------------------------------------------------*/ /** * コネクションを取得 * @return Connection */ public static Connection getConnection() { …(中略)… } /** * コネクションを切断します * @param connection Connection */ public static void disConnect(Connection connection) { …(中略)… } }
DbInitServletクラス
DB初期化を行うサーブレットです。DbUnitの機能を用いて、Excelファイルでのデータ初期化を実施します。初期化用Excelファイルを読み込むフォルダ名の設定などを記述します。初期化に使用するExcelファイルはテストごとに異なるので、サーブレットを起動する際のHTTPリクエストのname
パラメータから読み込みます。また、MySQLのAUTO_INCREMENT
を初期化するため、SQL(ALTER TABLE
文)も実施しています。
ソースコードの内容については「AppendixII:DB 初期化処理クラスのソースコード」を参照してください。
…(中略)… /** * DBを任意のExcelに従って初期化するサーブレット。 * GETパラメータ「name」の値(Excelファイル名)を読み込む。 */ public class DbInitServlet extends HttpServlet { /*----- 定数設定 ---------------------------------------------*/ /** 初期化Excelファイルを置くフォルダ */ private static final String INIT_XLS_DIR = "/ext/initxls/"; /** 初期化成功時に表示する画面のファイル */ private static final String INIT_OK_FILE = "WEB-INF/init-ok.html"; /** 初期化失敗時に表示する画面のファイル */ private static final String INIT_ERR_FILE = "WEB-INF/init-err.html"; /*------------------------------------------------------------*/ …(中略)… public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { // 初期化Excelファイルのパスを設定 String path = INIT_XLS_DIR + request.getParameter("name"); // 初期化メソッドを実行 boolean b = initDb(path); // 初期化成功画面を表示する RequestDispatcher rd = request .getRequestDispatcher(INIT_OK_FILE); rd.forward(request, response); return; } catch (Exception e) { // nameパラメータにExcelファイル名無しなど // 例外発生時はエラー画面を表示する RequestDispatcher rd = request .getRequestDispatcher(INIT_ERR_FILE); rd.forward(request, response); return; } } /** * 初期化メソッド * @param path initExcelFilePath * @return boolean */ private boolean initDb(String path) { …(中略)… } }
その他のファイル作成
web.xml
Webアプリケーションの設定を記述するファイルです。作成したDbInitServlet
をサーブレットとして登録します。
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <display-name>Application for Selenium Test</display-name> <!-- Standard Action Servlet Configuration (with debugging) --> <servlet> <servlet-name>DbInitServlet</servlet-name> <servlet-class>test.util.DbInitServlet</servlet-class> </servlet> <!-- Standard Action Servlet Mapping --> <servlet-mapping> <servlet-name>DbInitServlet</servlet-name> <url-pattern>/dbinitservlet</url-pattern> </servlet-mapping> </web-app>
init-ok.html/init-err.html
初期化が成功した場合、および失敗した場合に表示する画面のhtmlです。内容はシンプルなもので十分です。
<html> <head> <title> init ok </title> </head> <body> init ok </body> </html>
<html> <head> <title> init error </title> </head> <body> init error!!<br> nameパラメータに初期化用Excelファイル名を指定してください。 </body> </html>
初期化サーブレットの使用方法
作成したDB初期化サーブレットDbInitServlet
は2通りの方法で使用することができます。1つはSeleniumからopen
コマンドを使用する方法、もう1つはブラウザからURLを指定して起動する方法です。
Seleniumから呼び出す
Seleniumではopen
コマンドを使ってURLを指定することでDbInitServlet
を呼び出すことができます。テストケースの記述は次のようになります。
<tr> <td>open</td> <td>/SeleniumTest/dbinitservlet?name=init_common.xls</td> <td></td> </tr>
DB初期化サーブレットでは、初期化処理が正常終了した場合は正常終了画面を表示します。そのため、open
コマンドでDB初期化サーブレット起動した後に次のような行を追加することで、初期化処理を実施してから試験項目を実施することができます。
<tr> <td>open</td> <td>/SeleniumTest/dbinitservlet?name=init_common.xls</td> …【1】 <td></td> </tr> <tr> <td>assertTitle</td> <td>init ok</td> …【2】 <td></td> </tr> <tr> <td>open</td> <td>/MyApp/001_login.jsp</td> …【3】 <td></td> </tr> :
name
パラメータに初期化用Excelのファイル名を指定。URLを直接指定する
ブラウザのアドレスバーに、次のようなURLを直接指定することでSeleniumTestアプリケーションのDbInitServlet
を呼び出すことができます。
http://localhost:8080/SeleniumTest/dbinitservlet?name=init_common.xls
Seleniumを使った結合試験以外の場合でも、上記URLを指定することで、該当するExcelファイルを使ってDBの初期化を行うことができます。