SQLファイルに記述されたSQLをテストするGen-SqlFileTestタスク

Seasarカンファレンスでid:jfluteさんにDBFluteのOutsideSqlTestを説明してもらって、とても良い機能だとおもったので、考え方を参考にさせていただきました。

S2JDBC-Genでは、AntのGen-SqlFileTestタスクにより専用のテストクラスを生成し、このテストクラスで実際のテストを行います。

タスクの定義はこんな感じ。これは、エンティティからDDLを生成するAntターゲットに組み込み利用します。

<gen-sqlfiletest
  classpathDir="${build.dir}"
  rootpackagename="example"
  classpathref="classpath"
>
  <sqlfileset dir="${build.dir}">
    <include name="META-INF/sql/**/*.sql" />
  </sqlfileset>
</gen-sqlfiletest>

sqlfilesetは普通のfilesetと同等のデータ型です。sqlfilesetでテストの対象としたファイルを絞り込みます(ストアドとかには対応できないのでストアドのSQLファイルはこの機能で除外してもらう必要があります)。


生成されるテストクラスはこんな感じです(内部クラスは省略しています)。

public class SqlFileTest extends S2TestCase {

    private JdbcManager jdbcManager;

    /**
     * 事前処理をします。
     * 
     * @throws Exception
     */
    @Override
    protected void setUp() throws Exception {
        super.setUp();
        include("s2jdbc.dicon");
    }

    /**
     * SQLファイルをテストします。
     * 
     * @throws Exception
     */
    public void testSqlFile0Tx() throws Exception {
        String path = "META-INF/sql/Address/getStreet.sql";
        new SqlFile(path).execute();
    }

    /**
     * SQLファイルをテストします。
     * 
     * @throws Exception
     */
    public void testSqlFile1Tx() throws Exception {
        String path = "META-INF/sql/Employee/updateEmployeeName.sql";
        new SqlFile(path).execute();
    }

    /**
     * SQLファイルを表すクラスです。
     * 
     * @author S2JDBC-Gen
     */
    public class SqlFile {
        ...
    }
}

testSqlFileで始まるメソッドがファイルの数だけ作られます。このメソッドでは、SQLを実行しエラーが発生しなければテストが成功します。検索系も更新系もTxをつけてトランザクションロールバックするので、データは変更されません。

これで、エンティティの修正によるデータベースのリファクタリングがより安全になります(修正漏れがなくなる)。また、テストを実行すればDBスキーマに存在しないカラム等を参照しているSQLがすぐにわかるので、修正が手早くできるようになります。

Gen-SqlFileTestタスクは次のバージョンに含める予定です。