经常问的问题
- maven-failsafe-plugin 和 maven-surefire-plugin 有什么区别?
- 如何在其他模块中重用我的测试代码?
- Surefire 失败并显示消息“分叉的 VM 在没有正确说再见的情况下终止”。
- 崩溃的 Surefire 或 Failsafe 插件必须指示崩溃的测试
- 如何运行 GWT 测试?
- 如何使用其他插件设置的属性
argLine
? - maven-failsafe-plugin 如何让我配置要使用的 jar 文件或类?
- 如果失败,如何转储插件运行时的致命错误和堆栈跟踪?
- 通过直接写入分叉 JVM 中的本机流来损坏 STDOUT
- 当 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=true
reuseForks=false
- 如何使用其他插件设置的属性
argLine
? -
Maven 为
${...}
由于版本 2.17 使用这些属性的替代语法,
@{...}
- maven-failsafe-plugin 如何让我配置要使用的 jar 文件或类?
-
默认情况下,如果 pom.xml 中的打包设置为“jar”,则 maven-failsafe-plugin 在测试类路径中使用项目工件文件。如果您使用配置参数“classesDirectory”,则可以对其进行修改,例如设置为主项目类。这意味着您在插件的配置中为参数“classesDirectory”设置了值“${project.build.outputDirectory}”。
- 如果失败,如何转储插件运行时的致命错误和堆栈跟踪?
-
默认情况下maven-failsafe-plugin和maven-surefire-plugin转储转储文件中的致命错误,这些错误位于target/failsafe-reports和target/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”的文档。