JMeter性能测试实战

JMeter主要特性

  • 开源免费
  • 支持多种协议,如HTTP、TCP、JDBC…
  • 支持多种数据格式,如json、xml…
  • GUI 和命令行两种操作方式
  • 支持分布式测试
  • 内置组件丰富
  • 支持插件和扩展
  • 多种输出格式
  • 跨平台支持,Window、Mac、Centos…

JMeter启动提示

不要使用GUI模式进行负载测试 GUI模式只是压测脚本的创建和调试
Dont use GUI mode for load testing !, only for Test creation and Test debugging.
/# 如果想要进行负载测试 使用CLI模式 即非GUI模式 – 静默压测会详细介绍
For load testing, use CLI Mode (was NON GUI):
jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]
/# 可以增加Java的堆来满足压测需求
& increase Java Heap to meet your test requirements:
/# 修改JMeter文件的Java堆变量
Modify current env variable HEAP=“-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m” in the jmeter batch file

压测脚本四要素

  • 一个Jmeter脚本中测试计划只有一个
  • 测试计划中至少有一个线程组
  • 至少有一个取样器
  • 至少有一个监听器

压测产品介绍

  • 被压测演示例子程序说明:
    • 仅为用于课堂演示,被压测程序,无实际业务逻辑,Mock应用
    • 简单模拟一个订餐业务逻辑的Restful API 接口交互业务逻辑过程
    • 包含POST 、 GET、DELETE 请求
    • 使用python 3编写,源码在iJmeter项目中,python3 运行
    • https://github.com/princeqjzh/iJmeter

需求说明

  • 被压测演示例子程序说明:
  • 包含4个练习用接口
  • Demo:
    • 运行一下
    • 源码讲解用法

用户登录

  • 定义请求名称:用户登录
  • 配置 Host 、Port、Path = /api/v1/user/login
  • 配置 Method = POST
  • 在Http Request中添加 Http Header Manager, 管理该请求的header信息
  • 添加 “View Result Tree” 用于查看 请求/响应 详情

请求头提取

  • 在Http Header Manager中配置如下参数
    • Content-Type : application/json
    • access_token:python 源码中查找

浏览菜单

  • 创建浏览菜单接口请求
    • 添加HttpRequest请求
    • 配置请求名称:浏览菜单
    • 输入hostname, port, path = /api/v1/menu/list
    • 设定 Method = GET
  • 添加HTTP头管理器。

jmeter中文显示问题的解决

  • 解决乱码问题 → 在<jmeter_home>/bin/jmeter.properties配置文件中设置 sampleresult.default.encoding=utf-8
  • 解决Unicode 显示成可读中文的问题 → 将 <ijmeter_proj>/unicode2utf8/unicode2utf8.js 内容复制粘贴到 BeanShell PostProcessor 中

JMeter乱码解决

String s2 = new String(prev.getResponseData(), "UTF-8");
//---------------一下步骤为转码过程---------------
char aChar;
int len = s2.length();
StringBuffer outBuffer = new StringBuffer(len);
for (int x = 0; x < len;)
{
    aChar = s2.charAt(x++);
    if (aChar == '\\') {
        aChar = s2.charAt(x++);
        if (aChar == 'u') {
            int
            value = 0;
            for (int i = 0;
            i < 4;
            i++
        )
            {
                aChar = s2.charAt(x++);
                switch (aChar) {
                    case'0':
                    case'1':
                    case'2':
                    case'3':
                    case'4':
                    case'5':
                    case'6':
                    case'7':
                    case'8':
                    case'9':
                        value = (value << 4) + aChar - '0';
                        break;
                    case'a':
                    case'b':
                    case'c':
                    case'd':
                    case'e':
                    case'f':
                        value = (value << 4) + 10 + aChar - 'a';
                        break;
                    case'A':
                    case'B':
                    case'C':
                    case'D':
                    case'E':
                    case'F':
                        value = (value << 4) + 10 + aChar - 'A';
                        break;
                    default:
                        throw new IllegalArgumentException(
                            "Malformed   \\uxxxx  encoding.");
                }
            }
            outBuffer.append((char)
            value
        )
            ;
        } else {
            if (aChar == 't')
                aChar = '\t';
            else if (aChar == 'r')
                aChar = '\r';
            else if (aChar == 'n')
                aChar = '\n';
            else if (aChar == 'f')
                aChar = '\f';
            outBuffer.append(aChar);
        }
    } else
        outBuffer.append(aChar);
}
//-----------------以上内容为转码过程---------------------------
//将转成中文的响应结果在查看结果树中显示

