简体   繁体   English

并发 Spring 使用 JUnit 5 的引导测试正在启动多个 JVM

[英]Concurrent Spring Boot tests using JUnit 5 are starting mulitple JVMs

I'm using the new JUnit 5 concurrency feature to run multiples @SpringBootTest classes in parallel.我正在使用新的 JUnit 5 并发功能并行运行多个@SpringBootTest类。 It works great with a small test set but once I run all the tests classes, it's going to start multiple instances of my Spring Boot app.它适用于小型测试集,但一旦我运行所有测试类,它将启动我的 Spring 引导应用程序的多个实例。 It's pretty easy to see in the logs (I'm using JHipster ).在日志中很容易看到(我正在使用JHipster )。

I'm pretty sure this isn't supposed to happen since I didn't find anything about this behavior in the JUnit/Spring Boot docs.我很确定这不应该发生,因为我在 JUnit/Spring Boot 文档中没有找到任何关于这种行为的信息。

What is even weirder is that it seems to spawn new instances randomly.更奇怪的是,它似乎随机产生了新的实例。 It starts with 2 at the beginning and new ones are getting spun up during the execution (which pauses while the server starts).它以 2 开头,在执行过程中新的开始旋转(在服务器启动时暂停)。 However, it's always the same process ID as if instances were destroyed and recreated along the way... (see logs below)但是,它始终是相同的进程 ID,就好像实例在此过程中被销毁和重新创建一样......(请参阅下面的日志)

Here's my config:这是我的配置:

  • spring-boot: 2.3.8.RELEASE spring-boot:2.3.8.RELEASE
  • junit-platform: 1.7.1 junit平台:1.7.1
  • junit-jupiter: 5.7.1 junit-木星:5.7.1
  • Running tests on Windows 10 and IntelliJ IDEA 2020.2.4 (Community Edition) but same behavior happens with mvn test在 Windows 10 和 IntelliJ IDEA 2020.2.4(社区版)上运行测试,但同样的行为发生在mvn test

junit-platform.properties configuration: junit-platform.properties配置:

junit.jupiter.execution.parallel.enabled=true
junit.jupiter.execution.parallel.mode.default=concurrent
junit.jupiter.execution.parallel.mode.classes.default=concurrent
junit.jupiter.execution.parallel.config.strategy=fixed
junit.jupiter.execution.parallel.config.fixed.parallelism=4

All tests classes are annotated with the following:所有测试类都带有以下注释:

@Import({ PostgresqlTestConfig.class, MailTestConfig.class, ServerContext.class, CaptchaTestConfig.class })
@SpringBootTest(classes = { MyApp.class }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ActiveProfiles("prod")

In the logs, I can clearly see the SB app starting procedure multiples times:在日志中,我可以清楚地看到多次启动 SB 应用程序:


        ██╗ ██╗   ██╗ ████████╗ ███████╗   ██████╗ ████████╗ ████████╗ ███████╗
        ██║ ██║   ██║ ╚══██╔══╝ ██╔═══██╗ ██╔════╝ ╚══██╔══╝ ██╔═════╝ ██╔═══██╗
        ██║ ████████║    ██║    ███████╔╝ ╚█████╗     ██║    ██████╗   ███████╔╝
  ██╗   ██║ ██╔═══██║    ██║    ██╔════╝   ╚═══██╗    ██║    ██╔═══╝   ██╔══██║
  ╚██████╔╝ ██║   ██║ ████████╗ ██║       ██████╔╝    ██║    ████████╗ ██║  ╚██╗
   ╚═════╝  ╚═╝   ╚═╝ ╚═══════╝ ╚═╝       ╚═════╝     ╚═╝    ╚═══════╝ ╚═╝   ╚═╝

:: JHipster 🤓  :: Running Spring Boot 2.3.8.RELEASE ::
:: http://jhipster.github.io ::

2021-03-30 23:47:08.593  INFO 7200 --- [Pool-1-worker-5] .w.w.w.r.a.JwtAuthenticationResourceTest : Starting JwtAuthenticationResourceTest on MSI with PID 7200 
...
... (initializing the context here, i.e embedded PostgreSQL, running Liquibase, etc...)
...
2021-03-30 23:48:54.811  INFO 7200 --- [Pool-1-worker-5] org.quartz.core.QuartzScheduler          : Scheduler quartzScheduler_$_MSI1617140910513 started.
2021-03-30 23:48:54.850  INFO 7200 --- [Pool-1-worker-5] .w.w.w.r.a.JwtAuthenticationResourceTest : Started JwtAuthenticationResourceTest in 106.911 seconds (JVM running for 118.405)

... Then a bit later ...


        ██╗ ██╗   ██╗ ████████╗ ███████╗   ██████╗ ████████╗ ████████╗ ███████╗
        ██║ ██║   ██║ ╚══██╔══╝ ██╔═══██╗ ██╔════╝ ╚══██╔══╝ ██╔═════╝ ██╔═══██╗
        ██║ ████████║    ██║    ███████╔╝ ╚█████╗     ██║    ██████╗   ███████╔╝
  ██╗   ██║ ██╔═══██║    ██║    ██╔════╝   ╚═══██╗    ██║    ██╔═══╝   ██╔══██║
  ╚██████╔╝ ██║   ██║ ████████╗ ██║       ██████╔╝    ██║    ████████╗ ██║  ╚██╗
   ╚═════╝  ╚═╝   ╚═╝ ╚═══════╝ ╚═╝       ╚═════╝     ╚═╝    ╚═══════╝ ╚═╝   ╚═╝

:: JHipster 🤓  :: Running Spring Boot 2.3.8.RELEASE ::
:: http://jhipster.github.io ::

2021-03-30 23:51:14.626  INFO 7200 --- [Pool-1-worker-3] c.w.w.security.AuthenticationFlowTest    : Starting AuthenticationFlowTest on MSI with PID 7200
...
...

I hope somebody encountered the same problem.我希望有人遇到同样的问题。 I doubt it's a configuration issue since pretty much everything is out of the box here...我怀疑这是一个配置问题,因为这里几乎所有东西都是开箱即用的......

Thanks in advance for everyone's time !提前感谢大家的时间!

After a long and tedious process of trial and errors, I figured it out and it's pretty simple.经过漫长而乏味的反复试验过程,我想通了,这很简单。

It's in no way related to JUnit 5 or the parallel execution and it was already happening before I use it on the project.它与 JUnit 5 或并行执行没有任何关系,并且在我在项目中使用它之前就已经发生了。 It's related to Spring Boot tests not reusing application context in some cases.它与Spring 在某些情况下不重用应用程序上下文的引导测试有关。

Further details there:那里的更多细节:

Once all my test classes are using the exact same context configuration, only one server/context is loaded and parallel execution is working well !一旦我的所有测试类都使用完全相同的上下文配置,只加载一个服务器/上下文并且并行执行运行良好!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM