测试设计:我如何模拟时间的流逝来测试对未来计划事件的检测和响应


Test Design: How do I simulate the passage of time to test the detection of and response to events scheduled in the future?

我正在开发一个基于web的租赁管理应用程序,该应用程序需要能够在任何给定时间根据数据库中的信息每天生成各种报告、提醒和警报。此类报告、提醒和警报的一些示例包括:

  • 发送一封事务性电子邮件,让一组用户知道他们的下一张发票将在15天后到期
  • 发送事务性电子邮件,让一组用户知道他们有1张或多张过期发票
  • 提醒物业经理某处特定物业已逾期X天,并提供打印一套驱逐文件
  • 等等

似乎最简单的方法是定义一组脚本,这些脚本每天早上通过一组cron作业执行。每个脚本都会检查触发系统特定响应所需的标准。例如,我可能有一组脚本,如SendInvoiceDueIn15DaysEmail.php、SendInvoicePastDue30DaysEmal.php等。

我的主要问题是,在一个充满测试数据的数据库中,模拟时间流逝(比如90天)的最佳方式是什么,以确保数据每天都能触发正确的响应?我的一些日常任务需要与第三方API交互,如Mandrill、Mail Chimp、一些行业特定的会计软件包等。

我的第二个问题是,如果有人有开发应用程序的经验,这些应用程序围绕着未来发生的定期、重复的事件,我在这方面走对了吗?我已经构建了大部分核心系统(用户管理、物业管理、租赁管理),现在是时候测试自动化方面了。

值得一提的是,应用程序的核心是使用Laravel 4,但我不认为这是一个严格意义上的PHP问题。

TL;DR我如何模拟时间的流逝,以检查系统在90天内是否正确检测到一组事件并触发成功完成的适当响应

我认为这里的答案与您想要测试的其他所有东西中的答案相同——Clock mock。抽象你检查现在几点的方式。然后,您可以创建一个模拟时钟实现,它可以在测试期间更快地工作(或报告您想要的任何内容),另一个实现只需返回生产中的真实时间。

通过这种方式,您还可以测试其他场景,如服务器上的时间更改或夏令时。