如何在Python中进行“基于性能”(基准)的unit testing

假设我已经获得了我的代码基础,使得unit testing覆盖率达到了很高的程度。 (超出某一特定时期,覆盖范围越来越大,投资回报率就越低。)

接下来我要testing性能。 要对代码进行基准testing,以确保新的提交不会不必要地减慢速度。 我对Safari对零售承诺放缓的零容忍政策非常感兴趣。 我不确定对于速度的承诺水平对于大多数项目来说都具有很好的投资回报率,但是我至less希望得到一个提示:速度回归已经发生,并且能够对此做出判断。

环境是Linux上的Python,一个对BASH脚本也可行的build议会让我很开心。 (但是Python是主要的焦点。)

Solutions Collecting From Web of "如何在Python中进行“基于性能”(基准)的unit testing"

如果可能的话,您将希望在系统级进行性能测试 – 在上下文中测试整个应用程序,使数据和行为尽可能靠近生产使用。

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

而且,不能使用虚拟机进行性能测试(除非您的生产环境在虚拟机中运行,即使如此,您也需要在主机上运行虚拟机)。

当你说性能单元测试的时候,这可能是有价值的,但只有当它被用于诊断系统级别(而不仅仅是开发人员的头)真正存在的问题的时候。

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

虽然我同意系统级别的测试性能最终更加相关,但是如果您想为Python进行UnitTest风格的加载测试,FunkLoad http://funkload.nuxeo.org/就是这么做的。

当你试图在代码库中加速一个特定的动作的时候,微型基准测试就有了它的位置。 获得后续的性能单元测试是一种有用的方法,可以确保您刚才优化的这个操作在未来的提交时不会无意中退化。

MarkR是正确的……做现实世界中的性能测试是关键,在单元测试中可能有些微妙。 话虽如此,看看标准库中的cProfile模块。 它至少对于从承诺提交事物运行速度的相对意义上是有用的,并且你可以在单元测试中运行它,当然你会得到结果的详细信息,包括开销的单元测试框架本身。

总而言之,如果你的目标是零容忍,你需要比这更强大的东西……单元测试中的cProfile根本不会削减它,并且可能会引起误解。

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

您可以每天或每周记录一次性能,但是在实现所有功能之前,不要担心性能问题。

如果性能太差,那么我打出cProfile ,用相同的数据输入运行它,然后尝试看看瓶颈在哪里。