欢迎, 游客
用户名 密码: 记住我
Jmeter 性能测试工具专版
  • 页:
  • 1

主题: Jmeter Redis sampler 测试采样器 代码

Jmeter Redis sampler 测试采样器 代码 2016-02-02 18:35 #1

  • admin
  • 离线
  • 超级Boss
  • Big Boss
  • 帖子: 92
  • 声望: 1
Jmeter Redis sampler 测试采样器

1. JavaRedisSampler.jar 放到 ${jmeter_home}/lib/ext 下


游客无法查看附件,请登录后查看。



1)支持redis cluster

2) 支持 redis standalone

备注: 如果ext 下有 JMeterPlugins-ExtrasLibs.jar (jmeter-plugins 的插件) 先移走, 和 Jedis 最新的库v2.8有冲突。

2. jedis-2.8.0.jar 放到 ${jmeter_home}/lib/ 下, 把 旧的jesis版本移走该目录。

3. JmeterRedis.rar 是 源代码

4. redis.jmx 是脚本例子

5. 源代码如下或者直接下载附件后解压,其中的JmeterRedis.rar 为源代码。 下载地址见这里。

6. 使用示例。

1)redisServerList 示例 ip:port,ip:port (如果当 isCluster 为 true时,这里可以填写多个,逗号分隔。 如果为false,只填写一个即可。

2) isCluster , true 或者 false。 表示是否为cluster模式。 如果是false,则就是 standalone模式。

3) method , 仅支持 get 和 setex 两条命令。

4) key 这里仅指定key的前缀, 后面部分uuid自动生成。 即 key_${uuid生成部分} key仅是前缀的定义。

5) value 当setex的时候,value为set的值。 get时不使用该参数。

6) isPersist , isPersist 为true时, 则 setex 的该key 没有失效时间。即ttl 为 -1 , 如果为false,则会有expired的情况。


 
JavaRedisSampler.class
 
package com.hissummer.redis.test;
 
 
 
import java.math.BigInteger;
 
import java.security.SecureRandom;
 
import java.util.Date;
 
import java.util.HashSet;
 
import java.util.Iterator;
 
import java.util.Set;
 
 
 
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 org.apache.log.Logger;
 
 
 
import redis.clients.jedis.HostAndPort;
 
import redis.clients.jedis.Jedis;
 
import redis.clients.jedis.JedisCluster;
 
 
 
public class JmeterRedisSampler extends AbstractJavaSamplerClient{
 
 
 
 
 
/**
 
* 输出到Jmeter控制台的日志类.
 
* 需要引用Jmeter lib目录下的logkit-2.0.jar.
 
*/

 
 
 
private Logger log = getLogger();
 
/**
 
* 运行结果.
 
*/

 
private SampleResult results;
 
/**
 
* Jmeter控制台输入的参数.
 
*/

 
 
 
 
 
private String redisServerList;
 
private String method;
 
private String key;
 
private String value;
 
private boolean checkparameter;
 
private Set<HostAndPort> HostandPort ;
 
private String response;
 
private boolean isCluster;
 
private boolean isPersist;
 
private long startime;
 
private long endtime;
 
private StringBuilder ret;
 
private Object redisclient ;
 
 
 
 
 
/**
 
* 初始化方法,实际运行时每个线程仅执行一次,在测试方法运行前执行,<br>
 
* 类似于LoadRunner中的init方法.
 
*/

 
 
 
public void setupTest(JavaSamplerContext arg0) {
 
 
 
 
 
 
 
//log.info("execute setupTest...");
 
checkparameter = true;
 
HostandPort = new HashSet<HostAndPort>();
 
 
 
redisServerList = arg0.getParameter("redisServerList", "");
 
method = arg0.getParameter("method", "");
 
 
 
response = "not found the key";
 
//key = arg0.getParameter("key", "");
 
//value = arg0.getParameter("value", "");
 
isPersist = arg0.getParameter("isPersist","").equals("true")?true:false;
 
 
 
isCluster = arg0.getParameter("isCluster", "").equals("true")?true:false;
 
 
 
ret = new StringBuilder();
 
 
 
Iterator<String> itr = arg0.getParameterNamesIterator();
 
 
 
while(itr.hasNext()) {
 
 
 
String element = (String) itr.next();
 
 
 
if(arg0.getParameter(element,"").equals(""))
 
{
 
//log.info(element+" 参数为空");
 
checkparameter=false;
 
}
 
 
 
String tempString = element + ":" + arg0.getParameter(element,"")+"\n";
 
 
 
//log.info(tempString);
 
 
 
ret.append(tempString);
 
 
 
}
 
 
 
 
 
String[] servers = redisServerList.split(",", -1);
 
 
 
for(int i = 0 ; i < servers.length ; i++)
 
{
 
String[] hostandport = servers[i].split(":",-1);
 
 
 
if(!hostandport[0].equals("") && !hostandport[1].equals(""))
 
 
 
HostandPort.add(new HostAndPort(hostandport[0],Integer.valueOf( hostandport[1])));
 
 
 
else {
 
// log.info(" host or port 不应该为空"+hostandport[0]+hostandport[1]);
 
checkparameter= false;
 
 
 
}
 
 
 
}
 
 
 
 
 
if(servers.length > 1 && !isCluster)
 
{
 
//log.info(" 多个redis server但未设置集群模式");
 
checkparameter=false;
 
}
 
 
 
 
 
if(isCluster)
 
{
 
redisclient = new JedisCluster(HostandPort);
 
}
 
else
 
{
 
Iterator<HostAndPort> iter = HostandPort.iterator();
 
HostAndPort first = (HostAndPort) iter.next();
 
redisclient = new Jedis(first.getHost(),first.getPort());
 
}
 
}
 
 
 
/**
 
* 设置传入的参数,可以设置多个,已设置的参数会显示到Jmeter的参数列表中.
 
*/

 
 
 
 
 
public Arguments getDefaultParameters() {
 
//log.info("execute getDefaultParameters...");
 
Arguments params = new Arguments();
 
 
 
/*
 
* 定义一个参数,显示到Jmeter的参数列表中,
 
* 第一个参数为参数默认的显示名称,
 
* 第二个参数为默认值
 
*/

 
params.addArgument("redisServerList", "127.0.0.1:6379");
 
params.addArgument("isCluster", "false");
 
params.addArgument("method", "setex|get|ttl...");
 
params.addArgument("key", "key");
 
params.addArgument("value", "value");
 
params.addArgument("isPersist", "false");
 
 
 
return params;
 
}
 
/**
 
* 测试执行的循环体,根据线程数和循环次数的不同可执行多次,类似于LoadRunner中的Action方法
 
* {@inheritDoc}
 
*/

 
 
 
@Override
 
public SampleResult runTest(JavaSamplerContext arg0) {
 
//log.info("execute runTest...");
 
// //定义一个事务,表示这是事务的起始点,类似于LoadRunner的lr.start_transaction
 
//
 
// //定义一个事务,表示这是事务的结束点,类似于LoadRunner的lr.end_transaction
 
//
 
 
 
key = arg0.getParameter("key", "")+ new BigInteger(130, new SecureRandom()).toString(32);
 
 
 
value = arg0.getParameter("value", "");
 
 
 
startime = new Date().getTime();
 
 
 
results = new SampleResult();
 
 
 
//log.info("init..." + results.getTime() + " "+ results.getStartTime()+ " "+results.getEndTime());
 
 
 
results.sampleStart();
 
 
 
//log.info("after start..." + results.getTime() + " "+ results.getStartTime()+ " "+results.getEndTime());
 
 
 
results.setSamplerData(ret.toString()+" \n actualkey: "+key );
 
 
 
// 如果参数有一项为空检查错误,则直接返回错误
 
if(!checkparameter) {log.info("fail..."); results.setSuccessful(false); return results;}
 
 
 
 
 
 
 
 
 
if(isCluster)
 
{
 
 
 
if(method.equals("setex")){
 
response = ((JedisCluster) redisclient).setex(key, 5000, value);
 
if(isPersist)
 
((JedisCluster) redisclient).persist(key);
 
}
 
else if(method.equals("get"))
 
response = ((JedisCluster) redisclient).get(key);
 
 
 
else if(method.equals("ttl"))
 
response = String.valueOf(((JedisCluster) redisclient).pttl(key));
 
else log.info("暂不支持此命令...");
 
}
 
else
 
{
 
if(method.equals("setex"))
 
{
 
response = ((Jedis) redisclient).setex(key, 5000, value);
 
if(isPersist)
 
((Jedis) redisclient).persist(key);
 
}
 
else if(method.equals("get"))
 
response = ((Jedis) redisclient).get(key);
 
 
 
else if(method.equals("ttl"))
 
response = String.valueOf(((Jedis) redisclient).pttl(key));
 
else log.info("暂不支持此命令...");
 
}
 
 
 
if(null == response) response = "not found the key";
 
results.setResponseData(response, "utf-8");
 
results.setSuccessful(true);
 
results.setResponseCodeOK();
 
results.setEndTime(System.currentTimeMillis());
 
//results.sampleEnd();
 
//log.info("Success..." + results.getTime() + " "+ results.getStartTime()+ " "+results.getEndTime());
 
//long endtime = new Date().getTime();
 
 
 
return results;
 
}
 
 
 
/**
 
* 结束方法,实际运行时每个线程仅执行一次,在测试方法运行结束后执行,<br>
 
* 类似于LoadRunner中的end方法.
 
*/

 
public void teardownTest(JavaSamplerContext arg0) {
 
 
 
results.cleanAfterSample();
 
//results.setStartNextThreadLoop(true);
 
}
 
 
 
}
I'm the Boss. lol!
最后修改: 2016-02-02 18:47 由 admin.
  • 页:
  • 1