笔者之前做过一个特别有印象的项目,测试数据量级为3000+万;因测试需求,需要测试工具或测试脚本把这些测试数据参数化来使用。
- 常见的做法有以下几种:
1)把测试数据提取出来放到指定文件中(txt/csv),对于参数化数据量少的性能场景,没问题。
但测试数据一旦超过百万级,文件大小就可能几十M起步了,这样测试工具或脚本读取文件耗时较长,影响发压;
如下图,mids文件中100万条数据,大小32.4M。
2)把测试数据导入到数据库中,让测试工具或脚本去数据库中取值;
3)把测试数据导入到redis中,redis做为数据源,测试工具或脚本每次从redis中取值;
代码实现请参考 java代码实现批量数据插入redis(埋数)_埋点数据存储到redis-CSDN博客
- 架构示意图对比
经过笔者实际验证,第三种方案比较适合大数据量测试数据取值(附本机实测,百万级数据,每次取值耗时10ms左右,可接受,使用redis服务器效果更佳)。
以下为具体的java代码实现,供参考:
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
import redis.clients.jedis.Jedis;
import java.util.List;
import java.util.Random;
/**
* @author by dujiajun
* @date 2020/1/26.
*/
public class JmeterTest implements JavaSamplerClient {
static Jedis jimdb = null;
/**
* 产生指定范围随机数
* @param maxInt
* @return
*/
public int randomInt(int maxInt){
int max = maxInt;
int min = 10;
Random random = new Random();
return random.nextInt(max)%(max-min+1) + min;
}
/**
* jmeter中初始化部分
* @param javaSamplerContext
*/
@Override
public void setupTest(JavaSamplerContext javaSamplerContext) {
//初始化jimdb
jimdb = new Jedis("127.0.0.1",6379,1000);
}
/**
* jmeter中迭代部分
* @param javaSamplerContext
* @return
*/
@Override
public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
SampleResult sampleResult = new SampleResult();
//通过javaSamplerContext上下文获取key
String setKey =javaSamplerContext.getParameter("setKey");
String listKey =javaSamplerContext.getParameter("Listkey");
//获取redis中指定setKey的集合元素个数
//long setKeyLength = jimdb.scard(setKey);
//获取redis中指定listKey的集合元素个数
long listKeyLength = jimdb.llen(listKey);
//从集合元素个数中随机一个位置
int randomEnd = randomInt((int)listKeyLength);
sampleResult.sampleStart();
//从redis取值规则及个数,根据实际业务需要来
try {
//set类型key随机取一个mid值
String setRandMid = jimdb.srandmember(setKey);
//随机取10个mid值
List<String> setRandMids = jimdb.srandmember(setKey,10);
//list类型key随机取一个mid值
String listRandMid = jimdb.lindex(listKey,randomEnd);
//redis中List类型可以取key指定范围内的元素值
List<String> listRandMids =jimdb.lrange(listKey,randomEnd-9,randomEnd);
} catch (Exception e) {
e.printStackTrace();
}
/**
* 具体业务接口方法调用,根据实际业务来
* ........
*/
sampleResult.sampleEnd();
return sampleResult;
}
/**
* jmeter中结束部分
* @param javaSamplerContext
*/
@Override
public void teardownTest(JavaSamplerContext javaSamplerContext) {
jimdb.close();
}
/**
* 自定义传参
* @return
*/
@Override
public Arguments getDefaultParameters() {
Arguments arguments = new Arguments();
arguments.addArgument("setKey","smids");
arguments.addArgument("Listkey","lmids");
return arguments;
}
/**
* 测试用
* @param args
*/
public static void main(String[] args){
JmeterTest jmeterTest = new JmeterTest();
JavaSamplerContext cxt = new JavaSamplerContext(jmeterTest.getDefaultParameters());
jmeterTest.setupTest(cxt);
jmeterTest.runTest(cxt);
jmeterTest.teardownTest(cxt);
}
}
如觉得对你有帮助,请记得点个赞,感谢支持...
版权声明:本文为博主原创文章,转载请附上博文链接!千万级以上测试数据参数化-性能测试具体实现方式(jmeter、redis)_jmeter测试千万级数据性能-CSDN博客