我在这个问题中使用Java,但这确实适用于所有现代应用程序开发。像许多人一样,我们的“环境管道”看起来像这样:
硬件,可用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;衡量自动化性能测试,因为代码从一个环境升级到下一个环境?
提前致谢!
答案 0 :(得分:1)
我可以在自己的机器上运行相同的测试1000次并且结果大不相同。
实际上,这不太可能。当然会有一些变化,但如果机器没有被其他任务负载很重,那么1000个时间中的大多数将会非常接近。
获得一些有意义且稳定的数字的一种方法是多次运行测试,然后查看某些percentiles时间(例如中位数,第90百分位数,第99位等)
如果测试单元小于单个JVM调用(例如,您正在测试单个方法或一组相关方法),则会出现其他复杂情况。如果是这种情况,我强烈建议阅读 How do I write a correct micro-benchmark in Java?
答案 1 :(得分:1)
可能您只想在更严格控制的给定位置运行性能测试。您不一定需要在所有环境中运行它们,这没什么好处。您应该在最接近模仿生产配置的环境中运行它们(这是您真正关心的,对吧?)。
另外,请确保您在性能限制方面给自己合理的开销。不要将它们锁定在服务器现在的上方。选择一些合理的阈值来说明当前运行中的某些变化。
长期以来,我发现更有用的是性能数字随时间变化的图表。不是硬限制。这样,我们可以随着时间的推移观察各种功能的趋势,并在趋势过高时对其进行攻击。