对基于计时器的应用程序进行单元测试?

Posted

技术标签:

【中文标题】对基于计时器的应用程序进行单元测试?【英文标题】:Unit testing a timer based application? 【发布时间】:2010-09-05 22:30:37 【问题描述】:

我目前正在用 C# 编写一个简单的基于计时器的迷你应用程序,它每 k 秒执行 n 次操作。 我正在尝试采用测试驱动的开发风格,所以我的目标是对应用程序的所有部分进行单元测试。

所以,我的问题是:有没有一种对基于计时器的类进行单元测试的好方法?

在我看来,问题在于存在很大的风险,即测试执行的时间会非常长,因为它们必须等待很长时间才能发生所需的操作。 尤其是如果想要真实的数据(秒),而不是使用框架允许的最小时间分辨率(1 毫秒?)。 我正在为动作使用模拟对象,以记录动作被调用的次数,这样动作几乎不需要时间。

【问题讨论】:

【参考方案1】:

我所做的是模拟计时器以及当前系统时间,以便我的事件可以立即触发,但就被测代码而言,经过的时间是秒。

【讨论】:

【参考方案2】:

Len Holgate 有一系列20 articles on testing timer based code。

【讨论】:

【参考方案3】:

我认为在这种情况下我要做的是测试计时器滴答时实际执行的代码,而不是整个序列。您真正需要决定的是是否值得您测试应用程序的实际行为(例如,如果每个滴答从一个滴答到另一个滴答发生剧烈变化之后会发生什么),或者是否足够(也就是说, 每次动作都是一样的) 来测试你的逻辑。

由于定时器的行为保证永远不会改变,它要么正常工作(即,你配置正确)要么不正常;如果您实际上不需要,将其包含在您的测试中似乎是浪费精力。

【讨论】:

我看到你的方法的唯一问题是你可能不得不揭露每次民意调查发生时发生的事情,这是个好主意吗?即暴露一些你不必仅仅为了测试的东西。替代方案可能是内部(和 InternalsVisibleTo),但很多人也不喜欢它【参考方案4】:

我同意 Danny 的观点,因为从单元测试的角度来看,简单地忘记计时器机制并验证操作本身是否按预期工作可能是有意义的。我还要说我不同意,将计时器的配置包含在某种自动化测试套件中是浪费精力。在使用计时应用程序时有很多边缘情况,并且通过只测试易于测试的东西很容易产生错误的安全感。

我建议使用一套测试来运行计时器以及实际操作。该套件可能需要一段时间才能运行,并且可能不会一直在您的本地计算机上运行。但是在夜间自动构建中设置这些类型的东西可以真正帮助在错误变得难以找到和修复之前根除错误。

因此,简而言之,我对您的问题的回答是不要担心编写一些需要很长时间才能运行的测试。尽可能进行单元测试,让测试套件快速且频繁地运行,但请确保使用运行频率较低但涵盖更多应用程序及其配置的集成测试来补充这一点。

【讨论】:

以上是关于对基于计时器的应用程序进行单元测试?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Completable.timer 对 RxJava 进行单元测试

如何对包含Task.Delay的代码进行单元测试?

如何在 Jasmine 单元测试中使用 Sinon 对 jQuery 动画进行假时间?

单元和功能测试基于 PySide 的应用程序?

如何在C#中对单元测试性能优化进行单元测试?

使用 jasmine 对控制器中基于资源的工厂进行角度 js 单元测试