如何在共享数据库的分支并行测试期间正确设置数据库固定装置

时间:2019-01-10 16:08:51

标签: spring postgresql hibernate parallel-processing junit5

所以我有一个gradle的spring项目。我有很多集成测试,在一个内核上运行时,大约需要30分钟才能完成,因此我想使这些测试并行运行。为此,我决定使用gradle属性maxParallelForks,我将其设置为 tasks.withType(Test) { maxParallelForks = Runtime.runtime.availableProcessors() } 我有一个在数据库中设置某些实体的类(在docker容器中运行的postgres),它看起来像这样:

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

问题:当我与gradle并行运行至少2个测试时,我得到一个DataIntegrityException,该异常表示具有此名称的Person已经在数据库中。发生问题是因为在gradle创建的每个fork中,DatabaseInitializer的run()方法几乎同时运行,而且我猜每个事务都试图将同一Person添加到数据库中。 此外,还有多种将实体添加到数据库的测试,一旦测试通过DatabaseInitializer,它们可能会开始失败。

所以我的问题是:有没有办法为我的数据库表实现某种类似于互斥的解决方案,可以处理这些并发事务,或者也许有另一种方法可以解决我的问题。

期待听到您对此问题的看法。预先感谢!

0 个答案:

没有答案