0

我有(平面)一个多模块项目,其结构大致如下:

  • 父母(pom)
    • 一个(罐子)
    • B(罐子)
    • C(罐子)
    • D(战争)

模块 D 依赖于 A、B 和 C,并将所有内容打包在一个战争中。每个 jar 模块(A、B 和 C)都有使用嵌入式 H2 数据库的基于 JUnit 的集成测试(它们是@SpringBootTest,与SpringRunner.

只需使用专用测试配置文件中的属性设置数据库:

spring.datasource.hibernate.dialect=org.hibernate.dialect.H2Dialect
spring.datasource.hibernate.hbm2ddl.auto=validate
spring.datasource.url=jdbc:h2:mem:def;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.username=sa
spring.datasource.password=password

目前,当mvn install在父节点上运行时,数据库是在每个模块的构建运行之前创建的(即数据库在每个模块的构建之后被销毁)。

是否有可能在每个模块的构建之间以某种方式保留数据库?原因是数据库的设置是一项相当耗时的操作。

4

1 回答 1

2

如评论中所述,您可以将集成测试放入 war 模块中,以便 spring 上下文只需要运行一次。如果上下文很大,这将大大加快构建速度。您将简单的单元测试保存在 jar 模块中。

如果,正如您所写的那样,有几个战争程序集并且将测试转移到这些程序中会做很多工作,我建议添加一个 maven 模块用于测试目的。这甚至可能是一场战争,因此您可以针对它运行 e2e 测试。我管理这样一个应用程序,其中业务模块是 jar,最终程序集是战争。

添加模块不会干扰当前构建,您可以将测试从现有位置一个接一个地移动到新模块中。事实证明,这并没有太多工作,并且总体上加快了构建速度。

我们的项目现在包含 96 个模块和 2 个测试模块。我们以与您相同的方式开始,并在 1 到 2 天后准备好测试模块。jar 构建速度非常快,因为它只是编译。所以这不是一个限制因素。

编辑:当我再次阅读您的问题时,耗时的部分实际上是预先创建数据库,关于文件数据库而不是内存数据库的建议也很有趣。您可以构建一次 h2 db 文件并将其作为资源放入您的测试模块中。在启动时,h2 只需连接并可能进行验证,您应该会在几秒钟内运行。我在这里看到的一个问题是,例如,如果您使用 flyway 并想要测试您的迁移脚本。这必须以某种方式缓解。

于 2018-07-11T18:26:01.533 回答