zoukankan      html  css  js  c++  java
  • jmeter压力测试笔记- HTTP协议

    一、目标

      使用jmeter进行HTTP接口压力测试;

      命令行方式运行,方便在linux环境运行;

    二、面临的问题

    1. 支持多环境测试(开发、测试、生产环境)
    2. 支持用户数据、线程数、循环次数等配置在运行时自定义
    3. 测试时HTTP包头需要带token, token只能在登录时获取;

    三、解决办法

    • 问题1,2解决思路:配置信息参数化。

        jmeter支持在任意可输入位置使用函数,jmeter内置函数支持使用传入变量。使用这两个特性可以把配置在运行时传入

        使用方法:

          传入: -J参数名=参数值

          使用:${__P(参数名, 默认值)}

        使用示例(传入线程数配置):

          传入: 命令行执行方式 /jmeter安装目录/bin/jmeter -n -Jthreadnums=10

          使用:在线程数配置处填写:${__P(threadnums, 1)}

    • 问题3解决思路:用户登录后信息自动生成到csv文件

        创建独立的用户登录脚本,脚本读取用户基本信息,登录后把结果格式化输出到csv文件,供其他测试脚本使用。这样每次执行测试前, 执行一下登录脚本即可,不再需要人工准备测试用户数据。

    四、用户登录脚本示例

              

        系统需要使用手机号+设备号进行登录

        预设:登录脚本user.login.jmx, 用户信息文件phone_dev.csv

        步骤1:创建csv文件,每行包含2列(手机号、设备号),逗号分隔。需要多少测试用户则创建多少行数据

        步骤2:打开jmeter, 创建测试脚本, 保存名字为user.login.jmx

        步骤3:为登录脚本增加CSV Data Set Config, 从phone_dev.csv读取用户信息

          关键配置项:

           Filename: ${__P(csv, )}              // 传入csv文件路径

           Variable Names: ${__P(var, )}    // csv变量列表

           Stop thread on  EOF:true            // csv读取到结尾就结束执行。

        步骤4:增加[HTTP信息头管理器]、[高斯随机定时器]、[用户自定义变量]、[查看结果树]

        步骤5:增加HTTP请求, 改名为[1获取短信验证码]

            此接口是专为测试增加的接口, 直接返回短信验证码

            增加请求参数mobile:${mobile}; deviceId:${deviceId}(引用csv变量)

            下级增加响应断言, 验证应答结果正确性

            下级增加正则表达式提取器, 提取验证码

        步骤6:增加HTTP请求,改名为[2用户登录]

            下级增加响应断言,验证应答结果正确性

            下级增加三个正则表达式提取器, 提取token, uid, gid变量,用于输出到csv

        步骤7:[2用户登录] 下级增加置处理器:Beanshell PostProcessor, 分析登录结果并保存到csv文件

            这个是重点, 能输出到csv文件就靠它了。

            Beanshell在Java的语法基础上增加了自己的全局变量, 有java基础就可以很方便的进行Beanshell脚本开发, 这个脚本生成 的文件每行包含2个用户,方便压测时测试用户间交互;

            

     1 // 读取变量
     2 randnums = vars.getObject("randnums");
     3 url=props.get("apiurl");
     4 filepath = "";
     5 t_uid= vars.getObject("t_uid");
     6 t_devid=vars.getObject("t_devid");
     7 t_token=vars.getObject("t_token");
     8 
     9 // 判断环境
    10 if (url != null) {
    11     if(url.equals("dev-api.domain.com")) {
    12         filepath = "devapi-user.csv";
    13     } else if(url.equals("test-api.domain.com")) {
    14         filepath = "testapi-user.csv";
    15     } else {
    16         filepath = "api-user.csv";
    17     }
    18 }
    19 
    20 // 获取文件绝对路径 
    21 file = new File(filepath).getAbsoluteFile();
    22 
    23 // 第一个用户请求时请求清空文件
    24 if(randnums == null) {
    25     
    26     log.info("******* user csv file:" + file.getPath());
    27 
    28     randnums = 0;
    29     fos = new FileOutputStream(file);
    30     fos.write("".getBytes());
    31     fos.close();
    32     
    33 }
    34 
    35 // 第二个用户开始写入文件 (每行有两个用户的信息)
    36 if(t_uid != null) {
    37     fos = new FileOutputStream(file, true);
    38     // uid,gid,mobile,deviceId,token
    39     str = randnums 
    40         + "," + vars.get("uid") 
    41         + "," + vars.get("gid") 
    42         + "," + vars.get("mobile") 
    43         + "," + vars.get("deviceId") 
    44         + "," + vars.get("token")
    45         + "," + t_uid
    46         + "," + t_devid
    47         + "," + t_token 
    48         + "
    ";
    49     fos.write(str.getBytes());
    50     fos.close();
    51 }
    52 
    53 // 保存变量用于下次循环使用
    54 randnums = new Integer(randnums + 1);
    55 vars.putObject("randnums", randnums);
    56 
    57 vars.putObject("t_uid", vars.get("uid"));
    58 vars.putObject("t_devid", vars.get("deviceId"));
    59 vars.putObject("t_token", vars.get("token"));

    五、用户登录脚本调用示例

      /jmeter安装目录/bin/jmeter -n -Jcsv=/usr/local/jmeter/phone_dev.csv -Jvar=mobile,deviceId -t /usr/local/jmeter/user.login.jmx

    六、其他测试脚本说明

      其他脚本与登录脚本类似, 只需把HTTP请求改成实际测试的接口

      调用: /jmeter安装目录/bin/jmeter -n -Jcsv=/usr/local/jmeter/dev_user.csv -Jvar=uid,gid,mobile,deviceId,token,t_uid,t_deviceId,t_token -t /usr/local/jmeter/other.test.jmx

    七、后记

      在实际使用中,已经达到所有可配置参数都采用传参方式。另外,脚本调用每次需要传递大量参数,容易出错, 开发了简单的shell脚本进行封装, 可以很方便的调用: ./runjmeter -api -jmx aaaa.jmx -threadnums 10 -loops 99999

      

  • 相关阅读:
    AcWing每日一题--数字三角形
    AcWing每日一题--货仓选址
    Codeforces Round #693
    动态规划--多重背包
    动态规划--完全背包
    动态规划--01背包
    博弈论--SG函数
    博弈论--Nim游戏
    基础数论--容斥定理
    基础数论--卡特兰数
  • 原文地址:https://www.cnblogs.com/dankewoniu/p/4578858.html
Copyright © 2011-2022 走看看