使用jmeter测试web应用遇到的几个问题及解决
本周配合负责测试的同事对项目进行并发测试,选用开源的jmeter,之前同事下了loadrunner试用,
效果并不理想,对测试机本身的资源占用,导致压力无法"压"到服务上。相比之下,jmeter轻巧多了。
环境:
windows7 64位简体中文专业版
jdk1.6.0
服务 tomcat6.0
- 下载 到官网(http://jakarta.apache.org/jmeter/)下载并解压jmeter到本地
-
乱码
运行/bin/jmeter.bat 启动jmeter,出现中文乱码
打开同目录下的 jmeter.properties,去掉“#language=en”的注释,再次启动,语言改为英文了。 -
录制
录制脚本
- 在"Test Plan"中增加"Thread Group"
- 在"WorkBench"中增加“Http proxy Server”
- 完成后如下图,我的代理端口设置为8090:
- 在浏览器中设置代理为localhost, 端口为上述8090。
- 用浏览器访问web应用,这时所有http都经过jmeter转发,因此所有的http请求被jmeter录制并加入到Thread Group中。(注意如果Web应用在本机的话,不要直接用localhost访问,否则浏览器可能忽略代理设置,直接向web应用请求,我是好半天才醒 悟过来,google下,犯此错误的网友不少)
- 在"Test Plan"中增加"Thread Group"
-
Session
要使jmeter能够保持住session,必须使其能够维持cookie中的jessionId,因此增加“http cookie manager”.
-
-
用户
并发线程以不同的用户名登录。 找到你的登录脚本,修改用户名为变量,例如:
我的用户登录脚本为一个jsonRPC调用,用户名在http参数中
录制脚本为 params:["L", {"map": {"user": "USER_TEST_u001}"
将其修改为:params:["L", {"map": {"user": "USER_TEST_u2${__threadNum}"
其中${__threadNum}为jmeter提供的函数,每个线程具有的独立id
当然我的后台是允许所有前缀为“USER_TEST_”的测试用户登录的。 -
循环
循环回放脚本
- 录制的脚本回放用以模拟用户点击请求,如果想长时间压力测试,可以设置为循环回放脚本。
-
- 设置适当的请求间隔。
- 默认设置下,jmeter是前一个请求返回立即发送下一个请求,远远超出实际的用户点击,一般应当根据需要在两个请求之间设置时间间隔,我使用了“Constant Timer ”
-
并发LOOP
- 我的测试用例包含两部分:1.用户的点击交互,录制为一系列jsonrpc请求; 2.Comet交互, 我设想分别建立两个thread Group,并发运行。
- 结果却遗憾的发现:如果一个Thread Group包含了loop forever,jmeter将阻塞在这个loop,下一个thread Group将永不会启动。
- 我的解决办法是将两个thread Group分拆到两个独立的test plan中,同时运行两个jmeter,不知道有没有更简洁的办法。