【问题标题】:How to test a method which runs slower than instantaneously?如何测试运行速度比瞬时慢的方法?
【发布时间】:2014-06-30 12:30:31
【问题描述】:

我有一种情况,调用方法返回错误,但仅在一段时间后(它会轮询外部服务一段时间,如果失败则返回错误)。

我可以对这个场景进行单元测试吗?测量方法的执行时间并将其与某个值进行比较的测试是否有效?

StopWatch stopWatch = new StopWatch();
stopWatch.start();
myService.do(1000); // argument is a timeout in ms
stopWatch.stop();

...

assertTrue(stopWatch.getTime() >= 1000);

【问题讨论】:

  • 您的意思是“投票”,而不是“池”,对吧?
  • @Dave Schweisguth 当然。如果您认为有问题,欢迎您编辑我的帖子。
  • 一般我会,但如果我错了,我不想改变你的问题的意思。
  • @Dave_Schweisguth 哦,明白了。感谢您指出错误!

标签: java unit-testing testing junit


【解决方案1】:

您的测试在一定程度上是有效的,但它不是最优的,原因有两个:

  • 时间流逝的原因不止一个,因此(正如您对 >= 的使用所揭示的那样)您无法准确地测试您的等待逻辑,只能近似地测试。
  • 一秒钟是很长的时间。缓慢的测试会拖累团队。

您可以通过等待 1 毫秒而不是 1000 毫秒轻松解决第二个问题,但是您几乎无法判断您的等待逻辑是否有效。

我会存根你调用的方法来测量时间的流逝(例如System.currentTimeMillis)并模拟你调用的等待方法(例如Thread.sleep),以便你的测试表明你的等待逻辑是正确,但您实际上不必等待。

【讨论】:

  • 我无法模拟正在测试的方法。等待是测试方法执行的结果 - 它多次尝试访问外部服务(被模拟并在调用时返回错误)。
  • 我的回答更明确了我的意思。
  • 模拟外部服务,而不是被测试的方法。你不想模拟被测试的方法,因为你没有测试它! :)
  • @rob 看起来我们跨越了 cmets。看看我的意思现在是否清楚。
【解决方案2】:

您可以使用Mockito 来存根您对测试不感兴趣的部分服务。

在一个单元测试中,您可以模拟外部服务以使其花费很长时间,这样您就可以测试得到预期的错误。

【讨论】:

    猜你喜欢
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    相关资源
    最近更新 更多