vlambda博客
学习文章列表

基于GRPC协议的Jmeter性能测试脚本开发

记一次基于GRPC协议,开发性能测试脚本


本篇内容:

  • 项目背景和需求

  • 性能测试工具分析和选择

  • 创建工程 & 编译proto

  • 编写GRPC客户端程序

  • 生成jar包

  • Jmeter调用jar



01

项目背景和需求


公司的系统是基于GRPC协议开发的,现要对「保存病历」接口进行性能测试


对应的业务操作:

  • 输入「用户名」和「密码」登录系统

  • 在系统主界面,点击「新建档案」,填写患者信息

  • 点击「提交」即触发调用「保存病历」接口


通过抓包,或按 F12 打开「开发者模式」



 

我们看一下这个请求,找不到「入参」(要保存的「患者信息」)


基于GRPC协议的Jmeter性能测试脚本开发

 

再看一下响应,是一串看不懂的码哦


基于GRPC协议的Jmeter性能测试脚本开发


看不到「入参,怎么参数化呢?

返回结果是一串码,怎么断言呢?


开展性能测试工作,怎么编写性能测试脚本呢?



02

性能测试工具分析和选择


公司的开发人员,之前有用golang语言,编写程序对该接口进行性能测试


下图是该性能测试脚本的程序目录

基于GRPC协议的Jmeter性能测试脚本开发


看一下源码内容

基于GRPC协议的Jmeter性能测试脚本开发


有执行,有报告,但是从脚本文件来看貌似存在这些问题:

1)没有体现多线程并发

2)统计结果的报告内容不是很丰富,只有:、成功率/失败率/运行时长/平均响应时间

基于GRPC协议的Jmeter性能测试脚本开发


按惯例,做性能测试一般选择:LRJmeter、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添加以下依赖

基于GRPC协议的Jmeter性能测试脚本开发


(3)加入插件

基于GRPC协议的Jmeter性能测试脚本开发


(4)配置插件和build环境

基于GRPC协议的Jmeter性能测试脚本开发


(5)添加proto,在工程中添加「proto」文件夹,从公司的码云git到proto文件复制到该文件夹中

基于GRPC协议的Jmeter性能测试脚本开发


(6)编译proto,这一步很重要,编译.proto文件的工作由protoc的Maven插件编译来完成,它会调用指定路径下protoc.exe解析.proto,并生成我们编写客户端代码的基础

基于GRPC协议的Jmeter性能测试脚本开发

编译成功

基于GRPC协议的Jmeter性能测试脚本开发

再选择protobuf:compile进行编译

基于GRPC协议的Jmeter性能测试脚本开发


(6)编译proto成功后,在工程目录下会出现「target」文件夹,里面包含了proto文件夹中全部proto文件的所有类和方法

基于GRPC协议的Jmeter性能测试脚本开发



04

编写GRPC客户端程序


「保存病历」接口的业务逻辑包含4步:

1)登录  输入用户名和密码登录,获取uuid

2)选择机构  输入uuid和机构号,获取token

3)将token添加到header中

4)header带上token,调用「保存病历」接口


编写Client「Client源码编写方法,可以查阅我后续写的,基于GRPC协议接口自动化测试实践

基于GRPC协议的Jmeter性能测试脚本开发


保存病历的数据比较多,数据类型的处理花了不少时间

基于GRPC协议的Jmeter性能测试脚本开发


把token放置到header中,token的键名一定要和Server端一致

这个名称的获取,我们通过抓包可以看到(可以不用问开发,哈哈)在前面01节的图二出现过哦

基于GRPC协议的Jmeter性能测试脚本开发



05

生成jar包


点击右上角的小图标,打开Project Structure

基于GRPC协议的Jmeter性能测试脚本开发

删掉之后,点击[+],按下图选择

基于GRPC协议的Jmeter性能测试脚本开发

设置主程序入口,MANIFEST.MF的路径,如果MANIFEST.MF在该路径下已存在,先删掉确保生成新的MANIFEST.MF,点击[OK]

基于GRPC协议的Jmeter性能测试脚本开发

设置生成jar包的路径,点击[OK]

基于GRPC协议的Jmeter性能测试脚本开发

然后菜单选择Build,按下图选择

基于GRPC协议的Jmeter性能测试脚本开发

在弹出的对话框,点击Build,等待jar生成

基于GRPC协议的Jmeter性能测试脚本开发


jar生成成功后,我们用CMD验证一下jar包是否打得正确

基于GRPC协议的Jmeter性能测试脚本开发



06

Jmeter调用jar


把jar包放在任意一个目录中,我放置在jmeter的libs目录下(随便一个目录都可以哈)

打开Jmeter,在测试计划中,引入jar

然后就可以写BeanShell Sampler调用jar包里的方法啦,调试通过!!!


截止到这一步,我们的基于GRPC的Jmeter性能测试脚本,开发+调试完成了。后续是执行性能测试、场景设计、服务器监控、性能指标采集与分析、性能调优和性能回归等一系列性能工作啦