在单元测试中使用经过的时间作为断言

时间:2012-08-30 05:49:29

标签: python unit-testing pytest

我正面临一种情况,我想确保如果一个方法被修改,它运行的时间不会超过X毫秒(基本上如果该功能较慢,它会减慢我们网页上的搜索结果,这对销售产生了不良影响。)

我们有单元测试(特别是代码在python下完成,我们使用py.test),第一个想法是断言如果函数没有在小于X ms内执行,那么将测试标记为失败(或提出警告)。

然而,这感觉很危险(例如,并非所有计算机都具有相同的速度),而且我也不确定这是单元测试的工作。

有人遇到类似的情况吗?对我而言,速度是一项功能,我希望确保随着代码的发展,此类功能在将来不会丢失。

如果单位测试不是答案,您会推荐哪些其他选择?

由于

2 个答案:

答案 0 :(得分:5)

您可以考虑使用pytest-timeout plugin作为开始。它目前只允许指定秒数(作为浮点数)。但是它可以扩展到更适应性的时序(如pystone数字),因此可以测量计算机执行可以缓存的pystone基准测试的速度,然后指定测试的“pystones”数量被允许带走。

答案 1 :(得分:2)

如果您有一个专用的构建/测试服务器,或者开发人员之间大致相同的硬件,那么以ms为单位的时间限制就没问题了。重复性是关键 - 您可以编写一些东西,允许开发人员在他们的机器上进行“基线”测试运行,然后将后续结果进行比较。

可用的pyunitperf模块具有时间限制和负载测试功能。它已经很长时间没有更新(2009年),但如果你打算自己动手,它将是一个很好的起点。

请记住,ms中的测试时间本身并不能告诉你任何事情 - 但只要你只是用这个来比较修订版本的性能,它应该没问题。