【问题标题】:How to write a unit test for a stopwatch?如何为秒表编写单元测试?
【发布时间】:2011-10-21 12:42:34
【问题描述】:
我有一门课可以测量调用Start 和Stop 之间的时间。我创建了一个单元测试,使用boost::this_thread::sleep 在Start 和Stop 之间休眠,我测试结果接近睡眠时间。
但是,此测试在我们的构建代理上失败,而不是在我们的开发机器上。问题是:我怎么知道这是秒表的实际问题,还是构建代理(运行其他一些进程,作为虚拟机)可能比我告诉它的睡眠时间更长的“问题”?
所以问题是:有没有一种健壮的方法来编写类似“做一些只需要 x 秒的事情”之类的东西?
非常感谢!
【问题讨论】:
标签:
c++
windows
unit-testing
time
【解决方案1】:
没有办法在非实时系统上可靠地测试这样的东西。可行的方法是封装用于获取秒表使用的系统时间的 API,并在测试中模拟它们。
【解决方案2】:
获取睡眠前后的系统时间,仅参考这些时间之间的差异,而不是您的睡眠时间。
【解决方案3】:
您的秒表的分辨率是多少?如果你需要精确到秒,那么睡 3 秒,看看你是否在 2.9 和 3.1 之间,对你有用。如果您需要 mili/nano 秒精度,您应该按照第一个回复中的建议使用时间戳模拟。
【解决方案4】:
这取决于您使用的操作系统。在支持多道程序的系统上,线程的运行时间是不确定的。然而,在某些实时系统上,如果您的线程具有最高优先级,这几乎是准确的。您应该能够禁用中断来模拟这种情况,因为您的线程不会被操作系统调度程序抢占。