如何在Python中进行“基于性能的”(基准)单元测试

时间:2009-03-22 19:36:55

标签: python linux unit-testing benchmarking

让我们说我的代码基础与单位测试覆盖率一样高。 (超过某一点,增加覆盖率并没有很好的投资回报率。)

接下来我想测试一下性能。对代码进行基准测试以确保新提交不会不必要地降低速度。我对Safari的zero tolerance policy非常感兴趣,因为提交速度减慢了。对于大多数项目,我不确定速度承诺水平是否具有良好的投资回报率,但我至少想知道速度回归已经发生,并能够对此做出判断。

环境是Linux上的Python,并且对BASH脚本也可行的建议会让我非常高兴。 (但Python是主要焦点。)

4 个答案:

答案 0 :(得分:7)

如果可能,您将希望在系统级别进行性能测试 - 在整个环境中测试您的应用程序,数据和行为尽可能接近生产使用。

这并不容易,自动化并获得一致的结果会更加困难。

此外,您不能使用VM进行性能测试(除非您的生产环境在VM中运行,即使这样,您也需要在没有其他任何内容的主机上运行VM。)

当你说进行性能单元测试时,这可能很有价值,但前提是它被用于诊断系统级别(不仅仅是开发人员的头脑)中存在的问题。

此外,单元测试中单元的性能有时无法反映其在上下文中的性能,因此它可能根本没用。

答案 1 :(得分:5)

虽然我同意在系统级别测试性能最终更具相关性,但如果您想对Python进行UnitTest样式负载测试,FunkLoad http://funkload.nuxeo.org/就是这样做的。

当您尝试加速代码库中的特定操作时,微基准测试就会占有一席之地。完成后续性能单元测试是一种有用的方法,可确保您刚刚优化的此操作在未来提交时不会无意中降低性能。

答案 2 :(得分:2)

MarkR是对的...进行真实世界的性能测试是关键,在单元测试中可能有点眩晕。话虽如此,请查看标准库中的cProfile模块。它至少对于通过提交到提交事物运行速度提供相关意义非常有用,并且您可以在单元测试中运行它,当然您将获得包含开销的详细信息的结果单元测试框架本身。

总而言之,如果你的目标是零容忍,那么你需要比这更强大的东西... c单元测试中的配置文件根本不会削减它,并且可能会产生误导。

答案 3 :(得分:2)

当我进行性能测试时,我通常会有一组测试数据输入,并测量程序处理每个输入所需的时间。

您可以每天或每周记录一次性能,但在实现所有功能之前,我认为不担心性能特别有用。

如果性能太差,那么我会突破cProfile,使用相同的数据输入运行它,并尝试查看瓶颈所在。