查了好多资料,踩了好多坑终于把脚本调试通过了,记录一下:
(1)、首先,我们需要准备Jmeter的WebSocket协议的支持插件
JMeterWebSocketSampler-1.0.2-SNAPSHOT.jar
这插件依赖一下几个jar包
1、jetty-http-9.1.2.v20140210.jar
2、jetty-io-9.1.2.v20140210.jar
3、jetty-util-9.1.2.v20140210.jar
4、websocket-api-9.1.1.v20140108.jar
5、websocket-client-9.1.1.v20140108.jar
6、websocket-common-9.1.1.v20140108.jar
共7个包,我们准备好这些jar包后,讲它们拷贝到Jmeter目录的\lib\ext\目录下。
其次,启动Jmeter,鼠标右键选择测试计划->添加->Threads(users)->线程组。
(2)websocket协议脚本编写和调试:
1、首先介绍一下我们要测试的接口的业务流程:(1)http协议登录,登录成功获取一个clientsessionid,时效30Min (2)用这个clientsessionid+登陆的用户名建立连接socket (3)通过socket协议发送一个获取token的请求(当然也是登陆成功的情况下)(4)通过socket协议,使用步骤(3)拿到的token做下单操作,下单操作才是我们需要测试的接口;
2、介绍一下通过chrome抓包:
我们的程序是C/S架构的,本来是无法通过chrome抓包的
(1)开发让我在chrome的属性中的目标值后面加了一串字符
(2)输入了一个ip和端口与在jmeter上websocket脚本中设置的不一样
(3)上图吧:
建立socket连接:
这条请求的完整显示如下图,也是我们建立socket连接需要的信息:
双击上图这一样信息跳转到2Frames中,或者直接点击1ws可以看到websocket请求的具体内容,3为建立链接成功后的返回信息
建立连接对应的jmetere脚本:
这个建立socket请求的返回信息:
请求token,从开发给的接口文档中可以看出,请求tonken就发送了一个getInsertOrderToken的请求,我们在chrome的frame里找到这个请示:
将以上这个请求的内容复制到jmeter脚本中:
返回内容:
下图是jmeter脚本返回的:
下单的请求:
先看chrome上面的数据:
Jmeter下单脚本:
请求的响应:
到这里这个接口脚本就调试通过了,以下记录几点测试过程中遇到的问题:
1、刚开始没有抓包,开发给了一个地址怎么也调不通过,后面发现是因为没有建立连接,这个网上讲的也很少可以参考这一篇:https://blog.csdn.net/heart_1014/article/details/53606337
2、建立连接成功了,发现获取token又出了问题,最后是因为两个原因:(1)没有勾选streaming connection,如果一个socket连接中有多个请求,必须勾选这个,不然每发送一个请求就建立一次连接,具体参考这一篇:http://www.cnblogs.com/yuanchunli/articles/5265738.html (2)返回token需要一定的时间,之间没有设置等待时间一直获取不到,后面加了一个固定等待时间终于获取到了;
3、登陆获取的clientsessionid和下单前获取的token都需要添加后置处理器中的正则表达式提取器进行,将这两个参数时行提取放在后面的接口中作为入参,具体的可以参考这一篇:http://www.cnblogs.com/fengpingfan/p/4755410.html
增加1:
脚本调试好以后,发现有点小问题,如果我们后面的脚本需要取前面脚本的响应内容,那后面脚本的性能会受前面脚本的影响,为了避免这个影响,需要把前面脚本的响应结果写到一个文件中然后再参数化到后面的脚本中:
(1)在本地新建一个空的csv后缀的文件
(2)在Jmeter中加一个后置处理器-BeanShell PostProcessor,在里面编程,其实就是简单的几句java代码
生成的CSV文件如下 :
接下来就可以用这些值参数化后面的脚本啦!