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

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

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

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

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

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

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

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

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

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

  • 架构示意图对比

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

 

 

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

经过笔者实际验证,第三种方案比较适合大数据量测试数据取值(附本机实测,百万级数据,每次取值耗时10ms左右,可接受,使用redis服务器效果更佳)。

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

以下为具体的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 setRandMids = jimdb.srandmember(setKey,10);
            //list类型key随机取一个mid值
            String listRandMid = jimdb.lindex(listKey,randomEnd);
            //redis中List类型可以取key指定范围内的元素值
            List 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

你可能感兴趣的:(redis,JAVA,Jmeter,大数据,redis,java,jmeter,数据库)