单元测试中的测试性能

时间:2018-11-16 00:54:22

标签: python performance pycharm workflow python-unittest

我有专门的字符串处理方法,并且需要测试,以便可以轻松检查它是否正常工作。

我已经使用unittest编写了几项测试,以确保结果的正确性,并对结果感到满意。我的工作流程是在PyCharm中使用命令“在[文件夹]中运行单元测试”,然后将结果导出到HTML。

我使用的算法有点复杂,因此我想确保我不会无意间使它效率低下。所以我也想要一个可以检查这一点的测试。但是,测试通常应该得到客观的通过/失败结果-因此我不确定如何实施性能检查。

我找到了一个简单的基准:我看到函数处理字符串要花费多长时间,并将其与string.split()花费多长时间进行比较。当然,这两种方法都太快了,所以我运行了数千次。由于这两种都是字符串处理方法,因此我认为比较是合理的。然后,我创建了一个测试方法,该方法将方法的运行时间与split的运行时间之比,并检查是否不超过1000。“在库函数的3个数量级内”看起来像是“对我来说足够接近”,所以我现在可以正常工作了。

但是,很高兴知道实际比率是多少。例如,如果我重写该方法以修复错误,但运行起来的速度却慢了两倍,这是我感兴趣的事情(即使它仍然满足“ 3个数量级”的要求)。我想要的是HTML测试报告,其中显示了实际的测量结果以及通过/未通过的情况,以便我可以手动检查它并确定是否需要进一步关注(即使它通过了)。 HTML报告已经显示了给定测试运行了多长时间,但这不仅包括我的功能的运行时间,还包括基准功能以及与我所测量的内容无关的各种设置/拆卸(功能运行的速度)通过字符串)。

那么,如何在HTML测试报告中包含任意度量?

  • 我知道我可以编写一个脚本来运行和计时,但是我看不到如何使它适合我的一键测试设置(嗯,实际上是2点击-一个用于运行测试,另一个用于导出)结果转换为HTML)。
  • 我知道衡量性能的方法是分析代码,但是我没有找到与我的工作流程兼容的分析器。我希望性能测试作为测试电池的一部分进行,而不是需要我采取额外措施的事情。

1 个答案:

答案 0 :(得分:0)

这可能有点晚了,但是为了完整起见...

您可以做的一件简单的事情就是使用timeit python模块,并在测试中使用它来评估性能。然后,您可以使用timeit返回的值并添加类似于

的行

self.assertLess(timer_value, performance_threshold)

您可以让性能阈值也是从执行string.split(" ")的一组给定字符串中计算出的计时器值,您可以以便宜的方式在单元测试中即时计算或对其进行计算如果您的测试不会随时间变化很大,请提前并保存时间值。如果您的计算花费太长时间,则会导致测试失败,因为该计时器值将大于您设置的阈值。

我不知道unittest模块中的任何计时功能,但是您已经可以使用timetimeit模块做很多事情。 This guy对此起到了一点作用,因此也许您可以阅读。

希望有帮助,