【问题标题】:Compiling Java unit tests very slow编译 Java 单元测试非常慢
【发布时间】:2021-11-29 08:16:23
【问题描述】:

我正在开发一个新的多模块 Maven 项目 (Java11+),因为我们向项目中添加了越来越多的单元测试,我注意到编译我们的测试变得非常缓慢。所以我开始分析项目,这里是编译一个典型模块的结果:

  • "test-compile" 18 个文件耗时 109 秒
  • “编译”(非测试类)76 个文件需要 4 秒。

我已经在我的带有 Java11 (OpenJDK) 的 Windows 笔记本上运行了它,但可以在 Java17 和 OracleJDK 以及 Linux 机器上重现它。我不知道是什么导致了这种巨大的差异(每个文件 0.05 秒与每个文件 6 秒)。我们主要使用 Spring-Boot,我们的测试使用 Junit5 和 spring-boot-starter-test、Mockito 和 AssertJ。

这是使用我们的 maven 配置的最小复制器: https://github.com/elbird/slow-test-compile

【问题讨论】:

  • 您能否提供有关您的代码的更多信息,或者是否可以链接到您的代码?
  • 你使用lombok、mapstruct之类的东西吗?完整的 pom 也会有所帮助...我们真的在谈论测试的编译时间还是运行时间...完整的日志文件在这里会有所帮助...还要检查您是否正在运行防病毒应用程序...
  • 我们使用 lombok 和 mapstruct。不幸的是,因为这是一个客户的私人项目,我不能分享任何真实的代码。稍后我可以尝试创建与我们的项目类似的项目来重现此问题并将某些地方公开。
  • 我使用我们的 maven 配置添加了一个复制器:github.com/elbird/slow-test-compile
  • 你还能分享更多关于这方面的信息吗?也许你是如何执行测试的? Lombok “已知”会不时导致 IDE 出现问题

标签: java maven unit-testing compilation lombok


【解决方案1】:

经过多次反复试验,我找到了罪魁祸首:龙目岛。 我无法解释为什么,但在我的复制器https://github.com/elbird/slow-test-compile 中,我发现至少在版本 1.18.20(及更低版本)中的 lombok 在使用 Java11+ 编译时非常慢。 (尤其是像 assertjs assertThat() 这样重载的方法)

幸运的是,在 lombok 1.18.22 中,这个问题似乎得到了解决。该修复似乎与此错误有关:https://github.com/projectlombok/lombok/issues/2652 已通过以下更改日志条目修复:

不可能的重大更改:如果底层编译器和 --release / --source 选项为 10 或更高,lombok 的 val 现在将替换为 final var。

https://projectlombok.org/changelog

TLDR:更新到 lombok 1.18.22 解决了这个问题。

【讨论】:

    猜你喜欢
    • 2018-05-21
    • 1970-01-01
    • 2013-03-01
    • 2017-02-05
    • 2012-06-13
    • 2012-01-01
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    相关资源
    最近更新 更多