jmeter - 开发java插件,进行测试
2015-10-29 10:56
405 查看
1.准备工作
开发jmeter的java插件需要引入两个包"ApacheJMeter_core.jar"和"ApacheJMeter_java.jar",位于Jmeter的安装目录lib/ext 下
在java工程中,导入这两个包
2.开发步骤
jmeter插件需要继承 AbstractJavaSamplerClient,这点需要注意,如果不继承,那么这个开发包在jmeter的选项中将不可见
继承"AbstractJavaSamplerClient"类,会获得"getDefaultParameters","setupTest","runTest"和"teardownTest"方法
3.代码
执行打包,打包的文件拷贝到jmeter/lib/ext目录下
最好重新启动jmeter,然后创建java请求sampler,这时可以通过类名称选择我们加载的jar包内容
选择后,可以看到java中定义的参数,
而且,参数可以进一步进行参数化
运行后,执行java中定义的内容,本段代码中,主要进行了一个签名处理,
并返回一个结果,这个结果可以通过jmeter的查看结果树查看,并进一步将结果作为一个参数向后传递
同时,这里的transparams是一个可以添加多个参数的变量,因为有些时候接口获得的参数除了固定入参还会有一些辅助参数,比如时间戳,cookie,sessionid等,这种情况下,首先变量的种类是不确定的,其次变量的个数也可能不确定,作为本文中java的处理功能,是要对所有入参进行签名处理,那么就必须留有这个入口,当这个参数不填写即为空的情况,我们默认不处理,当有变量时,必须按照 paraname:paravalue的形式输入,当有多个参数时,则需要paraname1:paravalue1,paraname2:paraname2,....的形式录入
当然,这个java程序还引入了一个自定义的包Util,签名和transparams的处理都包含在其中,代码如下
开发jmeter的java插件需要引入两个包"ApacheJMeter_core.jar"和"ApacheJMeter_java.jar",位于Jmeter的安装目录lib/ext 下
在java工程中,导入这两个包
2.开发步骤
jmeter插件需要继承 AbstractJavaSamplerClient,这点需要注意,如果不继承,那么这个开发包在jmeter的选项中将不可见
继承"AbstractJavaSamplerClient"类,会获得"getDefaultParameters","setupTest","runTest"和"teardownTest"方法
3.代码
package cn.customer.jmeter; import java.security.MessageDigest; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.security.MessageDigest; import java.sql.DriverManager; 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 cn.customer.jmeter.Util; /** * * @author Alex */ public class DoSign extends AbstractJavaSamplerClient { /* 声明全局变量 取样器结果集 和默认参数 */ private SampleResult results; private String defautargs; private String ip; private String port; private String dbname; private String username; private String password; private String tbname; private String rowindex; private String secrect; private String transparams; /* Implements JavaSamplerClient.setupTest(JavaSamplerContext) */ public void setupTest(JavaSamplerContext arg0) { results = new SampleResult(); results.setSamplerData(toString()); results.setDataType("text"); results.setContentType("text/plain"); results.setDataEncoding("UTF-8"); results.setSuccessful(true); results.setResponseMessageOK(); results.setResponseCodeOK(); defautargs = arg0.getParameter("defautargs", ""); if (defautargs != null && defautargs.length() > 0) { results.setSamplerData(defautargs); } } /* Implements JavaSamplerClient.teardownTest(JavaSamplerContext) */ public void teardownTest(JavaSamplerContext arg0) { System.out.println("treaddown"); } /* Implements JavaSamplerClient.getDefaultParameters() */ public Arguments getDefaultParameters() { Arguments params = new Arguments(); params.addArgument("ip", "172.30.100.12"); // 定义一个参数,显示到Jmeter的参数列表中,第一个参数为参数默认的显示名称,第二个参数为默认值 params.addArgument("port", "3388"); params.addArgument("dbname", "qatest"); params.addArgument("username", "qatest"); params.addArgument("password", "qatest"); params.addArgument("tbname", "dh_buyer_search_product_prom_10"); params.addArgument("rowindex", "1"); params.addArgument("secrect", "L5U8R6X0"); params.addArgument("transparams",""); return params; } @Override public SampleResult runTest(JavaSamplerContext context) { int len = 0; results.sampleStart(); // 定义一个事务,表示这是事务的起始点,类似于LoadRunner的 // lr.start_transaction //arg1 = context.getParameter("arg1"); ip = context.getParameter("ip"); port = context.getParameter("port"); dbname = context.getParameter("dbname"); username = context.getParameter("username"); password = context.getParameter("password"); tbname = context.getParameter("tbname"); rowindex = context.getParameter("rowindex"); secrect = context.getParameter("secrect"); transparams = context.getParameter("transparams"); doSign(); results.sampleEnd(); // 定义一个事务,表示这是事务的结束点,类似于LoadRunner的 // lr.end_transaction return results; } public void doSign(){ Util tUtil = new Util(); try { results.setResponseCode("testStr:" + defautargs); results.setResponseMessage("Do Sign"); results.setResponseCode("UTF-8"); results.setResponseCodeOK(); results.setResponseData(tUtil.generateSign(tUtil.DoDBmap(ip, port, dbname, username, password, tbname, rowindex,transparams), secrect).getBytes("utf-8")); } catch (Exception e) { results.setSamplerData(e.getMessage()); results.setSuccessful(false); // 用于设置运行结果的成功或失败,如果是"false"则表示结果失败,否则则表示成功 } } /* public static void main(String arg[]){ DoMSign tDoMSign = new DoMSign(); HashMap tMap = new HashMap<String,String[]>(); tMap.put("app_key", new String[]{"E9DA9D6E"}); tMap.put("method", new String[]{"dhnew.Item.Get"}); tMap.put("item_id", new String[]{"154002958"}); tMap.put("v", new String[]{"1.1"}); tMap.put("session", new String[]{"120caea3-6f81-47fe-bb26-66df4b1f6334"}); tMap.put("channel", new String[]{"google"}); tMap.put("format", new String[]{"JSON"}); tMap.put("client", new String[]{"android"}); tMap.put("version", new String[]{"3.3.0"}); System.out.println(tDoMSign.generateSign(tMap, "L5U8R6X0")); } */ }代码测试通过后,进行打包,在myeclipse中右键工程->点击export->选择右侧列表的java->JAR file(这个包不是独立运行的,而是要部署到jmeter服务中),选择要打包的文件
执行打包,打包的文件拷贝到jmeter/lib/ext目录下
最好重新启动jmeter,然后创建java请求sampler,这时可以通过类名称选择我们加载的jar包内容
选择后,可以看到java中定义的参数,
而且,参数可以进一步进行参数化
运行后,执行java中定义的内容,本段代码中,主要进行了一个签名处理,
并返回一个结果,这个结果可以通过jmeter的查看结果树查看,并进一步将结果作为一个参数向后传递
同时,这里的transparams是一个可以添加多个参数的变量,因为有些时候接口获得的参数除了固定入参还会有一些辅助参数,比如时间戳,cookie,sessionid等,这种情况下,首先变量的种类是不确定的,其次变量的个数也可能不确定,作为本文中java的处理功能,是要对所有入参进行签名处理,那么就必须留有这个入口,当这个参数不填写即为空的情况,我们默认不处理,当有变量时,必须按照 paraname:paravalue的形式输入,当有多个参数时,则需要paraname1:paravalue1,paraname2:paraname2,....的形式录入
当然,这个java程序还引入了一个自定义的包Util,签名和transparams的处理都包含在其中,代码如下
package cn.customer.jmeter; import java.security.MessageDigest; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; public class Util { /** * 生成sign * @param params * @param secret * @return */ public static String generateSign(Map<String, String[]> params, String secret) { List<String> keyList = new ArrayList<String>(params.keySet()); System.out.println("keyList "+keyList); Collections.sort(keyList); StringBuffer param = new StringBuffer(); for (String key : keyList) { String[] values = params.get(key); param.append(key); if (values != null) { for (String val : values) { param.append(val); } } } param.append(secret); System.out.println(param); return "sign="+MD5(param.toString()).toUpperCase(); //return getMd5(param.toString()).toUpperCase(); } /** * MD5进行加密处理 * @param s * @return */ public static String MD5(String s) { char hexDigits[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; try { byte[] btInput = s.getBytes(); // 获得MD5摘要算法的 MessageDigest 对象 MessageDigest mdInst = MessageDigest.getInstance("MD5"); // 使用指定的字节更新摘要 mdInst.update(btInput); // 获得密文 byte[] md = mdInst.digest(); // 把密文转换成十六进制的字符串形式 int j = md.length; char str[] = new char[j * 2]; int k = 0; for (int i = 0; i < j; i++) { byte byte0 = md[i]; str[k++] = hexDigits[byte0 >>> 4 & 0xf]; str[k++] = hexDigits[byte0 & 0xf]; } return new String(str); } catch (Exception e) { e.printStackTrace(); return null; } } public static String getMd5(String s) { char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; try { byte[] strTemp = s.getBytes(); MessageDigest mdTemp = MessageDigest.getInstance("md5"); mdTemp.update(strTemp); byte[] md = mdTemp.digest(); int j = md.length; char str[] = new char[j * 2]; int k = 0; for (int i = 0; i < j; i++) { byte byte0 = md[i]; str[k++] = hexDigits[byte0 >>> 4 & 0xf]; str[k++] = hexDigits[byte0 & 0xf]; } return new String(str); } catch (Exception e) { return null; } } public static Map<String, String[]> DoDBmap(String ip,String port,String dbname,String username,String password,String tbname,String rowindex,String transparams) { try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } Connection conn = null; Statement stm = null; ResultSet rs = null; ResultSetMetaData rsm = null; HashMap tMap = new HashMap<String,String[]>(); String rsSign = null; String sql = "select * from "+tbname; HashMap tpMap = new HashMap<String,String>(); if(transparams.equals("")){ }else { try{ tpMap=getMap(transparams); System.out.println(tpMap.size()); }catch (Exception e) { // TODO: handle exception } } try { conn = DriverManager.getConnection("jdbc:mysql://"+ip+":"+port+"/"+dbname+"?user="+username+"&password="+password+"&connectTimeout=300000&useUnicode=true&characterEncoding=utf-8"); stm = conn.createStatement(); rs = stm.executeQuery(sql); rsm = rs.getMetaData(); rs.absolute(Integer.parseInt(rowindex)); for(int i=1;i<rsm.getColumnCount()+1;i++){ if(rsm.getColumnName(i).equals("sn")){ }else{ if(rs.getString(rsm.getColumnName(i)).equals("")){ }else{ System.out.println("tpMap size is "+tpMap.size()); if (tpMap.size()<1) { tMap.put(rsm.getColumnName(i), new String[]{rs.getString(rsm.getColumnName(i))}); }else { Iterator it = tpMap.keySet().iterator(); String key; String values; key = rsm.getColumnName(i); values = rs.getString(rsm.getColumnName(i)); while (it.hasNext()) { String keysub; String valuessub; keysub = it.next().toString(); valuessub = (String)tpMap.get(keysub); if (rsm.getColumnName(i).equals(keysub)) { key = keysub; values = valuessub; } } tMap.put(key, new String[]{values}); } } } } } catch (Exception e) { System.out.println(e); } finally { try { if (rs != null) rs.close(); } catch (SQLException e) { } try { if (stm != null) stm.close(); } catch (SQLException e) { } try { if (conn != null) conn.close(); } catch (SQLException e) { } } return tMap; } public static HashMap<String,String> getMap(String parameters) throws Exception{ HashMap inputMap = new HashMap<>(); String[] strparam = parameters.split(";;"); for (int i = 0; i < strparam.length; i++) { System.out.println(strparam[i]); inputMap.put(strparam[i].split(":")[0], strparam[i].split(":")[1]); } return inputMap; } }
相关文章推荐
- spring 文件上传
- java学习_File文件夹遍历
- Struts MVC与Spring MVC的区别
- java调用百度API生成短链接(二)
- java MD5加密代码
- Lunix下如何查看lunix版本和Weblogic/JDK版本
- java集合类详解
- Spring 事务管理
- (JXL)JAVA读取Excel数据(包含多个Sheet)
- ajax转递数组,springmvc后端接收
- java当中的定时器的4种使用方式
- java学习_File属性处理
- 遍历map的几种方式
- Java NIO.2 —— 文件或目录删除操作
- Java反射机制
- java之静态初始化块
- JVM执行Java程序的过程中管理的内存空间
- Java:类中代码的执行顺序
- Java实现常见的7种排序算法
- Java中用JXL导出Excel代码详解