2012-02-02 76 views
2

我在这个问题中使用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次,结果大不相同。

那么请问:如何做一个准确/可靠的定义&仪表自动化性能测试,代码从一个环境提升到下一个?

在此先感谢!

回答

1

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

此外,还要确保你给自己的表现限制合理开销。不要将它们锁定在服务器现在的状态之上。选择一些合理的阈值来解释当前运行中的一些变化。

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

1

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

其实,这是不可能的。当然会有一些变化,但是如果机器没有被其他任务重载,那么1000个时机中的大部分将非常接近。

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

有出现的,如果你的测试单位比JVM(比如说,你正在测试一个方法或一组相关的方法)的一次调用较小额外的复杂性。如果是这种情况,我强烈建议您阅读 How do I write a correct micro-benchmark in Java?

+0

优秀的建议 - 谢谢艾克斯,我upvoted你的答案,但不得不给绿色检查rfreak,因为它只是一个* teeny *位更适用于我的情况。不过谢谢你。 – IAmYourFaja 2012-02-02 22:00:54