我最近有一个访谈,并且访问者问我这个问题。 假设我们有一个依赖于系统时钟的程序。您将如何测试该程序或编写测试用例。
我回答了以下
有人可以就这个问题提出一些亮点吗?
Thanks.Rick
答案 0 :(得分:2)
这是其中一个问题,它们只是试图了解您是否了解所涉及的问题。没有“一个正确的答案”。从这个问题来看,它甚至不清楚你应该测试什么。如果程序依赖于系统时钟是正确的,那么如果系统时钟不正确,则应失败。如果程序依赖于系统时钟是单调的,那么如果系统时钟向后跳跃则会失败。
基本上,您需要测试两类内容。在程序应该工作的情况下,是吗? (例如,如果它应该容忍向后时钟跳跃而不会失败,那么如果有向后时钟跳转会发生什么?)并且在程序应该失败的情况下,它是否会以它应该的方式失败? (如果时钟太远,它应该拒绝验证,它实际上是这样做的吗?)
一个问题是如何给它提供错误的时钟信息。一种方法是你建议的方式 - 添加一个调用来拦截程序的“获取当前时间”功能并给它不同的时间。这种方法的缺点是,程序可能会在其代码的某个深处,以其他方式获得您未能挂钩的时间。
但这种方法的真正问题在于它可能会导致系统看到不一致的时间。例如,假设程序创建一个文件,然后调用stat
来获取文件的最后修改时间,并将其与系统时间挂钩。该程序将获得该文件的错误年龄,除非您挂钩并抵消所有返回时间的调用。
另一种方法是在测试工具中实际设置错误的系统时钟。
答案 1 :(得分:0)
不确定“生产问题”的含义,但我会创建Clock API的存根。在测试期间,我会指定系统使用我可以控制的假时钟API。在生产过程中,系统只会默认为“普通”时钟API。您可以使用名为Dependency Injection的技术说明来指定要使用的API。
有很多工具可以帮助开发人员编写需要虚假对象(如模拟和存根)的单元测试。
答案 2 :(得分:0)
我必须实现使用系统时钟来实现超时的真正的C ++代码,并且必须进行测试。我基本上按照你的说法做了。我有一个Clock
抽象基类,并且关键代码使用该类型的实例而不是直接使用真实时钟。我直到测试使用了一个模拟TestClock
派生类,我可以任意操纵它。这使我能够获得使用时钟的组件的良好测试覆盖率。
真实代码使用PosixClock
派生类,该类委派给系统时钟。那我怎么测试呢?我需要做的就是证明PosixClock
确实使用了系统时钟。读取PosixClock
的单元测试,睡了一会儿,直到时钟明显向前移动就足够了。我还有一些集成测试用例,证明了超时功能的有效性。
这三种测试用例(使用时钟的组件单元测试,PosixClock
单元测试和整合测试)一起向我表示满意,即代码是正确的。