java - 使用 JUnit 5 的并发 Spring Boot 测试正在启动多个 JVM

标签 java spring-boot concurrency junit5

我正在使用new JUnit 5 concurrency feature并行运行多个 @SpringBootTest 类。它适用于小型测试集,但一旦我运行所有测试类,它将启动我的 Spring Boot 应用程序的多个实例。在日志中很容易看到(我正在使用 JHipster )。

我很确定这不应该发生,因为我在 JUnit/Spring Boot 文档中没有找到任何有关此行为的信息。

更奇怪的是它似乎随机产生新实例。它以 2 开头,并且在执行过程中会启动新的(在服务器启动时暂停)。但是,它总是相同进程 ID,就好像实例在过程中被销毁并重新创建一样......(请参阅下面的日志)

这是我的配置:

  • spring-boot:2.3.8.RELEASE
  • junit 平台:1.7.1
  • junit-木星:5.7.1
  • 在 Windows 10 和 IntelliJ IDEA 2020.2.4(社区版)上运行测试,但 mvn test 出现相同的行为

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

所有测试类都带有以下注释:

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

在日志中,我可以清楚地看到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
...
...

希望有人遇到同样的问题。我怀疑这是一个配置问题,因为这里几乎所有东西都是开箱即用的......

预先感谢大家的宝贵时间!

最佳答案

经过漫长而乏味的尝试和错误过程后,我想通了,而且非常简单。

它与 JUnit 5 或并行执行没有任何关系,并且在我在项目中使用它之前它就已经发生了。在某些情况下,这与 Spring Boot 测试不重用应用程序上下文有关。

更多详细信息:

一旦我的所有测试类都使用完全相同的上下文配置,则仅加载一个服务器/上下文并且并行执行运行良好!

关于java - 使用 JUnit 5 的并发 Spring Boot 测试正在启动多个 JVM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66879045/

相关文章:

java - Spring数据JPA日志记录

c++ - 立即在不同的线程上通过 IP 发送

Java:序列化初学者问题:-(

java - 无法使用 jdbc 将 Spark 数据集写入数据库

java - 如何从AWS参数存储获取Spring数据源属性值?

java - Swing 组件卡住,直到一个组件完成其工作

java - 每个线程都在单独的处理器上 - 这可能吗?

java - 如何获取 JTable 中的文本?

javascript - 使用 Google 脚本永久删除我的电子邮件的脚本

java - 模拟子服务的 REST 请求