[spring-projects/spring-boot]将 Spring Boot Starter 测试升级到 JUnit 5

2018-10-09 870 views
2

很多用户要求提供专用的 JUnit 5入门 POM,但我宁愿我们研究如何将现有的入门升级到 JUnit 5。

我们需要考虑以下用例:

  • 对于新建应用程序,最好仅使用 JUnit 5。如果有多个@Test导入,则会造成混乱。

  • 对于现有应用程序来说,如果它们能够在自己的时间迁移到 JUnit 5,那就太好了。升级后的应用程序应该可以继续工作。我们可能需要在一段时间内支持这种类型的混合应用程序。

  • 某些用户可能只想保留在 JUnit 4 上。我们需要考虑这是否是我们想要支持的事情,或者是否是他们应该自己做的事情。

回答

6

另请参见#6402(这可能最终会成为其重复)

9

根据 Gradle 团队的建议,我们已将 Boot 2.1 中支持的最低 Gradle 版本提高到 4.4。 Gradle 4.6 中添加了对 JUnit 5 的支持,因此默认迁移到 JUnit 5 将产生连锁反应,要求我们提高 Gradle 的最低支持版本。我怀疑 2.1 之后就可以了。

7

Eclipse 尚未完全支持开箱即用的 JUnit 5。要在 2018-09 中使用它,您必须安装补丁,或者在类路径上添加 JUnit 4。有关详细信息,请参阅https://bugs.eclipse.org/bugs/show_bug.cgi?id=538956。该问题应在 2018-12 年度得到解决。

0

另请注意,在后续的 Gradle 版本中,Gradle 对 JUnit 5 的支持也进行了错误修复。因此,Gradle 4.6 是最低版本。

4

不幸的是,Surefire、JUnit 的 Vintage 引擎和 Spring Framework 的测试框架的组合似乎还没有准备好迎接黄金时期。

使用 Vintage 引擎时,测试运行程序在创建测试描述期间执行的任何日志记录都会破坏主 Maven JVM 和运行测试的 JVM 之间的 Surefire 通信链路。这可以通过 Surefire 记录类似于以下内容的警告来识别:

[WARNING] Corrupted STDOUT by directly writing to native stream in forked JVM 1. See FAQ web page and the dump file …/target/surefire-reports/2018-12-12T09-56-36_709-jvmRun1.dumpstream

我相信这是 Surefire 中的一个错误。看起来,当使用 Vintage 引擎时,跑步者会在 Surefire 无法处理 System.out 的输出时被提前调用。我已经打开了SUREFIRE-1614

Spring Framework 的测试框架在测试描述创建期间定期在信息级别记录日志。登录AbstractContextLoader.generateDefaultLocations(Class<?>)就是一个例子。这意味着,如果我们将启动器切换到 Vintage 引擎并鼓励从 JUnit 4 API 温和迁移到 JUnit Jupiter API,则通信损坏和输出警告将成为一个常见问题。

解决方法是使用logback-test.xml或来调整日志记录配置,以便在 Surefire 能够处理此类输出之前log4j2-test.xml不会写入任何内容。System.out不幸的是,这需要一定量的试验和错误,因为具体记录的内容和时间取决于正在使用的特定运行程序和测试配置。

9

感谢 @wilkinsona 所做的出色侦探工作,以及向 Surefire 提出问题!

7

与 JUnit 4 不同,JUnit 5 不依赖于 Hamcrest。作为将启动程序移至 JUnit 5 的一部分,我们应该借此机会考虑是否要删除 Hamcrest(有关背景信息,请参阅 #15789,我已关闭该问题以支持此问题)。

6

看起来https://github.com/apache/maven-surefire/pull/209现在已经合并了。

现在应该删除“阻止”标签吗@wilkinsona?我刚刚开始一个新的 spring boot 项目,很惊讶 JUnit 4 仍然是默认的。

1

不幸的是,我们仍然被封锁。该修复仅在 Surefire 3.0 中可用,该版本适合新的主要版本,包含一些重大更改。理想情况下,我们不会在 Boot 的次要版本中升级到它,我们希望将更改向后移植到 Surefire 2.x。有这方面的消息吗,@snicoll?

3

目前 Surefire 3.0 的 M4 计划将于 2018 年 12 月 24 日启动,并计划于 2019 年 2 月 24 日发布。在 3.0 GA 之前还计划了另外两个里程碑。这三个版本目前还没有发布日期。大胆尝试一下,假设 M5 和 M6 的持续时间与 M4 相似,那么在我们 7 月初的 RC 之前 3.0 已经达到 GA 的时间非常紧张。

5

@philwebb 我们正在 ASF 中开发 Surefire。 Surefire 周围噪音太大。您能告诉我您对 Surefire 的具体需求或期望吗?

3

@Tibor17 感谢您伸出援手。我已经开始了一个话题maven-dev,我很高兴与那里的团队进行跟进。

1

spring-boot-starter-test现在带来了带有老式引擎的 JUnit Jupiter。 JUnit 4 测试仍在执行,并且可以使用新的 JUnit Jupiter API。我们计划在某个时候删除老式引擎,仅将用户引导至 JUnit 5。

1

请一次性删除 hamcrest :p (提醒之前的评论)。有史以来最麻烦的库,我们已经在类路径中得到了 junit5 断言和 AssertJ。另外,junit4.2已经有了它的依赖

6

@nightswimmings Hamcrest 是 MockMVC 所必需的,因此我们不会很快删除它。