- public Arguments getDefaultParameters():设置可用参数及的默认值;
- public void setupTest(JavaSamplerContext arg0):每个线程测试前执行一次,做一些初始化工作;
- public SampleResult runTest(JavaSamplerContext arg0):开始测试,从arg0参数可以获得参数值;
- public void teardownTest(JavaSamplerContext arg0):测试结束时调用;
getDefaultParameters() --> setupTest(JavaSamplerContext context) --> runTest(JavaSamplerContext context) --> teardownTest(JavaSamplerContext context)
package test; import java.io.File; import java.io.PrintWriter; public class OutputService { public static void output(String filename,int a, int b) throws Exception { PrintWriter out = new PrintWriter(new File(filename)); out.write(a+":"+b); out.close(); } }
测试类: package test; 02. 03. 04. import org.apache.jmeter.config.Arguments; 05. import org.apache.jmeter.protocol.java.sampler.JavaSamplerClient; 06. import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext; 07. import org.apache.jmeter.samplers.SampleResult; 08. 09. 10. public class PerformenceTest implements JavaSamplerClient { 11. private SampleResult results; 12. private String a; 13. private String b; 14. private String filename; 15. 16. 17. // 设置传入的参数,可以设置多个,已设置的参数会显示到Jmeter的参数列表中 18. public Arguments getDefaultParameters() { 19. Arguments params = new Arguments(); 20. params.addArgument("filename", "0");//设置参数,并赋予默认值0 21. params.addArgument("a", "0");//设置参数,并赋予默认值0 22. params.addArgument("b", "0");//设置参数,并赋予默认值0 23. return params; 24. } 25. 26. 27. // 初始化方法,实际运行时每个线程仅执行一次,在测试方法运行前执行 28. public void setupTest(JavaSamplerContext arg0) { 29. results = new SampleResult(); 30. } 31. 32. 33. // 测试执行的循环体,根据线程数和循环次数的不同可执行多次 34. @Override 35. public SampleResult runTest(JavaSamplerContext arg0) { 36. b = arg0.getParameter("b"); // 获取在Jmeter中设置的参数值 37. a = arg0.getParameter("a"); // 获取在Jmeter中设置的参数值 38. filename = arg0.getParameter("filename"); // 获取在Jmeter中设置的参数值 39. results.sampleStart();// jmeter 开始统计响应时间标记 40. try { 41. OutputService test = new OutputService(); 42. test.output(filename,Integer.parseInt(a), Integer.parseInt(b)); 43. results.setSuccessful(true); 44. // 被测对象调用 45. } catch (Throwable e) { 46. results.setSuccessful(false); 47. e.printStackTrace(); 48. } finally { 49. results.sampleEnd();// jmeter 结束统计响应时间标记 50. } 51. return results; 52. } 53. 54. 55. // 结束方法,实际运行时每个线程仅执行一次,在测试方法运行结束后执行 56. public void teardownTest(JavaSamplerContext arg0) { 57. } 58. public static void main(String[] args) { 59. // TODO Auto-generated method stub 60. Arguments params = new Arguments(); 61. params.addArgument("a", "0");//设置参数,并赋予默认值0 62. params.addArgument("b", "0");//设置参数,并赋予默认值0 63. JavaSamplerContext arg0 = new JavaSamplerContext(params); 64. PerformenceTest test = new PerformenceTest(); 65. test.setupTest(arg0); 66. test.runTest(arg0); 67. test.teardownTest(arg0); 68. } 69. }
Export 为 Runnable Jar File;
2、设置JMeter
以管理员身份打开JMeter,并创建Java Request后,结构如下图所示:
查看聚合报告,分析其中的所有统计数据,得出性能测试结论。
如果做Web应用的性能测试,例如只有一个登录的请求,那么在Aggregate Report中,会显示一行数据,共有10个字段,含义分别如下。
Label:每个 JMeter 的 element(例如 HTTP Request)都有一个 Name 属性,这里显示的就是 Name 属性的值
Samples:表示你这次测试中一共发出了多少个请求,如果模拟10个用户,每个用户迭代10次,那么这里显示100
Average:平均响应时间——默认情况下是单个 Request 的平均响应时间,当使用了 Transaction Controller 时,也可以以Transaction 为单位显示平均响应时间
Median:中位数,也就是 50% 用户的响应时间
90% Line:将所有响应时间从小到大排列,第90%的那个响应时间,此数值代表绝大多数用户的响应实际时间,有一定参考价值
Min:最小响应时间
Max:最大响应时间
Error%:本次测试中出现错误的请求的数量/请求的总数
Throughput:吞吐量——默认情况下表示每秒完成的请求数(Request per Second)
KB/Sec:每秒从服务器端接收到的数据量,相当于Throughput/Sec
6.1监控插件
很多时候,测试性能都需要查看内存和CPU等信息来判断系统瓶颈,关于CPU和内存的监控,Jmeter并没有很好的支持,只能通过系统的资源监控器来观察,一闪而过不会记录下来。谷歌开发了一款专门监控的Jmeter插件JMeterPlugins,弥补了这方面的不足,目前使用的版本为JMeterPlugins-Standard-1.2.0。
首先将下载的文件进行解压,得到JMeterPlugins-Standard-1.2.0与ServerAgent,将JMeterPlugins-Standard-1.2.0libextJMeterPlugins-Standard.jar包复制到JMeter的lib目录下面的ext目录下面,重新启动Jmeter。
然后,将serverAgent目录及下面的文件复制到我们测试的服务器上,windows的话运行startAgent.bat,linux的话打运行startAgent.sh。
准备工作完成,开始进行性能测试。
6.2分布式测试
有时一台压力测试机无法满足性能测试的需求的情况下,需要搭建分布式的Jmeter测试系统,使用Jmeter自带分布式的性能测试功能。
首先开始分布式性能测试之前:
1 所有的压力机的防火墙应该关闭
2 所有的压力机应该都在同一个局域网中
3 确保所有压力机的JMeter可以访问待测服务器
4 确保所有压力机的JMeter版本都是一致的
injmeter-server.bat
2 性能测试主机进入Jmeter主界面,并且启用远程控制
可以选择启动某个附属压力机,也可以选择全部启动,通过远程启动,便可驱动远程开启的JMeter同时进行并发测试,这样实现了分布式的性能测试。测试过程中附属压力机的处理器和内存可能全部占满,需要监控压力机的硬件资源防止其崩溃死机,测试结束之后再点击远程全部停止,关闭附属压力机。