JMeter进阶—详解Java sampler的设计方法(附源码)

时间:2022-04-04 00:31:13

JMeter进阶—详解Java sampler的设计方法(附源码)

JMeter Java Sampler介绍

我们通常使用jmeter做http或者https请求的测试,但是有些场景我们需要直接调用Java接口进行性能测试, jmeter通过Java请求可以实现该需求(这样就可以处理一些公司自定义的协议了,开发提供协议接口,然后我们通过java sampler进行调用)。本文将会详细介绍jmeter中如何编写 java请求并对其进行调用!

添加Java请求

JMeter进阶—详解Java sampler的设计方法(附源码)

Java请求如下:

JMeter进阶—详解Java sampler的设计方法(附源码)

其中上图里com.my.demo.JmeterDemo2,即我们需要调用的Java类;str是我们需要传入的参数。那么Jmeter中如何实现对java请求的调用呢?我会在本文详细讲解!

设计Java请求思路与代码解析

如何编写jmeter java请求,简单地说分如下几点:

1写一个类,叫做Demo,使其继承AbstractJavaSamplerClient;

2.在public SampleResult runTest(JavaSamplerContext arg0)方法里,写处理java代码的逻辑;

3.在public Arguments getDefaultParameters()方法里定义从jmeter中传入java代码的参数;

4.把类Demo 打成jar包并放入jmeter的\lib\ext 目录下(如果Demo需要依赖其它jar包需要一起放入\lib\ext目录下)

实例代码如下:

  1. importorg.apache.commons.lang3.StringUtils;
  2. importorg.apache.jmeter.config.Arguments;
  3. importorg.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
  4. importorg.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
  5. importorg.apache.jmeter.samplers.SampleResult;
  6. publicclassJmeterDemo2extendsAbstractJavaSamplerClient
  7. {
  8. privateSampleResultsr;
  9. publicArgumentsgetDefaultParameters(){
  10. Argumentsparams=newArguments();
  11. params.addArgument("str","");
  12. returnparams;
  13. }
  14. publicSampleResultrunTest(JavaSamplerContextarg0){
  15. this.sr.setSampleLabel("commonsio-demo2");
  16. try{
  17. Stringstr=arg0.getParameter("para");
  18. //使用jar包中StringUtils类的countMatches方法来统计字符串a的个数
  19. intnum=StringUtils.countMatches(str,"a");
  20. if(num==0){
  21. this.sr.setResponseMessage("ResponseMessage:参数匹配0个");//SampleResult中的Responsemessage
  22. this.sr.setResponseData("ResponseData:参数匹配0个","UTF-8");//ResponseData的值,会被后面的覆盖
  23. this.sr.setSuccessful(true);//SampleResult中的结果
  24. }else{
  25. this.sr.setResponseMessage("ResponseMessage:参数匹配"+num+"个");
  26. this.sr.setResponseData("ResponseData:参数匹配"+num+"个","UTF-8");
  27. this.sr.setSuccessful(false);
  28. }
  29. }catch(Exceptione){
  30. this.sr.setResponseMessage(e.getMessage().toString());
  31. this.sr.setSuccessful(false);
  32. }finally{
  33. //this.sr.setResponseData("结束测试","UTF-8");
  34. super.getNewLogger().info("####测试执行####");
  35. try{
  36. Thread.sleep(500);
  37. }catch(InterruptedExceptione){
  38. //TODOAuto-generatedcatchblock
  39. e.printStackTrace();
  40. }
  41. }
  42. returnthis.sr;
  43. }
  44. publicvoidsetupTest(JavaSamplerContextcontext){
  45. super.setupTest(context);
  46. super.getNewLogger().info("####测试开始####");
  47. this.sr=newSampleResult();
  48. this.sr.sampleStart();
  49. }
  50. publicvoidteardownTest(JavaSamplerContextcontext){
  51. super.teardownTest(context);
  52. this.sr.sampleEnd();
  53. super.getNewLogger().info("####测试结束####");
  54. }
  55. }

这里对上述代码做详细分析:

主要用到的方法如下:

JMeter进阶—详解Java sampler的设计方法(附源码)

方法执行的先后顺序为:

getDefaultParameters() -->

setupTest(JavaSamplerContext context)-->

runTest(JavaSamplerContext context) -->

teardownTest(JavaSamplerContext context)

代码运行后,打开日志结果如下,参数para 对应代码String str=arg0.getParameter("para");

JMeter进阶—详解Java sampler的设计方法(附源码)

从日志中可以看到

setupTest(JavaSamplerContext context) 中的代码被执行1次,打印

####测试开始####

teardownTest(JavaSamplerContext context) 中的代码被执行1次,打印

####测试结束####

而runTest中的方法super.getNewLogger().info("####测试执行####"); 被执行5次,因为在线程组中,设置执行5次。(线程组线程执行的次数,影响java请求中的runTest,而不会影响setupTest和teardownTest)。方法super.getNewLogger().info("")会把值写入日志。

setResponseMessage("ResponseMessage:参数匹配0个");打印到Sample Result 中的Response message里;setSampleLabel("commonsio-demo2");设置java请求的显示名称,如下图:

JMeter进阶—详解Java sampler的设计方法(附源码)

setResponseData("ResponseData:参数匹配0个","UTF-8"); 打印到Response Data,如下图:

JMeter进阶—详解Java sampler的设计方法(附源码)

最后,方法setSuccessful(true)会影响测试结果

在IDE中开发Jmeter Java 请求

在IDE中开发Jmeter Java 请求与普通java开发一致,引入需要的java包以及jmeter相关jar包即可,引入Jmeter lib\ext下的ApacheJMeter_core.jar和ApacheJMeter_java.jar到IDE中!

原文链接:https://www.toutiao.com/a7023948119142416932/