テスト用のDBをdockerで立てるGradleタスクを作る #Gradle

概要

テストで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 で実行できるタスクを用意している。

タスクの中で行われるのは下記。

  1. dockerでPostgreSQLのDBコンテナを起動
  2. testを実行
  3. コンテナを停止

補足

  • Execを使うとコマンド実行できる
  • dockerは --rm を付けることで、停止時にコンテナを破棄する
  • dependsOnでDBの構築とテストのタスクを束ねる
  • mustRunAfterで依存タスクの順序を制御する
  • finalizedByでコンテナを停止する

その他

  • doLastがないと、タスクの終了を待ってくれないようだ
  • testでコケるとfinalizedByが実行されない

参考