Jmeter取样器之Java Request(2)

背景

测试实验室需要构造常口数据1-2亿,存在的问题:单线程插入耗时太长,效率低。Jmeter可以实现多线程处理,且可通过调用jar包实现java请求。

操作步骤

1Java项目工程中创建一个类并实现JavaSamplerClient接口或继承AbstractJavaSamplerClient,并重写;

public Arguments getDefaultParameters();设置可用参数及的默认值;
public void setupTest(JavaSamplerContext arg0):每个线程测试前执行一次,做一些初始化工作;
public SampleResult runTest(JavaSamplerContext arg0):开始测试,从arg0参数可以获得参数值;
public void teardownTest(JavaSamplerContext arg0):测试结束时调用;

实例文件见附件:

JmeterJava.java

import com.dragonsoft.testlab.action.MHzCzrkjbxxAction;
import com.dragonsoft.testlab.action.MHzCzrkjbxxActionNew;
import com.dragonsoft.testlab.action.MWbSwjlAction;
import com.dragonsoft.testlab.common.CLKData;
import com.dragonsoft.testlab.common.DBconn;
import com.dragonsoft.testlab.common.IdCardGenerator;
import com.dragonsoft.testlab.common.SameFamilyDataGenerator;
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;

import java.sql.Connection;

/**
 * @Description
 * @Author Meiying_jiang
 * @Date 2018/6/20 10:27
 */
public class JmeterJava extends AbstractJavaSamplerClient {
    private String record;
    private String ywkconn_ip;
    private String ywkconn_user;
    private String ywkconn_password;
    private String clkconn_ip;
    private String clkconn_user;
    private String clkconn_password;
    /** Holds the result data (shown as Response Data in the Tree display). */
    private Long resultData;

    // 这个方法是用来自定义java方法入参的。
    // params.addArgument("num1","");表示入参名字叫num1,默认值为空。
    //设置可用参数及的默认值;
    public Arguments getDefaultParameters() {
        Arguments params = new Arguments();
        params.addArgument("record", "1");
        params.addArgument("ywkconn_ip","192.168.0.13");
        params.addArgument("ywkconn_user","csbsys");
        params.addArgument("ywkconn_password","dragon");
        params.addArgument("clkconn_ip","192.168.0.13");
        params.addArgument("clkconn_user","csbsys");
        params.addArgument("clkconn_password","dragon");
        return params;
    }

    //每个线程测试前执行一次,做一些初始化工作;
    public void setupTest(JavaSamplerContext arg0) {
    }

    //开始测试,从arg0参数可以获得参数值;
    public SampleResult runTest(JavaSamplerContext arg0) {
        record = arg0.getParameter("record");
        ywkconn_ip = arg0.getParameter("ywkconn_ip");
        ywkconn_user = arg0.getParameter("ywkconn_user");
        ywkconn_password = arg0.getParameter("ywkconn_password");
        clkconn_ip = arg0.getParameter("clkconn_ip");
        clkconn_user = arg0.getParameter("clkconn_user");
        clkconn_password = arg0.getParameter("clkconn_password");
        SampleResult sr = new SampleResult();
        sr.setSampleLabel( "Java请求");
        try {
            sr.sampleStart();// jmeter 开始统计响应时间标记

//            //代码块,常口
//            long start = System.currentTimeMillis();
//            Connection ywkconn = DBconn.dbconn(ywkconn_ip,ywkconn_user,ywkconn_password);
//            Connection clkconn = DBconn.dbconn(clkconn_ip,clkconn_user,clkconn_password);
//            long end = System.currentTimeMillis();
//            System.out.println("连接数据库耗时:"+(end - start));
//            long start1 = System.currentTimeMillis();
//            //往数据库插入数据
//            int count=Integer.valueOf(record);//插入的记录数
//            //户政_常住人口基本信息
////            MHzCzrkjbxxAction.hzczrk(count,ywkconn,clkconn);
//            MWbSwjlAction.wb(count,clkconn);
//            long end1 = System.currentTimeMillis();
//            System.out.println("插入用时:"+(end1 -start1));
//            //关闭数据库,统一放外层关闭
//            ywkconn.close();
//            clkconn.close();

            //插入常口三代关系数据和户信息数据
            long start = System.currentTimeMillis();
            //定义循环次数
            int record = 5000;
            //连接数据库
            Connection ywkconn = DBconn.dbconn("192.168.0.13","csbsys","dragon");
            //身份证生成类实例化
            IdCardGenerator idcard = new IdCardGenerator();
            //策略库类实例化
            CLKData clkdb = new CLKData();

            //同户关系类实例化
            MHzCzrkjbxxActionNew hz = new MHzCzrkjbxxActionNew();
            //同户关系生成类实例化
            SameFamilyDataGenerator sameFamily = new SameFamilyDataGenerator();
            sameFamily.sameFamily(ywkconn,clkdb,idcard,hz,record);

            //关闭数据库,统一放外层关闭
            ywkconn.close();
            long end = System.currentTimeMillis();
            long time = end - start;
            System.out.println("插入 "+record +" 花费总时间:"+time);


            // 通过下面的操作就可以将被测方法的响应输出到Jmeter的察看结果树中的响应数据里面了。
            resultData = end-start;
            sr.setResponseData("结果是:"+resultData, null);
            sr.setDataType(SampleResult.TEXT);
            // System.out.println(resultData);
            sr.setSuccessful(true);
        } catch (Throwable e) {
            sr.setSuccessful(false);
            e.printStackTrace();
        } finally {
            sr.sampleEnd();// jmeter 结束统计响应时间标记
        }
        return sr;
    }

    //测试结束时调用;
    @Override
    public void teardownTest(JavaSamplerContext arg0) {
    }

    // main只是为了调试用,最后打jar包的时候注释掉。
//    public static void main(String[] args)
//    { // TODO Auto-generated method stub
//        Arguments params = new Arguments();
//        params.addArgument("num1", "1");//设置参数,并赋予默认值1
//        params.addArgument("num2", "2");//设置参数,并赋予默认值2
//        JavaSamplerContext arg0 = new JavaSamplerContext(params);
//        com.dragonsoft.testlab.JmeterJava test = new com.dragonsoft.testlab.JmeterJava();
//        test.setupTest(arg0);
//        test.runTest(arg0);
//        test.teardownTest(arg0);
//    }

}

  

2、将Java项目工程打成Jar包(确保打包内容包括类JmeterJava的内容);

3、将此jar包放入JMETER_HOME\lib\ext目录;

4、打开Jmeter,创建线程组、Java Request、查看结果树,进行测试,Java Request中选择相应的类名如下所示:

 

 

 

附录:

1Jmeter安装及使用,详见192.168.23.1共享文件,路径如下所示

 

 

 

 

2IdeaJar注意点:需勾选build on make,每次打包直接执行菜单栏BuildRebulid Project即可完成打包。

 

posted on 2021-12-07 09:29  seamy  阅读(155)  评论(0编辑  收藏  举报