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タスクは次のバージョンに含める予定です。