概要
テストで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が実行されない