• 用JMeter测试monggodb的请求


    JMeter测试MongoDB性能有两种方式,一种是利用JMeter直接测试MongoDB【即通过MongoDB协议测试】,另一种是写Java代码方式测试MongoDB【即通过java请求测试】

    注:

      1、用于插件不准,所以在使用JMeter直接测试MongoDB时例如find()、insert()等命令返回结果会不准,因此3.0里去掉了mongodb的协议,如果要用JMeter测试MongoDB我们一般选择写Java代码的方式【即第二种方式】,具体情况会在后面说明。

      2、JMeter2.10、JMeter2.11版本里有mongodb协议,3.0里无mongodb协议,如果想使用该协议注意JMeter版本的选择

    第一种JMeter直接进行测试MongoDB

    1.启动JMeter,新建线程组,设置线程组属性

    2.右键添加-MongoDB Source Config

    3.右键添加-Sampler-MongoDB Script

    4.右键-监听器-察看结果树

    可以看出JMeter测试count()命令结果和mongodb查询结果一直,但是JMeter由于插件不准,有的命令不准,例如find()、insert()命令,具体如下:

    insert命令测试:

     insert测试结果:

     会发现虽然请求发送成功了,但是返回的结果是一串很长的字符串,很难确定插入是否成功,通过客户端查询,数据已插入成功;JMeter直接录入db.foo.find()和insert()命令响应结果相似,响应结果也是一串类似字符串,而不是数据结果,所以我们一般不用该种方法测试mongodb,具体如下图:

     

    第二种JMeter结合Java代码测试MongoDB

    1.编写Java代码,内容如下:

    package com.test.mongodb;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.UUID;
    import java.util.concurrent.atomic.AtomicLong;
    
    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 com.mongodb.BasicDBObject;
    import com.mongodb.DB;
    import com.mongodb.DBCollection;
    import com.mongodb.DBObject;
    import com.mongodb.Mongo;
    import com.mongodb.MongoOptions;
    import com.mongodb.ServerAddress;
    import com.mongodb.WriteResult;
    
    public class TestMongodb extends AbstractJavaSamplerClient{
        private static Mongo m;  
        private static DB db;  
       // private static AtomicLong read_key = new AtomicLong(0);  
        //private static FileOutputStream fos;  
        static {  
            try {  
                //MongoDB连接池配置
                //fos = new FileOutputStream(new File("jmeter_error.log"));  
                MongoOptions options = new MongoOptions();  
                //options.autoConnectRetry = true;  
                options.connectionsPerHost = 1000;  
                options.maxWaitTime = 5000;  
                options.socketTimeout = 0;  
                options.connectTimeout = 15000;  
                options.threadsAllowedToBlockForConnectionMultiplier = 5000;  
                m = new Mongo(new ServerAddress("127.0.0.1", 27017), options);  
                db = m.getDB("myTest");  //获取myTest数据库 
            } catch (Exception e) {  
                throw new RuntimeException(e);  
            }  
        }  
      
        public Arguments getDefaultParameters() {
            Arguments params = new Arguments();
            params.addArgument("rw", "w");
            return params;
        }
        
        public SampleResult runTest(JavaSamplerContext context) {  
            // System.out.println(read_key.getAndIncrement());  
            SampleResult results = new SampleResult();  
            //System.out.println(context.getParameter("rw"));  
            results.sampleStart();
          //1、获取一个集合foo
            DBCollection coll = db.getCollection("foo"); //获取一个集合foo 
          //2、对集合foo进行插入操作
            if ("w".equalsIgnoreCase(context.getParameter("rw"))) {  
               // long key = 1;  
                //2.1 构造一个文档doc
                BasicDBObject doc = new BasicDBObject(); 
                //2.2 向文档中放入数据
                doc.put("_id", UUID.randomUUID());  
                doc.put("_class", "com.iflashbuy.bi.source.pojo.AreaDataEntity");  
                doc.put("province", "广东");  
                doc.put("city", "广州");  
                doc.put("pv", 35522924);  
                doc.put("uv", 52556);  
                doc.put("orderCount", 963);  
                doc.put("orderTotal", 1548563);  
                doc.put("entpriseCode", "00540001");  
                //2.3 将文档插入到集合foo中
                coll.insert(doc);
            }  
    
            results.setSuccessful(true);  
            results.sampleEnd();  
            return results;  
        }  
        
        /*public static void main(String args[]) throws Exception {  
            Arguments a = new Arguments();  
            a.addArgument("rw", "w");  
            final JavaSamplerContext c = new JavaSamplerContext(a);  
            long startTime = System.currentTimeMillis();  
            for (int i = 0; i < 5; i++) {  
                new Thread() {  
                    public void run() {  
                        TestMongodb t = new TestMongodb();  
                        for (int j = 0; j < 2; j++) {  
                            t.runTest(c);  
                        }  
                    }  
                }.start();  
            } 
            long endTime = System.currentTimeMillis(); 
            System.out.println(endTime-startTime);
        } */ 
        
    }  

    注:在编写java代码时要引入几个包,如图

    2.生成jar包,放在Jmeter_HOME/lib/ext文件夹下

    3.启动JMeter,新建线程组,Java请求,察看结果树,聚合报告

  • 相关阅读:
    nodejs日志管理log4js
    js数组去重的几种方法
    Echarts同一页面多个图表自适应浏览器窗口大小——window.onresize
    Echarts自适应浏览器大小
    [原创]Nodejs 远程执行linux shell
    ssh无需密码登录linux服务器
    Nodejs mysql pool使用实例
    Activity基础知识
    最大熵模型介绍
    node-sass element-plus 安装失败
  • 原文地址:https://www.cnblogs.com/lyftest/p/5913442.html
Copyright © 2020-2023  润新知