在 GitHub 上叉我

开发者中心

使用 Surefire 时,有必要了解以下几点:

多模块项目

该插件是作为多模块插件的一部分构建的。您需要检查完整的模块并从那里构建:

  git clone https://gitbox.apache.org/repos/asf/maven-surefire.git

为演示问题制作测试用例

报告问题时,创建一个演示问题的小型示例项目非常有用。Surefire 已经包含大量此类项目,可以在surefire-integration-tests/src/test/resources/中找到它们。通常,您可以检查一个预先存在的项目并像这样运行它:

  cd surefire-integration-tests/src/test/resources/failsafe-buildfail
  mvn -Dsurefire.version=2.12 verify

附加调试器

有时将远程调试器附加到 Surefire fork 以尝试确定真正发生的情况是合适的。如果您结帐并构建主干,您通常会执行以下操作:

  mvn -Dmaven.surefire.debug=true install

在 IDE 中加载源代码,在开始处设置断点ForkedBooter#main并将调试器附加到端口 5005。

跟踪分叉执行

分叉的 Surefire 进程使用标准输入和输出与源进行通信。有时在跟踪故障时,仅查看 fork 的输出可能会有所帮助。

这可以通过运行来完成:

mvn -e -X install | grep Forking

如果您复制输出的命令部分,您应该能够通过将其粘贴到命令行来重新运行该命令(您可能只需要执行 之后的位&&)。

您现在可以将此命令粘贴到命令行并捕获 fork 的输出。这可以帮助您确定问题出在分叉端还是接收端。

在调查特定类时,您可能希望grep输出类名。此外,引导程序代码(第一个字段)可以在https://git-wip-us.apache.org/repos/asf?p=maven-surefire.git;a=blob;f=surefire-api/src/看到主/java/org/apache/maven/surefire/booter/ForkingRunListener.java

输出中的第二个字段(在引导程序代码之后)是逻辑通道号,其中 fork 中的不同线程应该进入不同的通道。

测试用例

Surefire 的所有补丁都必须包含测试覆盖率,无论是作为集成测试还是单元测试。端到端集成测试必须涵盖所有新功能(更改/添加的插件选项)。

还有许多其他集成测试都在surefire-integration-tests/src/test/resources.

示例集成测试是Surefire141PluggableProvidersIT和相应的surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders.

基本源代码阅读清单

一些方法/类比其他方法/类更多地揭示了一段代码的基本工作。以下类/方法是快速熟悉代码的“阅读清单”:

AbstractSurefireMojo#executeAllProviders
ForkStarter#fork
ForkedBooter#main

JDK 版本

万无一失的引导程序能够一直引导回 jdk1.7。具体来说,这意味着、 、surefire-apisurefire-booter其他模块是使用源/目标 1.7 编译的。该插件和几个提供程序是 1.7。提供程序使用 jdk1.8 编译。该项目需要使用jdk1.8,但测试使用由系统属性配置的 jdk1.7+ 运行,请参阅。common-junit3surefire-junit3surefire-junit-platformJAVA_HOMEjdk.homeREADME.md

提供者隔离

SUT ( Subject Under Test ) 中的类会覆盖 Surefire 提供程序中的任何类。这意味着使用任何第三方依赖项(除了测试框架本身)的提供者应该将这些类隐藏到不同的包中。

通用提供程序模块

surefire-providers模块包含common-junitXX模块。这些模块取决于XXJUnit 的版本,并且可以在正确的 JUnit 版本级别访问 JUnit API。也可以编写将使用正确的 JUnit 版本运行的单元测试。在构建时,这些“通用”模块的所有相关部分都只是隐藏在提供程序 jar 文件中。

影火

“Shadefire”是在 Surefire 构建中运行的第一个模块。这将创建为 JUnit 提供程序的阴影版本,然后此提供程序用于构建 Surefire 本身(从 Surefire 2.8 开始)。这是因为 SUT 覆盖了提供程序,并且 Shadefire 提供程序已被重新定位,以避免在 Surefire 自身构建时出现这种覆盖。

部署和发布 Surefire

Surefire 依赖于它自己的先前版本,这对于 Maven 2.2.x 依赖解析来说太先进了。因此构建 Surefire 需要 Maven 3.x。