Java中自动运行时性能回归测试

4
我正在寻找以自动化方式检测代码运行时性能变化的方法,类似于JUnit测试代码功能,但它会测试速度的突然变化。据我所知,目前没有工具可以自动完成这项任务。
因此,第一个问题是:是否有可用的工具来完成这项任务? 接下来是第二个问题:如果没有可用的工具,并且需要自己开发,那么需要解决哪些问题? 如果第二个问题相关,则以下是我看到的问题:
  1. 因环境而异的变量。
  2. 如何检测变化,因为Java中的微基准测试具有较大的方差。
  3. 如果Caliper收集结果,如何将结果从Caliper中取出,以便可以将其保存在自定义格式中。 Caliber的文档不足。

我看到一个问题:“是否已经存在一个可以完成这个任务的库?”。那就是“那个”问题吗? - The Nail
那是一个问题。如果没有现成的解决方案,我需要自己开发,有哪些问题需要解决?我会稍微修改一下这个问题。 - lessthanoptimal
1
Caliper的“一切”都缺乏,我为此道歉,并承诺在未来的几个月内会有所改变。 - Kevin Bourrillion
3个回答

4

2

请看Caliper CI,我昨天发布了2.0版本的Jenkins插件。


这可能接近我所寻找的东西。希望有一个几乎不需要配置的独立应用程序。我所针对的项目规模不是很大,也不需要持续集成测试。 - lessthanoptimal

0

我不知道任何单独的工具来处理这个问题,但是JUnit在@Test注释中有一个可选参数叫做timeout

第二个可选参数timeout会导致测试失败,如果它需要比指定的时钟时间(以毫秒为单位)更长的时间。下面的测试将失败:

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

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

-

如果第二个问题相关的话,那么我看到以下问题: 1. 运行环境不同会导致变异性。
虽然总会存在一些变异性,但为了将其最小化,我建议使用Hudson或类似的自动构建和测试服务器来运行测试,这样每次环境都是相同的(当然,如果运行Hudson的服务器还执行其他任务,这些任务可能仍会影响结果)。在确定测试的最长运行时间时,需要考虑到这一点(留出一些“余地”,这样如果测试运行时间比通常多5%,它仍不会立即失败)。
如何检测Java中的微基准测试的变化?
Java中的微基准测试很少可靠,我建议使用集成测试来测试更大的代码块(例如处理单个HTTP请求或其他操作),并测量总时间。如果测试因为花费太多时间而失败,可以通过分析进行隔离有问题的代码,或者在测试运行期间测量和记录各个部分的运行时间,以查看哪个部分占用了最长的时间。
如果Caliper收集了结果,如何将结果从Caliper中提取出来,以便可以保存在自定义格式中。Caliper的文档不够详细。
很抱歉,我对Caliper一无所知。

如果从文件中读取预期时间,则Junit超时可能有效。但仍需解决创建和维护所有这些测试的问题。我倾向于采用组合基准/回归测试来避免这个问题。我可能会被限制只能像你建议的那样将大块代码一起测试,以避免过多的误报。 - lessthanoptimal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接