如何模拟时间的流逝来调试程序?
How to simulate the passage of time to debug a program?
我正在编写一个 C++ 程序,可以在 运行 时跟踪日期,保留记录。我想测试和调试此记录保存功能,但记录本身可能会跨越数年;让时间自然流逝,暴露 bug 需要……一段时间。
有没有一种模拟时间流逝的既定方法,让我更容易调试这个程序?我正在使用 C 的 ctime
库来获取日期。
如果您希望系统可测试,您将希望能够替换整个时间引擎。
有多种方法可以替换时间引擎。
最简单的方法是创建一个新的时间引擎单例来复制您正在使用的时间引擎 API(在您的情况下,ctime
)。
然后清除 每次使用基于 ctime
的 API 并将它们重定向到您的新时间引擎。
这个新的时间引擎可以配置为使用 ctime
或其他东西。
为了更可靠,您甚至需要更改与旧 API 交互的任何数据结构的二进制布局和类型,审核您转换内容的每个案例 to/from void pointers 或 reinterpret cast them 等
另一种方法是依赖注入,在这种方法中,您不使用单例,而是将 time-engine 作为参数传递给您的程序。您的程序中需要访问时间的每个部分现在要么存储指向时间引擎的指针,要么将其作为函数参数。
现在您已经可以控制时间,您可以安排时间流逝得更快、跳来跳去等。根据您的系统,您可能希望或多或少地了解时间流逝的真实情况,并且它可能会暴露出不同的真实情况而不是真正的错误。
即使在您执行了 所有 之后,您仍不能确定您的程序没有时间错误。您可能会以意想不到的方式与 OS 时间互动。但是你至少可以解决其中的一些问题。
我正在编写一个 C++ 程序,可以在 运行 时跟踪日期,保留记录。我想测试和调试此记录保存功能,但记录本身可能会跨越数年;让时间自然流逝,暴露 bug 需要……一段时间。
有没有一种模拟时间流逝的既定方法,让我更容易调试这个程序?我正在使用 C 的 ctime
库来获取日期。
如果您希望系统可测试,您将希望能够替换整个时间引擎。
有多种方法可以替换时间引擎。
最简单的方法是创建一个新的时间引擎单例来复制您正在使用的时间引擎 API(在您的情况下,ctime
)。
然后清除 每次使用基于 ctime
的 API 并将它们重定向到您的新时间引擎。
这个新的时间引擎可以配置为使用 ctime
或其他东西。
为了更可靠,您甚至需要更改与旧 API 交互的任何数据结构的二进制布局和类型,审核您转换内容的每个案例 to/from void pointers 或 reinterpret cast them 等
另一种方法是依赖注入,在这种方法中,您不使用单例,而是将 time-engine 作为参数传递给您的程序。您的程序中需要访问时间的每个部分现在要么存储指向时间引擎的指针,要么将其作为函数参数。
现在您已经可以控制时间,您可以安排时间流逝得更快、跳来跳去等。根据您的系统,您可能希望或多或少地了解时间流逝的真实情况,并且它可能会暴露出不同的真实情况而不是真正的错误。
即使在您执行了 所有 之后,您仍不能确定您的程序没有时间错误。您可能会以意想不到的方式与 OS 时间互动。但是你至少可以解决其中的一些问题。