千万级以上测试数据参数化-性能测试具体实现方式(jmeter、redis)

32 篇文章 0 订阅
6 篇文章 0 订阅

    笔者之前做过一个特别有印象的项目,测试数据量级为3000+万;因测试需求,需要测试工具或测试脚本把这些测试数据参数化来使用。

  • 常见的做法有以下几种:

     1)把测试数据提取出来放到指定文件中(txt/csv),对于参数化数据量少的性能场景,没问题。

          但测试数据一旦超过百万级,文件大小就可能几十M起步了,这样测试工具或脚本读取文件耗时较长,影响发压;

          如下图,mids文件中100万条数据,大小32.4M。

     2)把测试数据导入到数据库中,让测试工具或脚本去数据库中取值;

     3)把测试数据导入到redis中,redis做为数据源,测试工具或脚本每次从redis中取值;

         代码实现请参考  https://blog.csdn.net/junior77/article/details/113247649

  • 架构示意图对比

 

 

经过笔者实际验证,第三种方案比较适合大数据量测试数据取值(附本机实测,百万级数据,每次取值耗时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);
    }
}

如觉得对你有帮助,请记得点个赞,感谢支持...

版权声明:本文为博主原创文章,转载请附上博文链接!https://blog.csdn.net/junior77/article/details/113262838

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值