sql-maven-pluginプラグインによるテストデータの設定方法メモ

# やりたいこと
実際の開発では複数のテスト環境に対してテスト内容ごとのテストデータを入れ替えてテストするのが一般的である。
テスト環境やテスト内容ごとに用意されたテストデータの入れ替えを簡単に実現するためMavenのsql-maven-pluginを利用したデータ設定方法をまとめる。

# 1. Mavenプロジェクトの作成
テストデータSQLファイルを管理するMavenプロジェクトを作成する。
プロジェクトの構成は下記の通りであり、```src/main/resources/<DBタイプ>/<環境ID>/<テストデータID>/```の構成でSQLファイルを格納する。

```text:プロジェクト構成
project-root/
  ├ src/main/resources/
  │            ├ oracle/　※Oracle向けテストデータ格納フォルダ
  │            │    └ environment01/　※テスト環境01向けのデータ格納フォルダ
  │            │         └testdata01/　※テストデータセット01の格納フォルダ
  │            │             └ 01_O_TESTDATASET01.sql
  │            │
  │            └ postgresql/　※PostgreSQL向けテストデータ格納フォルダ
  │                 └ environment01/      
  │                      └ testdata01/
  │                          └ 01_P_TESTDATASET01.sql
  └ pom.xml
```

※今回の設定ではSQLファイル名の昇順にファイルを読み込み実行するため、実行するテストデータ順に数字2桁のプレフィックスを付与する。

## 1.1. pom.xmlの設定追加
pom.xmlに下記の設定を追加する。

```xml:pom.xml

    <!-- 依存ライブラリ定義 -->
    <dependencies>
        <dependency>
            <groupId>com.oracle.jdbc</groupId>
            <artifactId>ojdbc8</artifactId>
            <version>${ojdbc.version}</version>
        </dependency>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>${postgresql.version}</version>
        </dependency>
    </dependencies>

    <!-- DB接続定義 -->
    <profiles>
        <!-- OracleDB定義 -->
        <profile>
            <id>oracle</id>
            <!-- profile指定されない場合のデフォルトに設定 -->
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <db.encoding>UTF8</db.encoding>
                <db.basedir>${project.basedir}/src/main/resources/oracle/${env}/${data}/</db.basedir>
                <db.url>jdbc:oracle:thin:@${host}/TEST</db.url>
                <db.username>DBユーザ名</db.username>
                <db.password>DBパスワード</db.password>
                <db.driver>oracle.jdbc.driver.OracleDriver</db.driver>
                <db.groupId>com.oracle.jdbc</db.groupId>
                <db.artifactId>ojdbc8</db.artifactId>
                <db.version>${ojdbc.version}</db.version>
                <db.delimiter>;</db.delimiter>
                <db.delimiterType>row</db.delimiterType>
            </properties>
        </profile>

        <!-- PostgreSQL定義 -->
        <profile>
            <id>postgresql</id>
            <properties>
                <db.encoding>UTF8</db.encoding>
                <db.basedir>${project.basedir}/src/main/resources/postgresql/${env}/${data}/</db.basedir>
                <db.url>jdbc:postgresql://${host}/test</db.url>
                <db.username>DBユーザ名</db.username>
                <db.password>DBパスワード</db.password>
                <db.driver>org.postgresql.Driver</db.driver>
                <db.groupId>org.postgresql</db.groupId>
                <db.artifactId>postgresql</db.artifactId>
                <db.version>${postgresql.version}</db.version>
                <db.delimiter>;</db.delimiter>
                <db.delimiterType>row</db.delimiterType>
            </properties>
        </profile>
    </profiles>

    <!-- プラグイン定義 -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>sql-maven-plugin</artifactId>
                <version>1.5</version>
                <dependencies>
                    <dependency>
                        <groupId>${db.groupId}</groupId>
                        <artifactId>${db.artifactId}</artifactId>
                        <version>${db.version}</version>
                    </dependency>
                </dependencies>
                <configuration>
                    <driver>${db.driver}</driver>
                    <url>${db.url}</url>
                    <username>${db.username}</username>
                    <password>${db.password}</password>
                    <encoding>${db.encoding}</encoding>
                    <autocommit>false</autocommit>
                    <delimiter>${db.delimiter}</delimiter>
                    <skip>false</skip>
                    <fileset>
                        <basedir>${db.basedir}</basedir>
                        <includes>
                            <include>0*.sql</include>
                        </includes>
                    </fileset>
                    <!-- SQLファイルの実行順を昇順に指定 -->
                    <orderFile>ascending</orderFile>
                </configuration>
            </plugin>
        </plugins>
    </build>

　　<!-- JDBCドライバのバージョン定義 -->
    <properties>
        <ojdbc.version>12.2.0.1</ojdbc.version>
        <postgresql.version>42.2.5</postgresql.version>
    </properties>
```

**注意事項**

* OJDBCドライバはMavenCentralレポジトリで管理さていないため、個別にダウンロードしローカルレポジトリにmaven installする必要がある。
 
```shell
$ mvn install:install-file -Dfile=<ファイルパス>/ojdbc8.jar -DgroupId=com.oracle.jdbc -DartifactId=ojdbc8 -Dversion=12.2.0.1 -Dpackaging=jar -DgeneratePom=true
```


## 1.2. SQL定義の追加
SQL定義ファイルを作成し、```src/main/resouces/``` 配下の指定されたフォルダに格納する。

```sql:01_O_TESTDATASET01.sql
INSERT INTO TEST_TABLE (ID, TYPE, UPD_TIMESTAMP, UPD_USER_ID, RGS_TIMESTAMP, RGS_USER_ID) VALUES ('A0000001', '1', to_timestamp('2019/06/19 00:00:00', 'YYYY/MM/DD HH24:mi:ss'), 'system', to_timestamp('2019/06/19 00:00:00', 'YYYY/MM/DD HH24:mi:ss'), 'system');
INSERT INTO TEST_TABLE (ID, TYPE, UPD_TIMESTAMP, UPD_USER_ID, RGS_TIMESTAMP, RGS_USER_ID) VALUES ('A0000002', '1', to_timestamp('2019/06/19 00:00:00', 'YYYY/MM/DD HH24:mi:ss'), 'system', to_timestamp('2019/06/19 00:00:00', 'YYYY/MM/DD HH24:mi:ss'), 'system');
```

```sql:01_P_TESTDATASET01.sql
INSERT INTO TEST_TABLE (ID, TYPE, UPD_TIMESTAMP, UPD_USER_ID, RGS_TIMESTAMP, RGS_USER_ID) VALUES ('A0000001', '1', '2019/06/19 00:00:00', 'system', '2019/06/19 00:00:00', 'system');
INSERT INTO TEST_TABLE (ID, TYPE, UPD_TIMESTAMP, UPD_USER_ID, RGS_TIMESTAMP, RGS_USER_ID) VALUES ('A0000002', '1', '2019/06/19 00:00:00', 'system', '2019/06/19 00:00:00', 'system');
```

## 1.3. 動作確認
プロジェクトから正しくSQLを実行できることを確認する。

* DBMSプロファイル：profile設定のIDを指定する。今回の設定では```oracle```または```postgresql```を指定する。
* 環境ID：テスト環境を指定する。プロジェクト構成のフォルダ名```environment01```を指定する。
* テストデータセットID：テスト環境に設定するデータセットを指定する。プロジェクト構成のフォルダ名```testdata01```を指定する。

```shell
$ mvn -e -P <DBMSプロファイル> -Denv=<環境ID> -Ddata=<テストデータセットID> -Dhost=<DBサーバIP:ポート番号> -Djava.security.egd=file:/dev/./urandom sql:execute
```
実行時にエラーが出なければ成功。