Unit testing 使用系统时钟的程序的测试用例

Unit testing 使用系统时钟的程序的测试用例,unit-testing,testing,Unit Testing,Testing,我最近有一个inteview,inteviewer问我这个问题。 假设我们有一个依赖于系统时钟的程序。您将如何测试此程序或编写测试用例 我的回答如下 让程序提供API来设置设置程序需要花费的时间,而不是系统时间 然后他问我如何测试生产问题 有人能在这个问题上强调一下吗 谢谢。Rick不确定“生产问题”是什么意思,但我会创建一个时钟API存根。在测试期间,我会指定系统使用我可以控制的假时钟API。在生产过程中,系统将默认为“正常”时钟API。您可以通过使用名为的技术来指定要使用的API 有很多工具

我最近有一个inteview,inteviewer问我这个问题。 假设我们有一个依赖于系统时钟的程序。您将如何测试此程序或编写测试用例

我的回答如下

  • 让程序提供API来设置设置程序需要花费的时间,而不是系统时间
  • 然后他问我如何测试生产问题

    有人能在这个问题上强调一下吗

    谢谢。Rick不确定“生产问题”是什么意思,但我会创建一个时钟API存根。在测试期间,我会指定系统使用我可以控制的假时钟API。在生产过程中,系统将默认为“正常”时钟API。您可以通过使用名为的技术来指定要使用的API


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

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

    基本上,你需要测试两类东西。在程序应该运行的情况下,是吗?(例如,如果假定它能够容忍向后的时钟跳变而不发生故障,那么如果出现向后的时钟跳变会发生什么情况?)在假定程序失败的情况下,它是否按照预期的方式失败?(如果它应该拒绝验证时钟是否离得太远,它实际上会这样做吗?)

    一个问题是如何给它错误的时钟信息。一种方法是您建议的方法——添加一个调用以拦截程序的“获取当前时间”函数,并为其指定不同的时间。这种方法的缺点是,程序可能会在其代码深处的某个地方,以其他方式获得时间,而您无法钩住它

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


    另一种方法是在测试线束中实际设置系统时钟错误。

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

    实际代码使用一个
    PosixClock
    派生类,该类委托给系统时钟。那么我是如何测试的呢?我所需要做的就是证明
    PosixClock
    确实使用了系统时钟。一个单元测试读取
    PosixClock
    ,休眠一小段时间直到时钟明显向前移动就足够了。另外,我还有几个集成测试用例来证明超时功能是有效的


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

    您所说的“生产问题”是什么意思。您可以使用类似的技术来测试难以进行单元测试的O/S函数的其他用途。看见