您的位置:首页 > 编程语言 > Java开发

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.代码

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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: