zoukankan      html  css  js  c++  java
  • jmeter 发送http请求,并把获取到的请求的订单信息保存到文件中

    有一个任务,需要频繁发送订单请求,并分析订单请求中有没有存在重复订单号,思路是用jmeter 发送http请求,使用正则表达式获取到订单号,并把订单号和线程号作为参数提供给java请求,在java请求中把订单号写到包括有线程号的命名文件中。完成出来的样子是这样的

    步骤如下:

    1、Jmeter 发送http请求

      1) 右键点击线程组> 添加 > 配置元件 > HTTP信息头管理器 ,新建HTTP信息头管理器 

    2) 右键点击线程组> 添加 > Sampler > HTTP请求,新建HTTP请求

    2,在下单过后返回部分信息如下:"msg":"下单成功","result":"1","sendCode":"96828628","weektm":"星期二,12:00"

    右键点击线程组> 添加 > 后置处理器 > 正则表达式提取器,新建 正则表达式提取器  ,获取sendCode 后面的值96828628  正则表达式填写:"sendCode":"(d{8}),这样订单号就保存在变量sendCode中

    3、到此,订单号sendCode已经获取到,需要把这个订单号保存到文件中,可以采用“保存响应到文件”  把响应保存到以线程命名的文件中,但是不好的是一个文件只能保存一个结果,不能往结果中追加结果,对于后期汇总不方便

    这里使用了java请求来处理,按线程文件名命名,把同一个线程所有的响应结果保存到同一个文件中,n个线程就保存n个文件,这样就使用了java请求,java请求需要做的有

      1)新建一个java项目,在java项目里面新建一个java类AppendFile  功能是往文件中追加内容,另外一个方法是找重复内容,如果内容有重复,就保存到另外一个文件中

    package editFile;
    
    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.IOException;
    import java.io.RandomAccessFile;
    import java.util.HashSet;
    import java.util.Set;
    
    public class AppendFile {
        public static void main(String[] args) {
            AppendFile a = new AppendFile();
            /*        a.appendFile("E:\dd.txt", "222222222222222");
            a.appendFile(""E:\jmeter\sameText.txt"", "333333333");*/
        String allSendCode =     a.read("E:\jmeter\sameText.txt");
    //    System.out.println(allSendCode);
    
        }
    
        public   void appendFile(String fileName, String content) {
            try {
                // 打开一个随机访问文件流,按读写方式
                RandomAccessFile randomFile = new RandomAccessFile(fileName, "rw");
                // 文件长度,字节数
                long fileLength = randomFile.length();
                // 将写文件指针移到文件尾。
                randomFile.seek(fileLength);
                randomFile.writeBytes(content + "
    ");
                randomFile.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        /**
         * 读取文件,并判断文件中是否有重复内容,如果有重复内容,把重复内容保存到另外一个文件
         * @param filePath
         * @return
         */
        @SuppressWarnings({ "rawtypes", "unchecked" })
        public String read(String filePath) {
            BufferedReader br = null;
            String line = null;
            StringBuffer buf = new StringBuffer();    
            Set set = new HashSet();
            
            try {
                br = new BufferedReader(new FileReader(filePath));
                int lineCount = 0;
                while ((line = br.readLine()) != null) {
                    buf.append(line + "
    ");
                    lineCount = lineCount + 1;
                    if(!set.add(line)){
                        AppendFile a = new AppendFile();
                        a.appendFile("E:\jmeter\sameTextRepeat.txt", line);
                        
                    }
                    System.out.println(lineCount+":"+line);
    
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
    
                if (br != null) {
                    try {
                        br.close();
                    } catch (IOException e) {
                        br = null;
                    }
                }
            }
    
            return buf.toString();
        }
    
    }

      2)java项目里面添加java请求类WriteResult ,作用是从jmeter获取订单号和线程号,并使用订单号和线程号 写人文件,同时jmeter 性能测试的java请求也是这样来实现的,按照格式在runTest 中做各种请求。

    package editFile;
    
    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;
    
    public class WriteResult implements JavaSamplerClient {
        private SampleResult results;
        private String senCode;
        private String threadNumber;
        
        // 设置从jmeter传入参数
        public Arguments getDefaultParameters() {
            Arguments params = new Arguments();
            params.addArgument("senCode", "0");// 设置senCode参数
            params.addArgument("threadNumber", "0");// 设置threadNumber
            return params;
        }
    
        // 初始化方法,性能测试时只执行一次
        public void setupTest(JavaSamplerContext arg0) {
            
        }
    
        // 重复执行测试的地方
        public SampleResult runTest(JavaSamplerContext arg0) {
            senCode = arg0.getParameter("senCode"); // 获取jmeter传入的参数值,
            threadNumber = arg0.getParameter("threadNumber"); // 获取jmeter传入的参数值,
            results = new SampleResult();
            results.sampleStart();// jmeter 开始统计响应时间标记
        
                AppendFile.appendFile("E:\jmeter\"+threadNumber+".txt", senCode);
                
                if(senCode.length() ==8){
                results.setSuccessful(true);
                results.setResponseData("threadNumber:"+threadNumber+"|senCode:"+senCode, null);
                }else{
                    results.setSuccessful(false);
                    results.setResponseData("threadNumber:"+threadNumber+"|没有获取到验证码    ", null);
                }
            
                results.sampleEnd();// jmeter 结束统计响应时间标记
        
            return results;
        }
    
        // 结束方法,实际运行时每个线程仅执行一次,在测试方法运行结束后执行
        public void teardownTest(JavaSamplerContext arg0) {
        }
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
        }
    }

     把java项目文件导出jar包,放在jmeter 的lib/ext 文件夹中

    打开jmeter添加一个jmeter 的java请求, 右键点击线程组> 添加 > Sampler > java请求,  选中测试类,会自动显示2个参数 sendCode 和threadNumber(这2个参数是在java请求类的的方法中设置:public Arguments getDefaultParameters()

    sendCode  = ${sendcode}

    threadNumber = ${__threadNum}

      

     使用3个线程执行多次,结果如下:

     另外使用bean shell  也能保存文件,右键点击线程组> 添加 > 后置处理器 > BeanShell PostProcessor 新建beanshell,需要在bean shell中写代码

    import editFile.*;
    import org.apache.jmeter.threads.JMeterContextService;
    int  threadNumber = JMeterContextService.getNumberOfThreads();
    String sendCode = vars.get("sendcode"); //把获取的sendcode 变成bean shell变量值
    AppendFile.appendFile("E:\jmeter\result"+threadNumber+".txt", sendCode);
    System.out.println("finished");
            

    但是 获取的线程号代码都是1,因此所有的订单号都保存在同一个文件中,不知道这样会不会都在写同一个文件导致文件不全,要测试下才知道

  • 相关阅读:
    MHA-Failover(GTID,Auto_Position=0)
    PXC中的GTIDs
    MySQL备份与恢复
    MySQL复制框架
    pt-table-checksum检测不出主从差异处理
    MHA-Failover可能遇到的坑
    MHA-手动Failover流程(传统复制&GTID复制)
    MSSQL-SELECT&UPDATE动作要申请的锁
    sybench压测下模拟误truncate数据恢复
    gtid_executed和gtid_purged变量是如何初始化的
  • 原文地址:https://www.cnblogs.com/testway/p/6663964.html
Copyright © 2011-2022 走看看