Java 在maven多模块项目的各个模块的测试之间保留h2数据库

Java 在maven多模块项目的各个模块的测试之间保留h2数据库,java,spring,maven,h2,Java,Spring,Maven,H2,我有一个(平面)多模块项目,大致结构如下: 家长(pom) 一(罐) B(罐) C(罐) D(战争) 模块D依赖于A、B和C,在战争中打包所有东西。每个jar模块(A、B和C)都有使用嵌入式H2数据库的基于JUnit的集成测试(它们是@SpringBootTest,与SpringRunner一起运行) 只需使用专用测试配置文件中的属性设置数据库: spring.datasource.hibernate.dialect=org.hibernate.dialect.H2Dialect spr

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

  • 家长(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安装时,数据库是在运行每个模块的构建之前创建的(即,数据库在每个模块的构建之后被销毁)


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

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

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

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

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


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

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

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

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

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


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

您可以将其定义为嵌入式数据库
h2:file
,指向在构建过程中安全的路径,例如,不会被擦除。我对此也做了一些思考,如果没有其他解决方案,我可能会回到这一点上。。。一个问题是,我希望在整个构建运行期间确实生成DB;如果我们有一个文件,它可能早就存在了(并且会与当前定义发生冲突)。在
clean
目标中尽早删除DB文件可能是一个好主意……在JAR中只使用unittest,并将集成测试放在war级别如何?这样您只需启动一次spring。这肯定是我推荐的方法,但不幸的是,有几个问题阻碍了这一点。从技术上讲,实际上有几个战争的产生和大多数模块之间的战争使用。实际上,在这个项目的生命周期中,要真正引入这样的改变已经太晚了…@KernelPanic先生:如果你把你的评论作为一个答案,我会投赞成票。如果我没有找到更好的方法,那么我也会在接下来的日子里接受它:)你可以将它定义为嵌入式数据库
h2:file
,指向一个在构建过程中安全的路径,例如,不会被擦除。我也对此有一些想法,如果没有其他解决方案,我可能会回到这个问题上来。。。一个问题是,我希望在整个构建运行期间确实生成DB;如果我们有一个文件,它可能早就存在了(并且会与当前定义发生冲突)。在
clean
目标中尽早删除DB文件可能是一个好主意……在JAR中只使用unittest,并将集成测试放在war级别如何?这样,您只需启动spring一次。这肯定是我推荐的批准