背景
测试实验室需要构造常口数据1-2亿,存在的问题:单线程插入耗时太长,效率低。Jmeter可以实现多线程处理,且可通过调用jar包实现java请求。
操作步骤
1、Java项目工程中创建一个类并实现JavaSamplerClient接口或继承AbstractJavaSamplerClient,并重写;
public Arguments getDefaultParameters();设置可用参数及的默认值;
public void setupTest(JavaSamplerContext arg0):每个线程测试前执行一次,做一些初始化工作;
public SampleResult runTest(JavaSamplerContext arg0):开始测试,从arg0参数可以获得参数值;
public void teardownTest(JavaSamplerContext arg0):测试结束时调用;
实例文件见附件:
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中选择相应的类名如下所示:
附录:
1、Jmeter安装及使用,详见192.168.23.1共享文件,路径如下所示
2、Idea打Jar注意点:需勾选build on make,每次打包直接执行菜单栏Build》Rebulid Project即可完成打包。