概要
テストでDBを別立てするような場合に、CI上ではCI環境側で提供するデータベースを利用するが、ローカル開発時のテストDBの用意がめんどくさい。
なので、コンテナDBをテスト時に立ち上げるタスクを作ってみる。
build.gradle
task setupTestDatabase(type: Exec) { commandLine 'docker' args = [ 'run', '--rm', '--name', 'continer_name', '-e', 'POSTGRES_USER=user_name', '-e', 'POSTGRES_PASSWORD=user_password', '-e', 'POSTGRES_DB=db_name', '-p', '5432:5432', '-d', 'postgres:10' ] doLast { logger.info 'database started.' } } task cleanupTestDatabase(type: Exec) { commandLine 'docker' args = ['stop', 'continer_name'] doLast { logger.info 'database stopped.' } } task localTest(dependsOn: [setupTestDatabase, test]){ doLast { println 'test completed.' } } test.mustRunAfter setupTestDatabase localTest.finalizedBy cleanupTestDatabase
解説
./gradlew localTest
で実行できるタスクを用意している。
タスクの中で行われるのは下記。
- dockerでPostgreSQLのDBコンテナを起動
- testを実行
- コンテナを停止
補足
- Execを使うとコマンド実行できる
- dockerは
--rm
を付けることで、停止時にコンテナを破棄する - dependsOnでDBの構築とテストのタスクを束ねる
- mustRunAfterで依存タスクの順序を制御する
- finalizedByでコンテナを停止する
その他
- doLastがないと、タスクの終了を待ってくれないようだ
- testでコケるとfinalizedByが実行されない