Как правильно настроить фикстуры базы данных во время разветвленных параллельных тестов, которые совместно используют базу данных - PullRequest
0 голосов
/ 10 января 2019

Итак, у меня есть весенний проект с Gradle. У меня есть много интеграционных тестов, для выполнения которых требуется около 30 минут при работе на одном ядре, поэтому я хочу, чтобы тесты выполнялись параллельно. Чтобы добиться этого, я решил использовать свойство gradle maxParallelForks, которое я установил следующим образом tasks.withType(Test) { maxParallelForks = Runtime.runtime.availableProcessors() } У меня есть класс, который устанавливает некоторые объекты в базе данных (postgres работает в контейнере Docker), и это выглядит примерно так:

@Component
class DatabaseInitializer(private val peopleRepository: 
PeopleRepository) : ApplicationRunner {
    @Transactional
    override fun run(args: ApplicationArguments?) {
        peopleRepository.saveAndFlush(Person("john"))
    }
}

Проблема: когда я запускаю как минимум 2 теста параллельно с gradle, я получаю исключение DataIntegrityException, в котором говорится, что человек с таким именем уже находится в базе данных. Проблема возникает из-за того, что метод run () в DatabaseInitializer запускается почти одновременно на каждом форке, который создается gradle, и я предполагаю, что каждая транзакция пытается добавить одного и того же Person в базу данных. Кроме того, существует несколько тестов, которые добавляют объекты в базу данных, которые могут начать сбой после прохождения теста после DatabaseInitializer.

Итак, мой вопрос: есть ли способ получить какое-нибудь мьютекс-подобное решение для моих таблиц базы данных, которое может обрабатывать подобные параллельные транзакции, или, возможно, есть другой способ обойти мою проблему.

Будем рады услышать ваши мысли по этому вопросу. Заранее спасибо!

...