prev.setResponseData(outBuffer.toString());

订单确认

  • 创建订单确认接口请求
    • 添加HttpRequest请求
    • 配置请求名称:订单确认
    • 输入hostname, port, path = /api/v1/menu/confirm
    • 设定 Method = POST

http与https协议的区别

  • HTTP: 超文本传输协议
  • HTTPS:安全超文本传输协议
  • 安全保障三原则:
    • 内容加密:采用混合加密技术,中间者无法直接查看明文内容
    • 验证身份:通过证书认证客户端访问的是自己的服务器
    • 保护数据完整性:防止传输的内容被中间人冒充或者篡改

创建https请求

  • 网站使用机构可信证书:直接选择https协议即可
  • 网站使用自建证书: 将网站证书导入ssl manager 或 添加到系统的信任列表中 即可使用https协议

创建https请求

  • 添加到ssl manager 中, 加入对应证书的key文件。位置: /application/cert_files/
  • 运行时需要输入密码: 1234

本章小结

  • POST,GET, DELETE 接口请求
  • 请求中的配置参数 host, port, path
  • body data中的请求参数 - json
  • Http Request Header
  • 接口响应结果
  • 一点点调试小技巧 – 接口错误 vs 接口没有(404)

Json后置处理器

不同的用户登录会是不同的token,需要把信息头的token不能固定,要根据不同的用户返回的结果放入。

CSV多用户导入

  • 从 CSV文件中导入多用户名 + 密码
  • 解析access token,获得用户的正确认证标识
  • jmeter中的参数传递

并发压测中的事务控制

  • 如果需要统计一组请求完成的总计时间,可以考虑使用事务控制器
  • 方法: 把需要统计的请求样本放入事务控制器中

静默压测

  • 静默 → 脱离UI运行JMeter压测
  • 好处:命令运行更容易“搞事情”
  • 命令格式: jmeter –n –t jmxfile −l jtl_file
  • jmx: JMeter压测程序脚本文件,压测控制过程记录在jmx文件中
  • jtl 文件是JMeter压测请求响应数据的原始文件
jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]

-n.:nongui
-t :testfile
-l: logfile
-e: 测试结束后的报告
-o :outputflolder 报告输出的文件地址
jmeter -n -t 压测脚本.jmx -l 不存在的文件名.jtl -e -o 为空的文件夹名 -J参数名1=参数值1  -J参数名2=参数值2

Web压测报告生成

  • 命令格式: jmeter -g /fullpath/result-file -e -o /fullpath/report/folder

自动化压测

  • 为啥要自动化压测呢?
    • 手动逐步加压
    • 需要人肉改并发数,然后等待完成
    • 烦 !!!!!
  • 所以,制定好策略,让程序自动加压,自动等待;完成后看压测监控记录,或者坐收报告
  • 计算机努力的干活,我去做更重要的事情
  • 希望测试生涯由此变得美好一些

自动化压测

  • 实现思路:
  • JMeter 脚本 (.jmx 文件) - 压测逻辑 与 xml 文件
  • Shell – 控制逻辑
  • JMeter 静默运行 – 脱离UI限制,使得自动化运行更稳定 jmeter –n –t jmxfile−l jtl_file
    注: jtl 文件是jmeter压测请求响应数据的原始文件

自动化压测

  • 生成Web Report,命令: jmeter -g <jmx_file> -e -o <web_report_path>
  • 静默压测+生成 Web 压测报告整合 jmeter –n –t jmxfile−l jtl_file -e -o <web_report_path>

自动化压测

  • 程序流程图

自动化压测

  • 命令行导入并发数变量 jmeter … –Jthread=100

自动化压测

  • 源码解读与实操演练
  • 源码位置:{iJMeter}/automation

1 Like