JMeter安装和使用

软件安装

安装JDK

配置JAVA_HOME:C:\Program Files\Java\jdk1.8.0_202

Path路径添加: %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

测试JDK: java -version

安装JMeter

从官网下载,解压后双击 bin/jmeter.bat 启动

Websocket接口测试

1. 安装插件

测试Websocket需要安装插件,重启后,多出的websocket相关的采样器如下:

  • Websocket Open Connection: 创建链接
  • WebSocket Single Read Sampler:只接受消息
  • WebSocket Single Write Sampler:只发送消息
  • WebSocket Ping/Pong Frame Filter:保持链接不断开(如果长时间通信,需要用这个Fileter过滤掉ping/pong消息)
  • WebSocket Close:关闭链接

2. 查看接口参数

可以看到,参数交互流程为:接受 - 发送 - 接受 - 接受 - 发送 - 接受 (一直接受直到结束)

3. 创建采样器

先添加线程组,再添加各个采样器:

创建链接,设置ip+port等

接受消息(发送消息)需要设置 use existing connection,这样才可以继续使用上面的链接

在发送消息之前,可以自定义变量(这一步也可以不用,即发送的消息直接写死)

发送消息

ping/pong帧过滤(短时间通信可以不用,长时间通信需要用,否则报错)

JSR223可以用JS等语言定义变量,BeanShell Sampler则是用Java语言,如下,从返回数据中取值:

注意:这里需要用json包,所以需要下载org.json.jar包,然后放到\apache-jmeter-5.6\lib\ext目录下

while逻辑控制器定义终止条件

最后添加View Results Tree等结果报告,即可使用。

4. 其他问题

为什么要添加ping/pong帧过滤

不添加会报错:the server returns the following errors: (1)Sampler error: unexpected frame type (ping). (2)Ping frame with application data 'T悅o'

添加ping/pong帧解决,参考资料:https://stackoverflow.com/questions/68630702/how-can-i-check-out-the-servers-response-of-unexpected-frame-type-ping#:~:text=You can add WebSocket Ping%2FPong Frame Filter to,frames so you should stop seeing this error.

返回结果是unicode编码,如何转成中文

unicode数据:

\u4f60\u597d\ud83d\udc4b\uff01\u6211\u662f\u4eb

解决方法:添加BeanShell PostProcessor

代码如下:

//获取响应代码Unicode编码的
 
String s=new String(prev.getResponseData(),"UTF-8");
 
//---------------下一步骤为转码过程---------------
        char aChar;
        int len= s.length();
        StringBuffer outBuffer=new StringBuffer(len);
        for(int x =0; x <len;){
            aChar= s.charAt(x++);
            if(aChar=='\\'){
                aChar= s.charAt(x++);
                if(aChar=='u'){
                    int value =0;
                    for(int i=0;i<4;i++){
                        aChar= s.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(),"utf-8"); //再次设置utf-8编码

posted @ 2023-07-11 09:16  明日盈盈  阅读(87)  评论(0编辑  收藏  举报