基于GRPC协议的Jmeter性能测试脚本开发
记一次基于GRPC协议,开发性能测试脚本
本篇内容:
项目背景和需求
性能测试工具分析和选择
创建工程 & 编译proto
编写GRPC客户端程序
生成jar包
Jmeter调用jar
01
—
项目背景和需求
公司的系统是基于GRPC协议开发的,现要对「保存病历」接口进行性能测试
对应的业务操作:
输入「用户名」和「密码」登录系统
在系统主界面,点击「新建档案」,填写患者信息
点击「提交」即触发调用「保存病历」接口
通过抓包,或按 F12 打开「开发者模式」
我们看一下这个请求,找不到「入参」(要保存的「患者信息」)
再看一下响应,是一串看不懂的码哦
看不到「入参」,怎么参数化呢?
返回结果是一串码,怎么断言呢?
开展性能测试工作,怎么编写性能测试脚本呢?
02
—
性能测试工具分析和选择
公司的开发人员,之前有用golang语言,编写程序对该接口进行性能测试
下图是该性能测试脚本的程序目录
看一下源码内容
有执行,有报告,但是从脚本文件来看貌似存在这些问题:
1)没有体现多线程并发
2)统计结果的报告内容不是很丰富,只有:、成功率/失败率/运行时长/平均响应时间
按惯例,做性能测试一般选择:LR、Jmeter、Locust
这些性能测试工具易用性比较强,提供了很丰富的图表性能测试报告,如果是开源的,比如Jmeter工具,也很好作拓展
我的测试目标,是GRPC协议,映射到HTTP其实还是在GRPC协议中间夹了一层
开发说,如果我不能实现GRPC协议接口的测试,那测试HTTP协议接口也凑合
看来,走HTTP协议的方式行不通,并且,后续我要做接口自动化测试,用代码去实现客户端,是绕不过的一道槛
考虑,虽然开发之前已经用golang语言实现了性能测试,但我想丰富它的测试指标内容,并且增加易用性,最后,我决定用Java语言结合Jmeter
Jmeter是基于Java语言开发的,我查了资料暂时没发现可以调用golang,可以用Java语言实现客户端,打成jar,用Jmeter来调用
那么,剩下的问题是,用代码实现客户端访问GRPC的服务
03
—
创建工程 & 编译proto
我的环境:
JDK 1.8
IDEA
Maven 创建maven工程后不要忘了设置maven仓库和setting
Jmeter 4.0
(1)新建Maven工程
(2)在pom.xml添加以下依赖
(3)加入插件
(4)配置插件和build环境
(5)添加proto,在工程中添加「proto」文件夹,从公司的码云git到proto文件复制到该文件夹中
(6)编译proto,这一步很重要,编译.proto文件的工作由protoc的Maven插件编译来完成,它会调用指定路径下protoc.exe解析.proto,并生成我们编写客户端代码的基础
编译成功
再选择protobuf:compile进行编译
(6)编译proto成功后,在工程目录下会出现「target」文件夹,里面包含了proto文件夹中全部proto文件的所有类和方法
04
—
编写GRPC客户端程序
「保存病历」接口的业务逻辑包含4步:
1)登录 输入用户名和密码登录,获取uuid
2)选择机构 输入uuid和机构号,获取token
3)将token添加到header中
4)header带上token,调用「保存病历」接口
编写Client「Client源码编写方法,可以查阅我后续写的,基于GRPC协议接口自动化测试实践」
保存病历的数据比较多,数据类型的处理花了不少时间
把token放置到header中,token的键名一定要和Server端一致
这个名称的获取,我们通过抓包可以看到(可以不用问开发,哈哈)在前面01节的图二出现过哦
05
—
生成jar包
点击右上角的小图标,打开Project Structure
删掉之后,点击[+],按下图选择
设置主程序入口,MANIFEST.MF的路径,如果MANIFEST.MF在该路径下已存在,先删掉确保生成新的MANIFEST.MF,点击[OK]
设置生成jar包的路径,点击[OK]
然后菜单选择Build,按下图选择
在弹出的对话框,点击Build,等待jar生成
jar生成成功后,我们用CMD验证一下jar包是否打得正确
06
—
Jmeter调用jar
把jar包放在任意一个目录中,我放置在jmeter的libs目录下(随便一个目录都可以哈)
打开Jmeter,在测试计划中,引入jar
然后就可以写BeanShell Sampler调用jar包里的方法啦,调试通过!!!
截止到这一步,我们的基于GRPC的Jmeter性能测试脚本,开发+调试完成了。后续是执行性能测试、场景设计、服务器监控、性能指标采集与分析、性能调优和性能回归等一系列性能工作啦