Как настроить тестконтейнеры для запуска докера с помощью gradle?

Для моего проекта мне нужно иметь задачу, которая запускает тестовый контейнер, но когда я пытаюсь запустить свою задачу, у меня возникает следующая ошибка

Previous attempts to find a Docker environment failed. Will not retry. Please see logs and check configuration

Я думаю, что это проблема конфигурации.

Я использую kotlin gradle, мой файл сборки выглядит так:

import org.testcontainers.containers.PostgreSQLContainer

repositories {
    mavenCentral()
    mavenLocal()
}

dependencies {
    testImplementation("org.testcontainers:postgresql")
}

buildscript {
    repositories {
        mavenCentral()
        mavenLocal()
    }
    dependencies {
        "classpath"("org.testcontainers:postgresql:1.17.5")
    }
}

tasks.register("postgresContainer") {
    val containerInstance = PostgreSQLContainer<Nothing>("postgres:12.8")
        .apply {
            withDatabaseName("test")
        }
    containerInstance.start()
    extra["containerUrl"] = containerInstance.jdbcUrl
    extra["containerUsername"] = containerInstance.username
    extra["containerPassword"] = containerInstance.password
    extra["containerDatabaseName"] = containerInstance.databaseName
    extra["containerInstance"] = containerInstance
}

Я пропустил большую часть этого, но не могу найти то, что мне не хватает

Я пытался обратиться к документации тестовых контейнеров, но не могу найти свой конкретный случай, докер вроде правильно настроен, думаю ошибка исходит от моего build.kts

Почему вам нужно запускать контейнеры как задачу Gradle, а не как часть тестов?

Kevin Wittek 21.11.2022 11:02
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
0
1
236
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я бы предложил следующее.

Добавьте это в свой файл build.gradle.kts, чтобы добавить поддержку тестовых контейнеров (этот конкретный пример для PostgreSQL, но идея та же...):

dependencies {
    testImplementation("org.testcontainers:junit-jupiter")
    testImplementation("org.testcontainers:postgresql:$testContainerVersion")
}

dependencyManagement {
    imports {
        mavenBom("org.testcontainers:testcontainers-bom:$testContainerVersion")
    }
}

Добавьте следующее в свой класс тестов в качестве глобальной переменной:

val postgreSQLContainer = PostgreSQLContainer<Nothing>("postgres:14")
    .apply {
        withReuse(true)
        start()
    }

Лично я добавил это в класс AbstractIntegrationTest, а также настроил контейнер следующим образом:

abstract class AbstractIntegrationTest {
   companion object {
        @JvmStatic
        @DynamicPropertySource
        fun properties(registry: DynamicPropertyRegistry) {
            registry.add("spring.datasource.url", postgreSQLContainer::getJdbcUrl)
            registry.add("spring.datasource.username", postgreSQLContainer::getUsername)
            registry.add("spring.datasource.password", postgreSQLContainer::getPassword)
        }
    }
}

Обратите внимание, что withReuse(true) — это всего лишь оптимизация, которая гарантирует, что БД не будет создаваться заново для каждого теста, поскольку это тяжелая операция, и поэтому вам нужно программно обрезать ваши таблицы между тестами...

Например:

@BeforeEach
fun setUp() {
    // Test util class that truncate all tables
    repoUtils.cleanTables()
}

Другие вопросы по теме