@QuarkusTest单元测试耗时过长,每次测试都重启应用是正常现象吗
问题结论
你遇到的Quarkus在每个测试类、测试方法执行前重启应用及依赖实例的行为不属于正常情况,符合官方文档描述的预期行为应为全量测试仅启动一次Quarkus应用及配套依赖,该问题也不是Gradle工具链的通用缺陷,通常由测试配置、特殊注解使用或版本BUG导致。
常见触发原因及修复方案
- 测试类存在差异化配置
如果任意测试类使用了@TestProfile自定义测试配置、@DirtiesContext注解标记上下文需要重建、不同测试类配置了不同的@QuarkusTestResource,都会触发Quarkus应用重启,以适配新的运行上下文。统一所有测试的基础运行配置即可解决该类问题。 - Gradle测试任务配置了过高的隔离级别
检查build.gradle中test任务的配置,如果设置了forkEvery = 1会让每个测试类都启动独立JVM进程,连带Quarkus应用重启,将该参数调整为默认值forkEvery = 0即可;同时排查是否有其他测试隔离类插件强制拆分测试运行进程。 - MongoDB DevServices配置未开启复用
你使用了Quarkus MongoDB扩展及DevServices自动启动MongoDB实例,若配置了quarkus.test.mongodb.devservices.reuse=false会导致每个测试类都重建MongoDB实例,连带触发应用重启,删除该配置或改为true即可复用同一实例。另外检查自定义的MongoDB测试资源类是否设置了restartAfterEach = true,关闭该参数即可。 - 版本存在已知测试BUG
你使用的Quarkus 2.2.2.Final属于早期迭代版本,存在多个和Kotlin、Panache-Kotlin结合时的测试上下文清理异常BUG,会误触发应用重启。可以升级到2.2.x分支的最新维护版,或更稳定的2.16.x LTS版本修复这类原生BUG。
快速验证方法
新建两个仅标注@QuarkusTest注解的空白测试类,每个类仅包含一个空实现的测试方法,执行gradle test查看运行日志。如果两个空白测试仍触发应用重启,则为全局配置问题;如果未触发重启,则说明原有业务测试类中存在特殊配置导致重启,逐一排查即可。
内容的提问来源于stack exchange,提问作者rookian
相关产品推荐
相关产品推荐

