在Python中自动测试性能的适当方法(适用于所有开发人员)?

时间:2011-04-01 07:29:49

标签: python performance automated-tests

我们的Python应用程序(一个很酷的Web服务)有一整套测试(单元测试,集成测试等),所有开发人员必须在提交代码之前运行它们。
我想在套件中添加一些性能测试,以确保没有人添加使我们运行得太慢的代码(对于一些相当随意的慢速定义)。
显然,我可以在测试中收集一些功能,计算时间并与某个预定义的阈值进行比较。

棘手的要求:

  1. 我希望每个开发人员都能够在他的机器上测试代码(因CPU功率,操作系统(!Linux和某些Windows)和外部配置而异) - Python版本,库和模块是相同的)。测试服务器虽然通常是一个好主意,但却无法解决这个问题。
  2. 我希望测试 DETERMINISTIC - 无论运行测试的机器上发生了什么,我都希望多次运行测试以返回相同的结果。
  3. 我的初步想法:

    • 每次运行测试时都使用timeit并对系统进行基准测试。将性能测试结果与基准进行比较。
    • 使用cProfile检测解释器以忽略“外部噪音”。我不确定我是否知道如何阅读pstats结构,但我确信它是可行的。

    其他想法?

    谢谢!

    塔尔。

2 个答案:

答案 0 :(得分:5)

查看funkload - 这是一种将单元测试作为功能测试或负载测试来衡量网站运行情况的方法。

另一个可以与funkload一起使用的有趣项目是codespeed。这是一个内部仪表板,可以测量您对代码进行的每次提交的代码库的“速度”,并随时间呈现趋势图。这假设您可以运行许多自动基准测试 - 但它可能是一种有用的方法来获得性能随时间变化的权威帐户。到目前为止,我见过的最好的代码速度是speed.pypy.org网站。

至于你对决定论的要求 - 也许最好的方法是利用统计数据来获得优势?自动运行测试N次,产生所有运行的最小值,最大值,平均值和标准差?查看此article on benchmarking以获取有关此内容的一些指示。

答案 1 :(得分:2)

  

我希望测试是DETERMINISTIC - 无论运行测试的机器上发生了什么,我都希望多次运行测试以返回相同的结果。

失败。根据定义,或多或少在具有多个用户的多处理系统中完全不可能。

重新考虑此要求或找到一个新环境来运行不涉及任何现代多处理操作系统的测试。

此外,您运行的Web应用程序不具有确定性,因此强制执行某种“确定性”性能测试并没有多大帮助。

当我们进行时间关键处理(在雷达中,“实时”实际上意味着真实时间)时,我们没有尝试确定性测试。我们进行了代码检查,并进行了简单的性能测试,包括简单的平均值和最大值。

  

使用cProfile检测解释器以忽略“外部噪音”。我不确定我是否知道如何阅读pstats结构,但我确信它是可行的。

分析器创建的Stats对象就是您要找的对象。

http://docs.python.org/library/profile.html#the-stats-class

关注配置文件统计信息中的'pcalls',原始呼叫计数,您将拥有近似确定性的内容。