如何为某些类(如计时器类)编写单元测试?

时间:2011-11-19 17:16:21

标签: c++ unit-testing

假设我刚刚写了下面的类,我开始为它编写一些单元测试:

http://www.ogre3d.org/docs/api/html/classOgre_1_1Timer.html

如何通过单元测试确保计时器正常工作?我可以测试以确保getMilliseconds()总是大于开始时间,但这并不能告诉我getMilliseconds()正在返回正确的增量时间。

有什么建议吗?

3 个答案:

答案 0 :(得分:3)

理想情况下,您应该将操作系统调用分开并使其成为自己的使用虚函数的类,这样您就可以使用自己的数据来删除操作系统调用。这样可以测试除了从操作系统返回的数据之外的所有内容都是正确的。

在我看来,总的来说这是个好主意。我已经把操作系统想象成你无法删除的Singleton。最好本地化使用Singleton的方式,这样大多数代码都无法访问它。

话虽如此,有一些测试操作系统的技术。

一种测试方法是尝试让操作系统以两种不同的方式做同样的事情,并确保这两种不同的方式或多或少匹配。在这种情况下,我建议使用某种sleep函数。例如,在Unix上,您可以使用nanosleep来休眠几分之一秒,然后进行测试,以确保您的计时器类测量到的一小部分或多或少相同(在某个范围内)误差)。

答案 1 :(得分:1)

单元测试的核心思想是控制输入以检查输出是否符合要求。

在这里,你会(以某种方式)需要控制时钟,为类提供时间参考,以便能够对其进行正确的单元测试。

如果做不到这一点,你将不得不接受近似的结果,更糟糕的是,你可能最终会依赖于平台,操作系统有多种方法可以测量时间。不过,它可能还不错。

一个例子:如果你有权访问时钟,你可以检查间隔:

outerStart = refClock.time();
start = timer.time();
innerStart = refClock.time();

// ... 

innerEnd = refClock.time();
end = timer.time();
outerEnd = refClock.time();

然后,你应该有outerEnd - outerStart>结束 - 开始> innerEnd - innerStart,虽然有时间你可能会有时间分辨率问题(比如时钟太不精确)。

答案 2 :(得分:1)

您可能无法对单位测试的实时准确进行测试。如果您编写该类,则可能会调用特定于OS的函数来返回时钟时间。您可以通过检查它是否在每个操作系统上给出合理的响应来测试它。

您可以通过删除对操作系统的调用并返回您控制的值来对测试中的时间转换进行单元测试,例如时间转换。