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

   在使用jmeter进行性能测试的时候,有可能会须要经过一些脚本去测试性能,(好比经过sokeeper的api去测试sokeeper的读写性能)。这时,咱们能够经过Java Request实现,如下是操做步骤。java

   首先建立一个maven project。apache

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

   

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

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

示例代码:maven

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:ui

  

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

  

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

  

   而后再添加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就能够了。

相关文章
相关标签/搜索