S2Unitをそろそろ

SQL*PLUSやObject Browser片手に単体テストするのも、面倒くさいってレベルじゃねえぞ、って感じなのでそろそろS2Unitを使ってみようと思う。何からはじめたらいいかわからないけど、ドキュメントを軽く見たらデータベースの内容をExcelに簡単に出力できるらしいのでまずこれから。

  • 環境の準備
    1. Eclipseで適当なJavaプロジェクト作成。
    2. 最新のSeasar(Seasar2.4.9)ダウンロードし、libフォルダ以下をプロジェクトルートにコピーしビルドパスを通す。
  • diconファイルの準備 

    最低限、必要なdiconファイルは3つ

    • app.dicon (名前は任意)
    • jdbc.dicon
    • convention.dicon

    それぞれの簡単な説明

    • app.dicon (名前は任意)
      • アプリケーションのルートdicon。ここに出力するExcelのファイル名や、データ取得定義を書いた。後で詳しく。
    • jdbc.dicon
      • データベースへの接続定義を書く。詳細は割愛。
    • convention.dicon
      • SMART deployの時のみ必要かと思ってたが、ないとエラーになった。ただ、ほぼ何も書かなくても動いた。↓(なくても動いてほしいけど。)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" 
	"http://www.seasar.org/dtd/components24.dtd">
<components>
</components>
  • Javaクラスの準備

ドキュメントに書いてる内容を、ほぼそのままコピー。ファイル名やクラス名を変えただけ。

//パッケージやimportの定義は省く
public class Excel {
	private static final String PATH = "app.dicon";
	public static void main(String[] args) {
		S2Container container = S2ContainerFactory.create(PATH);
		container.init();
		try {
			SqlReader reader = (SqlReader) container.getComponent(SqlReader.class);
			XlsWriter writer = (XlsWriter) container.getComponent(XlsWriter.class);
			writer.write(reader.read());
		} finally {
			container.destroy();
		}
	}
}
  • 実行

作成したJavaのクラスを実行するだけで、データベースの内容がExcelに出力された。これはすごい。めちゃくちゃ楽。
後は、app.diconの内容を適当に修正するだけで色々なExcelファイルが作成できる。

  • app.diconの内容

とりあえず、最小構成はこんな感じかな。

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN"
"http://www.seasar.org/dtd/components.dtd">
<components>
    <include path="jdbc.dicon"/>

    <component class="org.seasar.extension.dataset.impl.SqlReader">
        <initMethod>#self.addTable("TEST_MASTER")</initMethod>
    </component>
    <component class="org.seasar.extension.dataset.impl.XlsWriter"
        instance="prototype">
        <arg>"../src/test.xls"</arg>
    </component>

</components>

この部分がデータの取得とExcelへの出力内容を定義する場所。この定義だと「TEST」の全データがExcelに出力される。シート名は「TEST」になる。

    <component class="org.seasar.extension.dataset.impl.SqlReader">
        <initMethod>#self.addTable("TEST")</initMethod>
    </component>

もちろん条件を指定することも可能。2番目の引数に条件句を定義。これだと「TESTテーブルのTEST_NO=0」のデータがExcel出力される。

    <component class="org.seasar.extension.dataset.impl.SqlReader">
        <initMethod>#self.addTable("TEST","TEST_NO=0")</initMethod>
    </component>

SQLも直接書ける。2番目の引数が出力されるExcelのシート名。

    <component class="org.seasar.extension.dataset.impl.SqlReader">
       <initMethod>
	   #self.addSql("SELECT TEST_NO FROM TEST","TEST_SQL")
        </initMethod>
    </component>

複数のテーブルも一度に定義できる。これが便利。出力は別々のシートに出力される。

    <component class="org.seasar.extension.dataset.impl.SqlReader">
    <initMethod>#self.addTable("TEST1")</initMethod>
       <initMethod>#self.addTable("TEST2","TEST_NO=0")</initMethod>
       <initMethod>#self.addSql("SELECT TEST_NO FROM TEST","TEST3")</initMethod>
    </component>

最後にexcel出力場所の定義を一応説明。既にファイルが存在する場合は上書きされるようです。ここはあんまり深く見てません。。

   <component class="org.seasar.extension.dataset.impl.XlsWriter" instance="prototype">
        <arg>"../src/test.xls"</arg>
    </component>

今日は以上。まだ自動テストにはいってないけど、これだけでも意外と便利だった。