使用jmeter测试web应用遇到的几个问题及解决

本周配合负责测试的同事对项目进行并发测试,选用开源的jmeter,之前同事下了loadrunner试用,
效果并不理想,对测试机本身的资源占用,导致压力无法"压"到服务上。相比之下,jmeter轻巧多了。
环境:
windows7 64位简体中文专业版
jdk1.6.0
服务 tomcat6.0

  • 下载   到官网(http://jakarta.apache.org/jmeter/)下载并解压jmeter到本地
  • 乱码 运行/bin/jmeter.bat 启动jmeter,出现中文乱码
    使用jmeter测试web应用遇到的几个问题及解决
    打开同目录下的 jmeter.properties,去掉“#language=en”的注释,再次启动,语言改为英文了。
    使用jmeter测试web应用遇到的几个问题及解决
  • 录制 录制脚本
    • 在"Test Plan"中增加"Thread Group"
      使用jmeter测试web应用遇到的几个问题及解决

    • 在"WorkBench"中增加“Http proxy Server”
      使用jmeter测试web应用遇到的几个问题及解决

    • 完成后如下图,我的代理端口设置为8090:
      使用jmeter测试web应用遇到的几个问题及解决  

    • 在浏览器中设置代理为localhost, 端口为上述8090。
    • 用浏览器访问web应用,这时所有http都经过jmeter转发,因此所有的http请求被jmeter录制并加入到Thread Group中。(注意如果Web应用在本机的话,不要直接用localhost访问,否则浏览器可能忽略代理设置,直接向web应用请求,我是好半天才醒 悟过来,google下,犯此错误的网友不少)
    • 使用jmeter测试web应用遇到的几个问题及解决

 

 

 

  • Session 要使jmeter能够保持住session,必须使其能够维持cookie中的jessionId,因此增加“http cookie manager”.
  •  
    • 使用jmeter测试web应用遇到的几个问题及解决
  • 用户   并发线程以不同的用户名登录。  找到你的登录脚本,修改用户名为变量,例如:
    我的用户登录脚本为一个jsonRPC调用,用户名在http参数中
    录制脚本为 params:["L", {"map": {"user": "USER_TEST_u001}"
    将其修改为:params:["L", {"map": {"user": "USER_TEST_u2${__threadNum}"
    其中${__threadNum}为jmeter提供的函数,每个线程具有的独立id
    当然我的后台是允许所有前缀为“USER_TEST_”的测试用户登录的。
  • 循环 循环回放脚本
    • 录制的脚本回放用以模拟用户点击请求,如果想长时间压力测试,可以设置为循环回放脚本。
    • 使用jmeter测试web应用遇到的几个问题及解决
  •  
    • 设置适当的请求间隔。
    • 默认设置下,jmeter是前一个请求返回立即发送下一个请求,远远超出实际的用户点击,一般应当根据需要在两个请求之间设置时间间隔,我使用了“Constant Timer ”
    • 使用jmeter测试web应用遇到的几个问题及解决
  • 并发LOOP
    • 我的测试用例包含两部分:1.用户的点击交互,录制为一系列jsonrpc请求; 2.Comet交互, 我设想分别建立两个thread Group,并发运行。
    • 结果却遗憾的发现:如果一个Thread Group包含了loop forever,jmeter将阻塞在这个loop,下一个thread Group将永不会启动。
    • 我的解决办法是将两个thread Group分拆到两个独立的test plan中,同时运行两个jmeter,不知道有没有更简洁的办法。
    BTW:javaeye在线编辑的编号功能实在不好用。