使用Jmeter中的Java Request进行性能测试

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/majian_1987/article/details/50971251
在使用jmeter进行性能测试的时候,有可能会需要通过一些脚本去测试性能,(比如通过sokeeper的api去测试sokeeper的读写性能)。这时,我们可以通过Java Request实现,以下是操作步骤。

   首先创建一个maven project。

因Jmeter的Java Request脚本依赖Jmeter的一些核心jar包,所以我们要maven项目的pom文件中添加Jmeter的一些依赖包:ApacheJMeter_core、ApacheJMeter_java:

   

  编写Java Sample,继承AbstractJavaSample,并重写以下方法:

?
    public  Arguments getDefaultParameters();可选,定义可用参数及默认值;  
·   public  void  setupTest(JavaSamplerContext arg0):可选,测试前执行,做一些初始化工作;
·   public  SampleResult runTest(JavaSamplerContext arg0);必选,实现自定义请求;  
·   public  void  teardownTest(JavaSamplerContext arg0):可选,测试结束时调用;

示例代码:

?
import  org.apache.curator.RetryPolicy;
import  org.apache.curator.framework.CuratorFramework;
import  org.apache.curator.framework.CuratorFrameworkFactory;
import  org.apache.curator.retry.ExponentialBackoffRetry;
import  org.apache.curator.utils.EnsurePath;
import  org.apache.jmeter.config.Arguments;
import  org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import  org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import  org.apache.jmeter.samplers.SampleResult;
  
