【问题标题】:Test cases for a program using System Clock使用系统时钟的程序测试用例
【发布时间】:2012-01-31 23:23:08
【问题描述】:

我最近接受了一次面试,面试官问了我这个问题。 假设我们有一个依赖于系统时钟的程序。你将如何测试这个程序或编写测试用例。

我回答如下

  1. 让程序提供一个 API 来设置时间,当设置程序需要花费这个时间而不是系统时间时

然后他问我你将如何测试生产问题?

有人可以在这个问题上强调一下吗?

谢谢瑞克

【问题讨论】:

  • “生产问题”是什么意思。

标签: unit-testing testing


【解决方案1】:

这是真正只是想看看您是否了解所涉及的问题的问题之一。没有“一个正确的答案”。从这个问题来看,甚至不清楚你应该测试什么。如果程序依赖于系统时钟是正确的,那么如果系统时钟不正确,它应该失败。如果程序依赖于系统时钟是单调的,那么如果系统时钟向后跳,它就会失败。

基本上,您需要测试两类事物。在程序应该工作的情况下,是吗? (例如,如果它应该容忍向后时钟跳跃而不会失败,如果有向后时钟跳跃会发生什么?)在程序应该失败的情况下,它是否会按照它应该的方式失败? (如果它应该在时钟太远的情况下拒绝验证,它是否真的这样做了?)

一个问题是你如何给它不正确的时钟信息。一种方法是您建议的方式 - 添加一个调用以拦截程序的“获取当前时间”功能并给它不同的时间。这种方法的缺点是程序可能会在其代码深处的某个地方以其他方式获取时间,而您无法挂钩。

但这种方法的真正问题是它可能会导致系统看到不一致的时间。例如,假设程序创建了一个文件,然后调用stat 以获取文件的最后修改时间,并将其与挂钩的系统时间进行比较。除非您挂钩和抵消所有返回时间的调用,否则程序将获取错误的文件年龄。

另一种方法是在测试工具中错误地设置系统时钟。

【讨论】:

    【解决方案2】:

    不确定您所说的“生产问题”是什么意思,但我会创建时钟 API 的存根。在测试期间,我会指定系统使用这个我可以控制的假时钟 API。在生产期间,系统将简单地默认为“正常”时钟 API。您可以使用称为Dependency Injection 的技术来指定要使用的 API。

    有很多工具可以帮助开发人员编写需要模拟和存根等假对象的单元测试。

    【讨论】:

      【解决方案3】:

      我必须实现真正的 C++ 代码,该代码使用系统时钟来实现超时并且必须进行测试。我基本上按照你说的做了。我有一个Clock 抽象基类,并让关键代码使用该类型的实例,而不是直接使用真实时钟。我的 until 测试使用了一个模拟的 TestClock 派生类,为此我可以任意操纵时间。这使我能够对使用时钟的组件进行良好的测试覆盖。

      真正的代码使用了PosixClock 派生类,它委托给系统时钟。那我是怎么测试的呢?我需要做的就是证明PosixClock 确实使用了系统时钟。读取PosixClock 的单元测试睡了一会儿,直到时钟明显向前移动就足够了。我还有一些集成测试用例证明超时功能有效。

      这三种测试用例(使用时钟的组件单元测试、PosixClock 单元测试和集成测试)一起向我证明了代码是正确的。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-21
      • 2015-01-07
      相关资源
      最近更新 更多