如何测试运行速度比瞬间慢的方法?

时间:2014-06-30 12:30:31

标签: java unit-testing testing junit

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

我可以对这种情况进行单元测试吗?测试有效,测量方法的执行时间并将其与某个值进行比较吗?

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

...

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

2 个答案:

答案 0 :(得分:2)

你的测试有点有效,但由于两个原因它并不是最佳的:

  • 时间可以超过一个原因,因此(正如您对>=的使用所揭示的那样)您无法准确地测试您的等待逻辑,只是大约。
  • 一秒钟很长一段时间。缓慢的测试对团队造成拖累。

您可以通过等待1 ms而不是1000来轻松解决第二个问题,但是您几乎无法判断等待逻辑是否正常工作。

我会把你正在调用的方法用来衡量时间的推移(例如System.currentTimeMillis)并模拟你要求等待的方法(例如Thread.sleep),这样你的测试就会显示出来你的等待逻辑是正确的,但实际上你不必等待。

答案 1 :(得分:1)

您可以使用Mockito来存储您不想测试的部分服务。

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