public  class  CuratorRequestSample  extends  AbstractJavaSamplerClient {
     protected  CuratorFramework client =  null ;
     protected  long  subCount = 1l;
     protected  long  TOTAL_SUB_COUNT = 100000l;
     /**
      * 定义可用参数及默认值
      */
     public  Arguments getDefaultParameters() {
         Arguments params =  new  Arguments();
         params.addArgument( "connect_str" "192.168.103.136:2181,192.168.103.154:2181" );
         // 设置参数,并赋予默认值0
         return  params;
     }
     /**
      * 可选,测试前执行,做一些初始化工作,在Jmeter执行的时候,一个Thread只执行一次setupTest方法
      */
     public  void  setupTest(JavaSamplerContext context) {
         String connect_str = context.getParameter( "connect_str" );
         RetryPolicy retryPolicy =  new  ExponentialBackoffRetry( 1000 4 );
         client =
             CuratorFrameworkFactory.builder().connectString(connect_str)
             .connectionTimeoutMs( 3000 ).namespace( "curator_sample" )
            .sessionTimeoutMs( 5000 ).retryPolicy(retryPolicy).build();
         client.start();
         EnsurePath ensure =  new  EnsurePath( "/curator_sample/setData" );
         try  {
             ensure.ensure(client.getZookeeperClient());
         catch  (Exception e) {
             e.printStackTrace();
         }
     }
     /**
      * 可选,测试结束时调用,用于资源释放,一个Thread只执行一次
      */
     public  void  teardownTest(JavaSamplerContext context) {
         client.close();
     }
     /**
      * 必选,实现自定义请求
      */
     public  SampleResult runTest(JavaSamplerContext arg0) {
         SampleResult resuts =  new  SampleResult();
         resuts.sampleStart();
         try  {
             byte [] bytes = client.getData().forPath( "/setData" );
             resuts.setSuccessful( true );
         catch  (Exception e) {
             resuts.setSuccessful( false );
         }
         resuts.sampleEnd();
         return  resuts;
     }
}

            然后,把项目打成jar包,并将包放到${jmeter_home}/lib/ext/目录下。如还需要依赖第三方jar,需要将第三方的jar也放到${jmeter_home}/lib/ext/目录下。

   启动Jmeter。

   创建线程组:

  

   创建Java Request Sample:

  

   此时,会在Java请求页面的“类名称”下拉列表中看到我们之前写的Java Request脚本:

  

   选中其中一个要测试的脚本,可以看到配置的参数:

  

   然后再添加Summary Report即可,保存测试计划。设置线程组属性,执行测试计划。即可。


优化技巧一

   很多情况下我们在编写Java Sample时,需要编写多个Java Sample,且这些Java Sample之间,拥有共同的资源初始化操作、资源释放操作,只是在核心业务不同而已,这时,我们可以封装一个基类。例:

?
import  org.apache.curator.RetryPolicy;
import  org.apache.curator.framework.CuratorFramework;
import  org.apache.curator.framework.CuratorFrameworkFactory;
import  org.apache.curator.retry.ExponentialBackoffRetry;
import  org.apache.curator.utils.EnsurePath;
import  org.apache.jmeter.config.Arguments;
import  org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import  org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import  org.apache.jmeter.samplers.SampleResult;
  
/**
  * Curator的Java请求测试基类
 
  * @author majian
  * @version 1.0, 2016-2-22
  * @since 1.0, 2016-2-22
  */
public  abstract  class  CuratorBaseRequest  extends  AbstractJavaSamplerClient {
  
     protected  CuratorFramework client =  null ;
     protected  long  subCount = 1l;
     protected  long  TOTAL_SUB_COUNT = 100000l;
      
     /**
      * 定义可用参数及默认值
      */
     public  Arguments getDefaultParameters() {
         Arguments params =  new  Arguments();
         params.addArgument( "connect_str" "192.168.103.136:2181,192.168.103.154:2181" ); // 设置参数,并赋予默认值0
      return  params;
     }
      
     /**
      * 可选,测试前执行,做一些初始化工作,在Jmeter执行的时候,一个Thread只执行一次setupTest方法
      */
     public  void  setupTest(JavaSamplerContext context) {
         String connect_str = context.getParameter( "connect_str" );
         RetryPolicy retryPolicy =  new  ExponentialBackoffRetry( 1000 4 );
         client =
         CuratorFrameworkFactory.builder().connectString(connect_str)
             .connectionTimeoutMs( 3000 ).namespace( "curator_sample" )
            .sessionTimeoutMs( 5000 ).retryPolicy(retryPolicy).build();
         client.start();
         EnsurePath ensure =  new  EnsurePath( "/curator_sample/setData" );
         try  {
             ensure.ensure(client.getZookeeperClient());
         catch  (Exception e) {
             e.printStackTrace();
         }
     }
      
     /**
      * 可选,测试结束时调用,用于资源释放,一个Thread只执行一次
      */
     public  void  teardownTest(JavaSamplerContext context) {
         client.close();
     }
      
     /**
      * 必选,实现自定义请求
      */
     public  SampleResult runTest(JavaSamplerContext arg0) {
         SampleResult resuts =  new  SampleResult();
         resuts.sampleStart();
         try  {
             testHandler();
             resuts.setSuccessful( true );
         catch  (Exception e) {
             resuts.setSuccessful( false );
         }
         resuts.sampleEnd();
         return  resuts;
     }
      
     /**
      * 核心业务执行功能实现,只需实现此接口即可
      * @throws Exception
      */
     public  abstract  void  testHandler()  throws  Exception;
  
}

    然后我们可以创建不同的Java请求,继承这个基类,只需实现testHandler()方法即可。如:

 curator获取数据的Java Request:

?
public  class  GetDataRequest  extends  CuratorBaseRequest {
     public  void  testHandler()  throws  Exception {
         byte [] bytes = client.getData().forPath( "/setData" );
     }
}

 Curaotr设置数据的Java Request:

?
import  org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
 
public  class  SetDataRequest  extends  CuratorBaseRequest {
     private  byte [] a100 =  new  byte [ 100 ];
     public  void  setupTest(JavaSamplerContext context) {
         for  ( int  i =  0 ; i < a100.length; i++) {
             a100[i] =  'A' ;
         }
         super .setupTest(context);
     }
     public  void  testHandler()  throws  Exception {
         client.setData().forPath( "/setData" , a100);
     }
}

   这样,可以避免大量的冗余代码。

优化技巧二

      在编写完Java Sample后,每次都需要我们打成jar包,然后再复制jar包到${jmeter_home}\lib\ext下,然后再重起jmeter,这样操作比较繁琐。这时,我们可以通过在maven项目中添加一个maven插件来帮助我们简化操作。

?
< plugin >
         < groupId >org.apache.maven.plugins</ groupId >
         < artifactId >maven-antrun-plugin</ artifactId >
         < executions >
           < execution >
             < id >copy-files</ id >
             < phase >package</ phase >
             < configuration >
               < tasks >
                 <!--将生成的项目jar拷贝到jmeter的lib/ext目录下 -->
                 < copy  file = "${project.build.directory}/yss_curator-0.0.1-SNAPSHOT.jar"  tofile = "D:\apache-jmeter-2.13\lib\ext\yss_curator-0.0.1-SNAPSHOT.jar"
                   overwrite = "true"  />
               </ tasks >
             </ configuration >
             < goals >
               < goal >run</ goal >
             </ goals >
           </ execution >
         </ executions >
       </ plugin >

  如此,我们便可在执行mvn package命令的时候,自动将项目打包,并将包复制到指定的目录下了,我们只需再重启jmeter就可以了。

猜你喜欢

转载自blog.csdn.net/majian_1987/article/details/50971251
今日推荐