跨环境准确测量性能测试

时间:2012-02-02 16:58:55

标签: java performance environment automated-tests

我在这个问题中使用Java,但这确实适用于所有现代应用程序开发。像许多人一样,我们的“环境管道”看起来像这样:

  • 开发者沙箱
  • 持续整合&测试
  • QA /分段
  • 生产

硬件,可用RAM&每个环境中的CPU都不同:我的笔记本电脑是2GB双核Windows机器。测试在4GB机器上运行。生产是两个(负载均衡)8GB四核服务器。

显然,当在不同的机器(环境)上运行时,相同的代码将以不同的方式执行。

我正在考虑为我的一些类编写自动化性能测试:

private static final long MAX_TIME = 8000;

@Test
public final void perfTestSomething() {
    long start = System.currentTimeInMillis();

    // Run the test

    long end = System.currentTimeInMillis();

    assertTrue((end - start) < MAX_TIME);
}

因此,如果测试运行时间超过8秒,自动性能测试将失败。

但后来我意识到这一点:代码将在不同的环境中运行不同,并且将根据JVM和GC的状态以不同的方式运行。我可以在自己的机器上运行相同的测试1000次,结果大不相同。

所以我问:一个人如何准确/可靠地定义&amp;衡量自动化性能测试,因为代码从一个环境升级到下一个环境?

提前致谢!

2 个答案:

答案 0 :(得分:1)

  

我可以在自己的机器上运行相同的测试1000次并且结果大不相同。

实际上,这不太可能。当然会有一些变化,但如果机器没有被其他任务负载很重,那么1000个时间中的大多数将会非常接近。

获得一些有意义且稳定的数字的一种方法是多次运行测试,然后查看某些percentiles时间(例如中位数,第90百分位数,第99位等)

如果测试单元小于单个JVM调用(例如,您正在测试单个方法或一组相关方法),则会出现其他复杂情况。如果是这种情况,我强烈建议阅读 How do I write a correct micro-benchmark in Java?

答案 1 :(得分:1)

可能您只想在更严格控制的给定位置运行性能测试。您不一定需要在所有环境中运行它们,这没什么好处。您应该在最接近模仿生产配置的环境中运行它们(这是您真正关心的,对吧?)。

另外,请确保您在性能限制方面给自己合理的开销。不要将它们锁定在服务器现在的上方。选择一些合理的阈值来说明当前运行中的某些变化。

长期以来,我发现更有用的是性能数字随时间变化的图表。不是硬限制。这样,我们可以随着时间的推移观察各种功能的趋势,并在趋势过高时对其进行攻击。