假设我的代码库已经达到了尽可能高的单元测试覆盖率(超过一定程度,增加覆盖率就没有很好的投资回报率),接下来我想要测试性能。为了基准测试代码,以确保新提交不会毫无必要地减慢速度,我对 Safari 的零容忍政策感到非常着迷。我不确定大多数项目对速度的承诺是否具有良好的投资回报率,但我至少希望收到警报,以便能够对此进行判断。环境是 Linux 上的 Python,并且建议也适用于 BASH 脚本,这将使我非常高兴。(但 Python 是主要关注点。)
虽然我同意在系统级别测试性能最终更为相关,但如果您想要进行Python的UnitTest风格的负载测试,FunkLoad http://funkload.nuxeo.org/ 正好可以做到这一点。
当您试图加快代码库中特定操作时,微基准测试有其用武之地。完成后续性能单元测试是一种有用的方式,以确保您刚优化的此操作不会在未来提交时无意中降低性能。
MarkR说得对...进行真实世界的性能测试是关键,而在单元测试中可能有些棘手。话虽如此,请看看标准库中的cProfile
模块。它至少对于给出提交到提交之间事物运行速度的相对感觉是有用的,而且您可以在单元测试内运行它,尽管当然你会得到包括单元测试框架本身开销的详细结果。
总之,如果您的目标是零容忍,那么您需要比这更强大的东西...在单元测试中使用cProfile完全不够,并且可能会造成误导。
在进行性能测试时,我通常会准备一组数据输入作为测试套件,并测量程序处理每个输入所需的时间。
你可以按日或按周记录性能,但我认为在所有功能实现之前担心性能并不特别有用。
如果性能太差,那么我会使用 cProfile 进行分析,使用相同的数据输入运行它,并尝试确定瓶颈所在。
time.clock()
测量时间,然后使用self.assertLess(elapsed, some_value)
- 在空间(具有不同规格的机器)和时间(摩尔定律)上不可移植,但这是一个开始。 - Tomasz Gandor