【问题标题】:Automatic Runtime Performance Regression Test in JavaJava 中的自动运行时性能回归测试
【发布时间】:2012-01-19 22:47:35
【问题描述】:

我正在寻找以自动方式检测代码运行时性能变化的方法。这将以与 JUnit 类似的方式运行,但不是测试代码的功能,而是测试速度的突然变化。据我所知,目前没有工具可以自动执行此操作。

所以第一个问题是:有没有可用的工具可以做到这一点?

那么第二个问题是:如果没有可用的工具,我需要自己推出,有哪些问题需要解决?

如果第二个问题是相关的,那么以下是我看到的问题:

  1. 因运行环境而异。
  2. 如何检测变化,因为 Java 中的微基准测试存在很大差异。
  3. 如果 Caliper 收集结果,如何从 caliper 中获取结果,以便以自定义格式保存。缺少 Calibre 的文档。

【问题讨论】:

  • 我看到一个问题:“是否有一个现有的库已经这样做了?”。这是的问题吗?
  • 这是一个问题。如果没有,我需要自己动手,有什么问题需要解决。我会稍微修改一下问题。
  • Caliper 的 一切 都缺乏,对此我深表歉意,并承诺在未来(少数)几个月内会有所改变。

标签: java performance regression-testing caliper


【解决方案1】:

我刚刚遇到http://scalameter.github.io/,它看起来很合适,适用于 scala 和 java。

【讨论】:

    【解决方案2】:

    看看 Caliper CI,我昨天发布了 2.0 版作为 Jenkins 插件。

    【讨论】:

    • 这可能与我要找的很接近。更喜欢几乎没有配置的独立应用程序。我定位的项目不是很大,不需要持续集成测试。
    【解决方案3】:

    我不知道有任何单独的工具可以处理这个问题,但是 JUnit 在 @Test-annotation 中有一个名为 timeout 的可选参数:

    第二个可选参数 timeout 会导致测试失败 花费的时间超过指定的时钟时间(以 毫秒)。以下测试失败:

    @Test(timeout=100) public void infinity() {
       while(true);
    }
    

    因此,您可以编写额外的单元测试来检查某些部分是否“足够快”地工作。当然,您首先需要以某种方式确定特定任务运行的最长时间。

    -

    如果第二个问题是相关的,那么这里是我的问题 见:

    1. 因运行环境而异。

    总会有一些变化,但为了尽量减少它,我会使用 Hudson 或类似的自动化构建和测试服务器来运行测试,所以每次的环境都是相同的(当然,如果运行 Hudson 的服务器还执行所有其他类型的任务,这些其他任务仍然会影响结果)。在决定测试的最大运行时间时,您需要考虑到这一点(留一些“头部空间”,所以如果测试需要比平时多运行 5%,它仍然不会立即失败) .

    1. 如何检测变化,因为 Java 中的微基准测试存在很大差异。

    Java 中的微基准测试很少可靠,我会说使用集成测试(例如处理单个 http 请求或您拥有的任何东西)测试更大的块并测量总时间。如果测试因耗时过长而失败,请通过 profiling 隔离有问题的代码,或者在测试运行期间测量并注销测试各个部分的运行时间,以查看哪个部分花费的时间最多。

    1. 如果 Caliper 收集结果,如何从 caliper 中获取结果,以便以自定义格式保存它们。口径的 缺少文档。

    很遗憾,我对 Caliper 一无所知。

    【讨论】:

    • 如果从文件读取预期时间,junit 超时可能会起作用。仍然是创建和维护所有这些测试的问题。倾向于组合基准/回归测试以避免该问题。我可能会像你建议的那样只测试大量代码以避免过多的误报。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    相关资源
    最近更新 更多