检查在执行单元测试期间是否连接了调试器

10

有没有一种方法可以在JUnit代码中检查当前测试执行是否附加了调试器?
在.NET/C#中,我知道可以使用Debugger.IsAttached实现。

使用情况是当调试器被附加时更改或完全禁用测试超时,因为如果您只有约15秒(定义的超时时间)来调试测试,则这非常烦人。


作为一个快速的解决方案,当您第一次触发断点时(在15秒内),您可以始终使用“evaluate”来设置某些特定属性...但我也很想听听是否有正确的方法来做到这一点。最坏的情况下,使用命令行参数或系统属性来禁用超时... - vikingsteve
2个回答

9

这种方法并非百分之百可靠,但您可以检查Java Debug Wire Protocol(JDWP)是否处于活动状态,它是调试器用于连接JVM的协议。您可以通过检查JVM的输入参数来实现这一点,例如:

boolean isDebug() {
  for(String arg : ManagementFactory.getRuntimeMXBean().getInputArguments()) {
    if(arg.contains("jdwp=")) {
      return true;
    }
  }
  return false;
}

然而,如果其他人命名了jdwp或者该协议用于其他用途,则可能会返回错误的结果。此外,该命令可能会在未来发生变化,这使得它几乎不具备可靠性。当然,这种方法并不是JUnit特有的,但由于JUnit在JVM内没有任何特权,因此这是很自然的。


这不仅仅是说参数是否被传递 - 与调试器的连接无关吗?对于连接,它也应该检查是否设置了suspend=y吧? - Heiko Rupp
你就在这里。大多数人都在他们的IDE中运行调试,两者通常一起出现,但上述检查并不能保证这一点是正确的。 - Rafael Winterhalter

2

根据Rafael的回答:

private static boolean isDebug() {
   return ManagementFactory.getRuntimeMXBean().getInputArguments().stream().anyMatch(arg->arg.contains("jdwp=") && arg.contains("suspend=y"));
}

已点赞,但 suspend=y 是默认值。因此,最好检查是否不存在 suspend=n - gaborsch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接