Load testing(负载测试),通过测试系统在资源超负荷情况下的表现,以发现设计上的错误或验证系统的负载能力。在这种测试中,将使测试对象承担不同的工作量,以评测和评估测试对象在不同工作量条件下的性能行为,以及持续正常运行的能力。负载测试的目标是确定并确保系统在超出最大预期工作量的情况下仍能正常运行。此外,负载测试还要评估性能特征,例如,响应时间、事务处理速率和其他与时间相关的方面。
Stelligent公司CTO Paul Duvall在“人性自动化(Automation for the people)”系列文章中提到,如何把JMeter和Ant跟持续集成服务器集成到一起,让开发者快速地决断开发的系统在特定负载条件下的行为是否正确,及其是否适应所做的修改。Duvall首先列举了一些这类测试所能度量的标准:
有多少并发用户能够访问你的软件系统?
可以加载多少数据而不会导致性能下降?
系统的吞吐量需求是怎样的?
这些需求的测试周期有多久?
如果你能确定并验证每天至少满足一次负载和性能的需求,那会怎样?
Duvall补充道,CI(持续集成)服务器计划执行的自动化测试每天可以在机器利用率较低的时候运行,同时,这也可以“减少当你依赖个人来配置和运行这些测试时所导致的瓶颈和错误”。他描述了建立这样一个环境所需的主要步骤有:
1. 运行JMeter并创建一个测试计划。
JMeter是Apache项目,是用来负载功能测试和性能测试的Java工具。它同时提供GUI和命令行两种调用方式,可以执行由测试计划定义的各种负载测试。它附带的测试计划范例包括Web测试计划,FTP测试计划,Web service测试计划等等。这些测试计划可以通过GUI接口搭建,最后以XML格式的保存。这样一来,它将所需配置的值进行参数化,用户因此可以定制运行测试的方式。
2. 使用Ant驱动JMeter测试。
在已经写好的实现的基础上,定义一个JMeter的Ant任务,比如"<taskdef name="jmeter" classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask"/>",然后从Ant运行JMeter的负载测试。Duvall提供了一个在BreweryTestPlan.jmx文件(测试计划的XML格式)中定义的测试搭建示例:
<jmeter
jmeterhome="${jmeter.home}"
resultlog="${basedir}/target/JMeterResults.xml">
<testplans includes="BreweryTestPlan.jmx" dir="${basedir}/tests/load">
</testplans>
</jmeter>
3. 通过XSLT和HTML修饰测试结果报告。
Duvall接着演示了测试的输出结果——JMeterResults.xml——它可以通过JMeter的extras目录中提供的XSLT脚本将该结果转换成HTML报告。生成的报告上显示了每次负载测试运行的结果,包括测试状态、时间、集合状态以及所有测试花费的时间。
4. 定制JMeter测试。
运行测试的方式可以通过修改参数和属性来进行定制。为了让测试适应特定环境的需求
(比如测试或者分段),用户可以在.jmx文件中标记一些记号,然后在运行该测试之前,根据环境需要对这些记号进行过滤和修改。Duvall还演示了如何增加JVM内存并指定线程和循环的数目。
5. 在CI环境中集成JMeter测试。
Duvall提供了一个与持续集成服务器CruiseControl集成的例子:在每天上午11点时运行build:
...<modificationset>
<svn repositorylocation="${svnrepo.location}">
<timebuild time="2300"/>
...
</svn>
</modificationset>
如果在CruiseControl的config.xml文件中添加几行适当的代码,JMeter的测试结果报告就可以在CruiseContrl项目的dashboard中看到。
Krik Pepperdine在InfoQ上的文章迭代、自动化和持续性能(Iterative, Automated and Continuous Performance)中谈及了持续性能[测试](Continuous Performance),Steve Haines的持续性能管理(continuous performance management presentation,可下载ppt)中也涉及到了这个话题。