使用Apache Jmeter进行并发压力测试

http://blog.jassassin.com/2014/04/17/tools/jmeter/

引文

最近工作需要通过Apache Jmeter对HBase的写入性能进行压力测试。本文主要介绍了Jmeter的基本使用,Jmeter相关扩展插件的简单使用!

概述

Apache JMeter是Apache组织开发的基于Java的压力测试工具。其主要包括以下几个作用:

  • 能够对HTTP和FTP服务器进行压力和性能测试,也可以对任何数据库进行同样的测试(通过JDBC)
  • 完全的可移植性和100% 纯java
  • 完全 Swing 和轻量组件支持(预编译的JAR使用javax.swing.*)包
  • 完全多线程 框架允许通过多个线程并发取样和通过单独的线程组对不同的功能同时取样
  • 精心的GUI设计允许快速操作和更精确的计时
  • 缓存和离线分析/回放测试结果

Jemert下载和安装

Jmeter下载,下载好后将其解压到指定的目录即可

可能需要修改的参数:
Jmeter默认运行内存可能由于太小而造成在测试时内存溢出。因此建议根据实际测试环境修改其JVM配置参数。对于Linux系统请修改apache-jmeter-2.8/bin/jmeter.sh启动脚本的如下片段:

1
java $JVM_ARGS-Xms1G -Xmx5G -XX:MaxPermSize=512m -Dapple.laf.useScreenMenuBar=true -jar \`dirname $0\`/ApacheJMeter.jar "$@"

启动Jmeter:

1
2
3
$ cd apache-jmeter-2.8/bin
$ nohup ./jmeter.sh &   #后台启动
$ ps -ef|grep java	#查看该机所有Java进程,查看是否存在包含**./ApacheJMeter.jar**的进程信息存在,存在则启动成功

启动之后的图形界面如下:

编写Jmeter测试程序

关于如何编写Jmeter测试程序,可以参考:

  • 在Jmeter中使用自定义编写的Java测试代码
  • 使用jmeter测试java程序包性能
    注意:程序中引入的Jmeter版本要与你安装的版本相匹配,不然很容易出现错误。同时,jmeter中可能包含了你程序中使用的扩展jar包,也要注意版本的兼容!

执行测试

  1. 将该测试程序所依赖的jar包拷贝至jmeter安装目录/lib/ext目录下(建议在该目录下新建一个专门存放测试程序所需jar包的文件夹).可以通过如下maven插件完成:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

	org.apache.maven.plugins
		maven-dependency-plugin
		2.5.1
		
			
				copy
				install
				
					copy-dependencies
				
				
				        
					**依赖jar包目的位置**
				
			
		



	org.apache.maven.plugins
	maven-antrun-plugin
	
		
			copy-files
			package
			
				
					
					"${project.build.directory}/*-0.0.1-SNAPSHOT.jar" tofile="/apache-jmeter-2.10/lib/ext/jmeter-dc-redirect-0.0.1-SNAPSHOT.jar" overwrite="true" />
				
			
			
				run
			
		
	

  1. 通过jmeter安装目录/bin/jmeter.sh启动jmeter
  2. 建立测试计划。点击如上图所示的Browser按钮,添加依赖jar包到classpath,一般情况下我都是将ext目录下的所有jar包都选中
  3. 添加线程组和sample,注意要将你自己写的jmeter测试程序的jar包放置在jmeter的lib/ext目录下,不然在你添加Java Request Sample时可能会找不到要测试的”类名称”
  4. 保存执行计划,注意此时会保存为一个*.jmx文件
  5. 如果想通过图形界面运行,则可以执行点击绿色的开始按钮。点击右上角的黄色“!”按钮,则可以看到执行时的日志,一般我都是通过这种方式测试Jmeter测试程序是否能正确执行

    注:因为通过图形界面方式执行太消耗资源,同时有时任务可能运行时间很长。因此建议通过命令行方式运行Jmeter测试计划

通过命令行执行Jmeter测试

For non-interactive testing, you may choose to run JMeter without the GUI. To do so, use the following command options
-n This specifies JMeter is to run in non-gui mode
-t [name of JMX file that contains the Test Plan].
-l [name of JTL file to log sample results to].
-r Run all remote servers specified in JMeter.properties (or remote servers specified on command line by overriding properties)
The script also lets you specify the optional firewall/proxy server information:
-H [proxy server hostname or ip address]
-P [proxy server port]
Example : JMeter -n -t my_test.jmx -l log.jtl -H my.proxy.server -P 8000

上面这段是Jmeter官方文档中给出的非GUI模式运行方式,如:

1
2
3
4
JMeter -n -t my_test.jmx -l log.jtl -H my.proxy.server -P 8000
-n 非图形界面形式运行
-t 测试计划,即通过jmeter建立的*.jmx文件
-l 结果分析文件

添加Jmeter扩展插件

通过上面的方式运行Jmeter测试完成后会生成一个*.jtl文件,不方便查看测试结果.因此,最好通过扩展插件将其解析成图片的形式,比较直观。插件地址
下载需要的插件的zip包(如:JMeterPlugins-Standard-1.2.0.zip),解压后将其中的jar包拷贝至jmeter安装目录/lib/ext/目录下即可。
关于插件命令的使用可以参考:JMeterPluginsCMD
另外你还可以编写自己的shell脚本从而更加方便测试:

1
2
3
4
JMETER_HOME=/home/eagle/myspace/softwares/uninstall/apache-jmeter-2.10     
$JMETER_HOME/bin/jmeter  -n -t test.jmx -l test.jtl
java -jar $JMETER_HOME/lib/ext/CMDRunner.jar --tool Reporter  --generate-png test-tps.png --input-jtl test.jtl --plugin-type TransactionsPerSecond --relative-times no --width 800 --height 600
java -jar $JMETER_HOME/lib/ext/CMDRunner.jar --tool Reporter --generate-png test-reponse-time.png --input-jtl test.jtl  --plugin-type ResponseTimesOverTime --relative-times no --width 800 --height 600

使用Jmeter进行http请求测试

使用Jmeter进行http测试比较简单,一般不需要编写代码,比如测试一个类似请求转发的rest服务:

  • 创建测试计划
  • 设置线程组,线程数,循环次数
  • 填写web服务器地址,端口,请求方法,路径,post参数等
  • 添加监听器-聚合报告
  • 聚合报告

图表含义说明如下:
Label:说明是请求类型,如Http,FTP等请求。
Samples:也就是图形报表中的样本数目,总共发送到服务器的样本数目。
Average:也就是图形报表中的平均值,是总运行时间除以发送到服务器的请求数。
Median:也就是图形报表中的中间值,是代表时间的数字,有一半的服务器响应时间低于该值而另一半高于该值。
90%line:是指90%请求的响应时间比所得数值还要小。
Min:是代表时间的数字,是服务器响应的最短时间。
Max: 是代表时间的数字,是服务器响应的最长时间。
Error%:请求的错误百分比。
Throughput:也就是图形报表中的吞吐量,这里是服务器每单位时间处理的请求数,注意查看是秒或是分钟。
KB/sec:是每秒钟请求的字节数。

总结

Jmeter是个很方便的测试工具,可能很多图表的含义不是很清楚.多查资料吧.

今天看了一些示例代码发现很多参考代码都将SampleResult写成了成员变量,而后如下实现runTest()方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Override
public SampleResult runTest(JavaSamplerContext context) {
	//SampleResult results = new SampleResult();
	results.sampleStart();
	try {
		results.setSamplerData(doRequest(appToken, licenseKey));
		results.setSuccessful(true);
	} catch (IOException e) {
		results.setSuccessful(false);
		e.printStackTrace();
	}finally{
		results.sampleEnd();
	}
	return results;
}

按照上面的写法,当线程数设置大于1时会抛出如下的异常:jmeter.samplers.SampleResult: sampleStart called twice java.lang.Throwable: Invalid call sequence
后来写成局部变量就好了.


Jmeter Plugin相关图表说明
Jmeter教程


你可能感兴趣的:(web测试)