有没有合理的方法可以加快(或假冒)单位测试的时间流逝?例如,如果您想在线程中测试信令,或者某些代码正确处理长时间运行的代码中的日/月/年日期更改?
我知道你可以在单独的测试中查看日/年变化等事情,但是进入集成测试,能够在没有等待一周的情况下运行稳定的一周的时间可能会很好...如果你每小时都有事情发生然后能够在一些快进机制中推动它。
答案 0 :(得分:1)
正如@Nkosi和@mike在评论中提到的那样,你应该抽象接口后面的日期/时间API,这样测试就可以控制CUT看到的当前日期/时间。 Thread.Sleep也是如此。这在单元测试中非常简单,特别是如果你正在进行TDD。
对于集成测试或系统测试,这可能更具挑战性。在大多数情况下,这可以以类似的方式解决,但CUT应该使用某种依赖注入机制。
我曾经是一个相当大的项目的自动化TL,我们有这个需要。幸运的是,由于大多数代码已经被单元测试所覆盖,因此大多数必须引用日期/时间的代码已经使用接口进行了抽象。此外,系统在设计时考虑了可扩展性,并使用了DI机制。因此,可以注册一个DLL,其中包含可以模拟时移的必要接口的实现。
当然,测试和DLL之间必须有一些通信机制,因为DLL被加载到应用程序的进程,这与测试的不同。
我们很快意识到的一件事是,即使在测试清理时你也不应该及时返回,因为应用程序在现实世界中永远不会遇到这种情况。只有在将整个环境恢复到已知状态时,才应将时间重置为当前时间。
还有一个警告:如果应用程序与依赖于日期/时间的外部系统(甚至是数据库!)进行交互,那么这可能对你不起作用,除非你完全抽象出外部系统,这在有些情况下会失去集成测试的所有好处。