在 GitHub 上叉我

经常问的问题

  1. maven-failsafe-plugin 和 maven-surefire-plugin 有什么区别?
  2. 如何在其他模块中重用我的测试代码?
  3. Surefire 失败并显示消息“分叉的 VM 在没有正确说再见的情况下终止”。
  4. 崩溃的 Surefire 或 Failsafe 插件必须指示崩溃的测试
  5. 如何运行 GWT 测试?
  6. 如何使用其他插件设置的属性argLine
  7. maven-failsafe-plugin 如何让我配置要使用的 jar 文件或类?
  8. 如果失败,如何转储插件运行时的致命错误和堆栈跟踪?
  9. 通过直接写入分叉 JVM 中的本机流来损坏 STDOUT
  10. 当 Jenkins CI 杀死 Maven 进程并且测试仍然继续运行时,无法删除这些文件。
maven-failsafe-plugin 和 maven-surefire-plugin 有什么区别?

maven-surefire-plugin 专为运行单元测试而设计,如果任何测试失败,那么它将立即使构建失败。

maven-failsafe-plugin 专为运行集成测试而设计,如果测试失败与实际运行测试分离,则将构建失败解耦。

[最佳]


如何在其他模块中重用我的测试代码?

请访问此链接以供参考, 附加测试另请参阅测试的包含和排除示例。

[最佳]


Surefire 失败并显示消息“分叉的 VM 在没有正确说再见的情况下终止”。

Surefire 不支持随时调用测试或任何引用的库System.exit()。如果他们这样做,它们与 Surefire 不兼容,您可能应该向库/供应商提出问题。或者,分叉的 VM 也可能由于多种原因而崩溃。查找hs_err*指示 VM 崩溃的经典“”文件或在测试执行时检查 Maven 日志输出。崩溃进程的一些“异常”输出可能会转储到控制台/日志。如果这种情况发生在 CI 环境中并且仅在它运行了一段时间之后,那么您的测试套件很有可能会泄漏某种操作系统级别的资源,从而在每次运行时使情况变得更糟。常规的操作系统级监控工具可能会给您一些指示。

[最佳]


崩溃的 Surefire 或 Failsafe 插件必须指示崩溃的测试

在分叉 JVM 崩溃后,分叉 JVM 的控制台会打印Crashed tests:并列出最后一个崩溃的测试。在控制台日志中,您可以找到消息 The forked VM terminate without proper say goodbye

[最佳]


如何运行 GWT 测试?
Mojohaus 发布了一个 [gwt-maven-plugin](https://gwt-maven-plugin.github.io/gwt-maven-plugin/),但是如果要使用 Surefire 运行,则需要以下设置:

使用以下配置: 尝试,如果它不起作用,则回退到

<useSystemClassLoader>true</useSystemClassLoader>

<useManifestOnlyJar>false</useManifestOnlyJar>

<forkCount>1</forkCount>

reuseForks=truereuseForks=false

[最佳]


如何使用其他插件设置的属性argLine

Maven 为

${...}
在运行任何插件之前 pom.xml 中的值。所以 Surefire 永远不会在其 argLine 属性中看到占位符。

由于版本 2.17 使用这些属性的替代语法,

@{...}
允许在插件执行时延迟替换属性,因此已被其他插件修改的属性将被正确拾取。

[最佳]


maven-failsafe-plugin 如何让我配置要使用的 jar 文件或类?

默认情况下,如果 pom.xml 中的打包设置为“jar”,则 maven-failsafe-plugin 在测试类路径中使用项目工件文件。如果您使用配置参数“classesDirectory”,则可以对其进行修改,例如设置为主项目类。这意味着您在插件的配置中为参数“classesDirectory”设置了值“${project.build.outputDirectory}”。

[最佳]


如果失败,如何转储插件运行时的致命错误和堆栈跟踪?

默认情况下maven-failsafe-pluginmaven-surefire-plugin转储转储文件中的致命错误,这些错误位于target/failsafe-reportstarget/surefire-reports中。转储文件的名称格式如下: 分叉的 JVM 进程和插件进程通过 std/out 进行通信。如果此通道由于某种原因损坏,损坏流的转储将出现在*.dumpstream中。

[date]-jvmRun[N].dump

[date]-jvmRun[N].dumpstream

[date].dumpstream

[date].dump

[最佳]


通过直接写入分叉 JVM 中的本机流来损坏 STDOUT

如果您的测试使用打印到 STDOUT 的本机库,则会出现此警告消息,因为库损坏了插件使用的通道,以便将具有测试状态的事件传输回 Maven 进程。如果您通过System.setOut覆盖 Java 流,情况会更糟,因为该流也应该被破坏,但 Maven 永远不会看到测试完成并且构建可能会挂起。

如果您使用FileDescriptor.out或 JVM 打印 GC 摘要,则会出现此警告消息。

在这种情况下,将打印警告 “Corrupted STDOUT by directly write to native stream in forked JVM”,并且可以在 Reports 目录中找到转储文件。

如果启用了调试级别,则控制台中会出现损坏流的消息。

[最佳]


当 Jenkins CI 杀死 Maven 进程并且测试仍然继续运行时,无法删除这些文件。

当标准输入流关闭时,Surefire 和 Failsafe 插件可能会杀死分叉的 Surefire JVM。这在您通过 CTRL+C 停止 Maven 进程时有效,但不能保证在所有平台上都可以,并且在版本 3.0.0-M5(为进程间通信设置 TCP 套接字)之后将删除此机制。Surefire 和 Failsafe 3.0.0-M4 禁用机制 PING 父进程和本机查杀机制。为了启用这些机制,请参阅配置参数“enableProcessChecker”的文档并启用这些机制。这些机制对您的操作系统系统和 GC 有一些缺点,因此请参阅参数“enableProcessChecker”的文档。

[最佳]