【问题标题】:How do I get JUnit to be consistent when timing out?超时时如何让 JUnit 保持一致?
【发布时间】:2010-11-02 09:39:09
【问题描述】:

JUnit @Tests 具有指定 timeout 参数的有用功能,这样如果编写的程序花费的时间超过 timeout 秒,就会自动终止。问题是这使用 clock 时间而不是 CPU 时间 - 因此测试实际上会在两次运行之间运行不同的时间。例如,测试可能会运行 1.901 秒或 1.894 秒,超时 2 秒,具体取决于 CPU 上同时运行的其他作业。

我可以指定一个超时时间或类似的时间来在运行中保持一致吗? (这个问题的扩展包括:跨机器一致等)

【问题讨论】:

  • 在不同的机器上我认为不是。根据 cpu+ram 等,您的代码肯定需要不同的时间。
  • 这或多或少是我的想法。但是,在同一台机器上运行时保持一致呢?
  • 您到底想测试什么?执行这段代码应该正好需要 1.8942451 秒,会不会,嗯,没用?
  • @Ishtar 我不知道你刚才说了什么。
  • 这里真正的问题是什么?为什么你关心 0.007 秒?上面指定的两个值都在2s超时,如果2s不够,再给测试多一秒或者重写。

标签: java multithreading unit-testing concurrency junit


【解决方案1】:

我认为您最好的方法是将 JUnit 超时设置为所需超时的 2-3 倍,并使用ThreadMXBean 进行自己的基准测试,以测量 CPU 时间(如果可用)。然后,如果您已超过超时时间,您可以fail

【讨论】:

  • 你可以根据从 mbean 中提取的 CPU 时间来实现你自己的 junit 超时......哦,我可能会这样做:D
  • 我试过了,它几乎可以工作。除了:1)2-3x 仍然只是一个猜测和 2)Thread.sleep() 不会增加 CPU 时间,但确实需要更多时间(因此休眠 1.5 秒的程序将通过本应通过的单元测试1 秒后超时)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-03
  • 2010-09-15
  • 2013-10-09
  • 1970-01-01
相关资源
最近更新 更多