时间单元测试的想法和技巧?

时间:2009-01-27 12:04:11

标签: unit-testing

有没有人进行过时间单元测试?

我甚至不确定这种术语是否被创造出来,但重点是测试操作是否在时间限制内执行。我有一些算法,我想测试他们的执行时间是否按预期增加,我想类似的测试可以用于IO,什么不是,有点像test_timeout或其他东西。

然而,由于硬件会影响执行速度,因此它似乎并不重要。所以我想知道是否有人曾经尝试过这种事情,如果他们愿意分享他们的经验。

由于

编辑:尝试编制在这种情况下需要处理的内容列表

5 个答案:

答案 0 :(得分:7)

从我的经验中得到的一些注释......我们关心许多组件的性能,并且有一个非常类似于测试的框架来锻炼和计时(事后看来,我们应该使用CppUnitboost::test就像我们为单元测试所做的那样)。我们将这些称为“组件基准”而不是单元测试。

  • 我们没有指定时间上限然后通过/失败...我们只记录时间(这部分与客户不愿意实际提供硬性能要求有关,尽管性能是他们关心的事情很多!)。 (我们过去尝试通过/失败并且遇到了糟糕的经历,尤其是在开发人员计算机上......由于电子邮件到达或者后台正在编写某些内容而导致错误警报太多)
  • 致力于优化的开发人员可以在不必构建整个系统的情况下完成相关的基准测试时间(与单元测试非常相似,让您专注于代码库的一点)。
  • 大多数基准测试都会测试几次迭代迭代。懒惰的资源创建意味着组件的首次使用可以具有与之相关的更多“设置时间”。我们注销“第一”,“平均后续”和“平均所有”时间。确保您了解这些之间任何重大差异的原因。在某些情况下,我们明确将设置时间作为个案进行基准测试
  • 应该是显而易见的,但是:只需要实际关注的代码,而不是测试环境设置时间!
  • 对于基准测试,您最终测试“真实”案例比在单元测试中测试更多,因此测试设置和测试运行时间往往比批次更长。
  • 我们有一台自动测试机器每晚运行所有基准测试并发布所有结果的日志。从理论上讲,我们可以对其进行图形化,或者将其标记为低于目标性能的组件。在实践中,我们还没有设置这样的东西。
  • 您确实希望这样的自动测试机器完全没有其他职责(例如,如果它也是您的SVN服务器,那么进行大量结账的人会让您看起来像是一次巨大的性能回归)。
  • 考虑除了时间之外您可能想要进行基准测试的其他标量,并计划从一开始就支持它们。例如,“达到压缩比”,“天网AI IQ”......
  • 不要让人们对子最小规格硬件上的基准数据进行任何分析。我已经看到浪费时间浪费'因为某人的垃圾游戏的基准测试而导致的设计决策因素,当在目标平台上运行 - 一个高端服务器 - 会表明完全不同的东西!

答案 1 :(得分:2)

我所知道的内置到单元测试框架的最接近的事情是在{JUnit 4中添加的timed tests。这可以用来确保算法的性能不会'随着输入大小的增加,t会降低。

答案 2 :(得分:1)

如果要检查时间是否增加,不同机器的硬件应该无关紧要,如果不检查绝对值,而是检查相对变化。或者我在这里遗漏了什么?

答案 3 :(得分:1)

我认为您可以对单元测试运行时数据进行回归检查。通过大量的单元测试框架,您通常可以获得一个名为testname,executiontime的报告。我知道junit / surefire做到了。所以基本上你可以将它与之前的运行进行比较,并确定是否发生了任何重大变化。如果将所有这些保留在数据库中(使用主机名),则可以将同一运行时环境的执行时间与先前的测试运行进行比较。这样你就不会真正编写性能测试 但你只是单独断言执行时间没有重大变化。

答案 4 :(得分:0)

如果你在C ++工作,请查看http://unittest-cpp.sourceforge.net/

我没有使用时间,但它是我发现的最好(最简洁)的单元测试框架。