我目前正在尝试评估不同的测试框架。当使用模拟框架时(我倾向于 FakeIt,但 google mock 也很好),我知道您可以通过在调用函数之前和之后使用操作系统的计时器调用来验证函数的性能来进行自己的“性能”测试。这不是我所追求的。
我所做的是在给定某些输入的情况下实现输出延迟的类。例如:
- 输入1从低电平到高电平
- 输出1从低电平变为高电平after1.5秒。
我希望能够在指定边界的地方做一些事情:
myMock.theInput();
EXPECT_CALL(myMock, theDelayedOutput())
.Times(1)
.Before(1.6sec)
.After(1.4sec);
为了澄清起见,Before
and After
不支持线路。这只是我喜欢的简单语法的一个示例。
是否可以在进行输入调用和检查之前在窗口内实现“延迟”功能EXPECT_CALL
?
这是方法的一部分 - 我仍然需要启动一个专有的计时器。像这样的东西吗?
myMock.theInput();
windowSleep(1.4);
startTimer();
EXPECT_CALL(myMock, theDelayedOutput())
.Times(1)
endTimer();
ASSERT_TRUE(elapsedTime() <= 0.2);
由于您用单元测试标记了问题:在单元测试中,您的测试永远不应该依赖于物理时间的流逝。这有多种原因:其中之一是您希望测试尽快运行,因此您不希望出现延迟。另一个原因是,由于硬件、操作系统、系统负载不同,开发环境(运行单元测试的地方)的时间可能与目标环境完全不同。
也就是说,涉及物理时间流逝的测试确实有意义,但它们将是对目标系统(或其某些模拟)的集成测试。在单元测试中,您将采取不同的方法:
您将模拟代表您的时钟的函数/方法。例如,如果您的函数 funcA 通过 setTimer 设置计时器,则提供在时间过去时调用的回调:
- 在某些测试中,您模拟 setTimer 函数,调用 funcA,并作为测试通过标准的一部分,检查是否使用您期望的参数调用了模拟的 setTimer。
- 在其他一些测试中,您可以直接从测试中调用回调函数,以查看该函数的行为是否正确。
在这两个单元测试案例中,您不需要等待物理时间过去。
也就是说,您当然可以使用用于单元测试的相同测试框架也用于集成测试(即使它们的名称,如 JUnit,似乎表明它们仅用于单元测试)。而且,如果集成测试实际上是您的目标测试类型,那么 Jeff Lamb 的建议肯定会有所帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)