性能测试实战230618-可乔

课程贴:20230618 性能测试实战

性能实战

JMeter介绍

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中文显示问题的解决

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

http 与 https 协议的区别

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

自动化压测

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

自动化压测

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

并发数的配置:线程组

ramp-up:只包含请求发出去的时间,不包含请求返回结果的时间

项目的启动:这样展示表示已经运行成功

登录接口:

添加JSON断言:

调试取样器:

添加用户定义的变量:提取共用的参数变量

HTTP请求默认值:

浏览菜单接口:
image

image

image

后置处理器-JSON处理器

将JSON提取器提取的内容放到信息头当中

修改完后一定要进行重启,重启后配置才能生效

添加解决乱码的脚本:

订单确认接口:

用户注销接口:

1、需要查看异常是否在0.5%以内,或者是否在公司特定的异常值范围内
2、参考90%-99%以上的
3、吞吐量:1秒有多少个请求

添加一个事务:
image

mysql代码:增删改查 有个事务的提交

子请求内容看不到:
image

可以更加真实的去模拟场景:

添加CSV文件:

image

静默压测:
目的:后续和jenkins进行持续集成,节约人工劳动力

image

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 file] -l [results file] -e -o [Path to web report folder]


jmx file : /Users/gaigai/Desktop/http.jmx 

results file: http.jtl

Path to web report folder:不存在的或者是存在为空的文件夹  http1


jmeter -n -t /Users/gaigai/Desktop/http.jmx -l http.jtl -e -o http1


对/Users/gaigai/Desktop/http.jmx进行压测,压测结果存储在http.jtl,压测的html报告存在http1文件夹内


jmeter -n -t /Users/gaigai/Desktop/http.jmx -l http2.jtl -e -o http2 -JthreadNum=3



jmeter -n -t 压测脚本.jmx -l 不存在的文件名.jtl -e -o 为空的文件夹名 -J参数名1=参数值1  -J参数名2=参数值2


jmeter -n -t /Users/gaigai/Desktop/http.jmx -l http5.jtl -e -o http5 -JthreadNum=3  -Jloop=2

image

使用命令行传参,需要用到函数助手

性能压测也可以持续集成,也可以设置定时任务

需要搭建实时监控平台

自己操作时的记录:
jmeter -n -t E:/apache-jmeter-5.1.1/apache-jmeter-5.1.1/bin/zl.jmx -l http.jtl -e -o http1

转码脚本:

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());
1 个赞