一文3000字从0到1用Python进行gRPC接口测试!

gRPC 是一个高性能、通用的开源RPC框架,其由 Google 主要面向移动应用开发并基于HTTP/2 协议标准而设计,基于 ProtoBuf(Protocol Buffers) 序列化协议开发,且支持众多开发语言。

自gRPC推出以来,已经广泛应用于各种服务之中。在测试中,我们也越来越多地遇到gRPC接口相关的测试内容。测试一个gRPC接口,我们往往需要一个测试用的客户端,本文就为大家介绍如何用python来实现一个简易的gRPC客户端程序。

一、前期准备
gRPC 默认使用 protocol buffers,这是 Google 开源的一套成熟的结构数据序列化机制。在开始编写客户端之前,我们首先要安装一些必要的模块和工具。

pip install grpcio
pip install grpcio-tools

安装好了必要的模块和工具(编译器)之后,我们就可以根据proto协议文件生成所需的模块和方法。比如我们要测试的接口协议文档为helloword.proto,文档内容为:

// helloworld.proto
syntax = "proto3";
 
 
service Greeter {
    rpc SayHello(HelloRequest) returns (HelloReply) {}
}
message HelloRequest {
    string name = 1;
}
 
 
message HelloReply {
    string message = 1;
}

就可以执行以下命令来快速获取:

python -m grpc_tools.protoc --python_out=. --grpc_python_out=. -I. helloworld.proto

生成的模块、方法会保存在两个文件之中,分别为helloworld_pb2.py、helloworld_pb2_grpc.py。这两个文件是实现客户端时不可缺少的。

二、客户端实现
在前期准备完成之后,实现一个客户端并非难事,我们只需将自动生成的文件和模块引用进来,就可以调用一些内置方法来完成与gRPC接口的交互。

比如上面生成的文件是helloworld_pb2.py、helloworld_pb2_grpc.py,我们就在客户端引入这两个模块:

import helloworld_pb2
import helloworld_pb2_grpc

同时再引入必要的grpc模块:

import grpc

接下来就是调用模块中的方法来进行grpc接口的连接、测试了。如果服务端起在本地的50051端口,完整实现的代码如下:

import helloworld_pb2
import helloworld_pb2_grpc
import grpc
 
def run():
 
    # 连接 rpc 服务器
    channel = grpc.insecure_channel('localhost:50051')
    # 调用 rpc 服务
    stub = helloworld_pb2_grpc.GreeterStub(channel)
    response = stub.SayHello(helloworld_pb2.HelloRequest(name='test'))
    print("Greeter client received: " + response.message)
 
 
if __name__ == '__main__':
    run()

其中,关键的步骤为:

1、连接rpc服务器;
 
2、对service获取一个stub用于调用接口;
 
3、发送数据、接收数据。

将代码保存为client.py,运行脚本就可以成功获取服务端返回的结果了,假设服务端返回的文本为"Hello":

# python client.py
# Greeter client received: Hello

到这里,一次简单的gRPC接口连接、交互就算完成了,并实现了一个简易的gRPC客户端。

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:822269834【暗号:csdn999】

三、实际应用
在知音平台项目中,官网控制台需要获取某个用户对于某种服务的用量。官网控制台与后端服务之间使用gRPC接口,通信方式为客服端一次请求, 服务器一次应答。

按照上面介绍的方法,我们可以制作一个简单的测试客户端,模拟官网控制台对后端服务进行请求,实现对用户用量的查询。

接口协议如下(仅为演示需要,只展示部分内容)

service test {
  rpc GetUsage(GetUsageRequest) returns (GetUsageResponse);
}
 
 
message GetUsageRequest {
  string appid = 1;
  string account_id = 4;
  string audience = 2;
  string metric = 3;
}
 
 
message GetUsageResponse {
  Usage usage = 1;
}

实现客户端关键方法如下:

def subcmd_GetUsage(args):
    # 连接 rpc 服务器
    channel = grpc.insecure_channel(ADDRESS)
    # 调用 rpc 服务
    stub = test_pb2_grpc.testStub(channel)
    response = stub.GetUsage(auth_pb2.GetUsageRequest(appid=args.appid,account_id=args.account_id,audience=args.audience,metric=args.metric))
    print("GetUsage received: \n" + str(response.usage))

运行客户端(已利用argparse模块做成命令行形式),可以成功返回结果:

进一步,如果需要对接口进行并发下的稳定性测试,可以将客户端编译成可执行程序或利用shell脚本,再结合jmeter等自动化测试工具进行测试,以编译可执行程序的方法为例。

首先利用pyinstaller工具将脚本编译为可执行程序:

pyinstaller -F auth_client.py

可以在dist目录下得到当前系统下的可执行程序。

接下来用jmeter编写自动化测试脚本,在线程组下添加OS Process Sampler,传入所需参数:

运行脚本,即可自动化进行测试并得到结果,从中可以得到性能、稳定性等指标。

 此外还可以结合jmeter的参数化功能,对不同用户对于不同服务的用量进行查询,从而更加真实地模拟线上请求的情景进行测试:

小结
本文介绍了用python实现gRPC接口测试的方法,可以快速地制作一个简易客户端应用于gRPC接口相关的测试,有一定实用价值。对于gRPC接口,本期主要讲了gRPC四种通信方式中最简单的一种,即客服端一次请求, 服务器一次应答(简单RPC)。关于其他三种通信方式的实现,感兴趣的同学可以参考gRPC相关文档,在之后的文章中,小编会再进行介绍。好了,本期就到这里,我们下期再见~

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走!

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/227430.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue2脚手架搭建+项目基础依赖安装

文章目录 1. 安装 node.js2. 安装 vue-cli 脚手架3. 创建 vue2 项目4. 安装基础依赖 1. 安装 node.js 可以参考这篇文章 https://blog.csdn.net/weixin_43721000/article/details/134284418 2. 安装 vue-cli 脚手架 安装 vue-clinpm install -g vue/cli查看是否安装成功vue -…

用23种设计模式打造一个cocos creator的游戏框架----(七)代理模式

1、模式标准 模式名称:代理模式 模式分类:结构型 模式意图:为其他对象提供一种代理以控制对这个对象的访问。 结构图: ​ 适用于: 远程代理:也称为大使,这是最常见的类型,在分…

Data Mining数据挖掘—2. Classification分类

3. Classification Given a collection of records (training set) – each record contains a set of attributes – one of the attributes is the class (label) that should be predicted Find a model for class attribute as a function of the values of other attribu…

vuepress-----14、保护私密信息

秘钥存储文件 使用秘钥 忽略提交

通过异步序列化提高图表性能 Diagramming for WPF

通过异步序列化提高图表性能 2023 年 12 月 6 日 MindFusion.Diagramming for WPF 4.0.0 添加了异步加载和保存文件的功能,从而提高了响应能力。 MindFusion.Diagramming for WPF 提供了一个全面的工具集,用于创建各种图表,包括组织结构图、图…

『PyTorch学习笔记』如何快速下载huggingface模型/数据—全方法总结

如何快速下载huggingface模型/数据—全方法总结 文章目录 一. 如何快速下载huggingface大模型1.1. IDM(Windows)下载安装连接1.2. 推荐 huggingface 镜像站1.3. 管理huggingface_hub cache-system(缓存系统) 二. 参考文献 一. 如何快速下载huggingface大模型 推荐 huggingface…

苹果mac电脑如何彻底删除卸载软件?

在苹果电脑上安装和使用软件非常容易,但是卸载软件却可能会变得复杂和困难。不像在Windows上,你不能简单地在控制面板中找到已安装的程序并卸载它们。因此,在这篇文章中,我们将讨论苹果电脑怎么彻底删除软件。 CleanMyMac X全新版…

通信线缆是什么

通信线缆 电子元器件百科 文章目录 通信线缆前言一、通信线缆是什么二、通信线缆的类别三、通信线缆应用实例四、通信线缆的作用原理总结前言 每种线缆都有其特定的特性和用途。通信线缆起到连接和传输信号的作用,是实现通信和数据传输的重要组成部分。 一、通信线缆是什么 …

高级搜索——ST表,离线RMQ问题

文章目录 前言可重复贡献问题ST表的定义ST表的存储结构ST表的预处理预处理的实现 ST表的区间查询对于k的获取区间查询的实现 OJ链接 前言 对于查询区间最值的方法,我们常用的就是线段树,树状数组,单调队列,而树状数组更适合用于快…

AI报告专题:创造性和生成式人工智能

今天分享的AI系列深度研究报告:《AI报告专题:创造性和生成式人工智能》。 (报告出品方:Capgemini) 报告共计:64页 AI一代 生成式人工智能 (AI)正在迅速改变我们与技术的交互方式,使机器能够创…

Java实现屏幕截图程序(一)

在Java中,可以使用Robot类来实现屏幕截图程序。Robot类提供了一组用于生成输入事件和控制鼠标和键盘的方法。 Java实现屏幕截图的步骤如下: 导入Robot类 import java.awt.Robot;创建Robot对象 Robot robot new Robot();获取屏幕分辨率信息 Dimensi…

redis-学习笔记(hash)

Redis 自身已经是 键值对 结构了 Redis 自身的键值对就是通过 哈希 的方式来组织的 把 key 这一层组织完成后, 到了 value 这一层, 还可以用 哈希类型 来组织 (简单的说就是哈希里面套哈希 [数组里面套数组 -> 二维数组] ) [ field value ] hset key field value [ field va…

urllib 异常、cookie、handler及代理(四)

目录 一、urllib异常 二、urllib cookie登录 三、urllib handler 处理器的基本使用 四、urllib 代理和代理池 参考 一、urllib异常 URLError/HTTPError 简介: 1.HTTPError类是URLError类的子类 2.导入的包urllib.error.HTTPError urllib.error.URLError 3.h…

如何将idea中导入的文件夹中的项目识别为maven项目

问题描述 大家经常遇到导入某个文件夹的时候,需要将某个子文件夹识别为maven项目 解决方案

XUbuntu22.04之8款免费UML工具(一百九十七)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

【计算机组成体系结构】SRAM和DRAM

RAM — Random Access Memory 随机访问存储器 —指定某一存储单元地址的时候,存储单元的读取速度并不会因为存储单元的物理位置改变 SRAM即为 Static RAM 静态随机访问存储器 — 用于主存DRAM即为 Dynamic RAM 动态随机访问存储器 — 用于Cache 一、SRAM和DRAM的特…

oomall课堂笔记

一、项目分层结构介绍 controller层(控制器层): 作用:负责输出和输入,接收前端数据,把结果返回给前端。 1.处理用户请求,接收用户参数 2.调用service层处理业务,返回响应 servi…

Javaweb之Maven仓库的详细解析

2.3 Maven仓库 仓库:用于存储资源,管理各种jar包 仓库的本质就是一个目录(文件夹),这个目录被用来存储开发中所有依赖(就是jar包)和插件 Maven仓库分为: 本地仓库:自己计算机上的一个目录(用来存储jar包) 中央仓库&a…

利用R语言heatmap.2函数进行聚类并画热图

数据聚类然后展示聚类热图是生物信息中组学数据分析的常用方法,在R语言中有很多函数可以实现,譬如heatmap,kmeans等,除此外还有一个用得比较多的就是heatmap.2。最近在网上看到一个笔记文章关于《一步一步学heatmap.2函数》,在此与…

python 涉及opencv mediapipe知识,眨眼计数 供初学者参考

基本思路 我们知道正面侦测到人脸时,任意一只眼睛水平方向上的两个特征点构成水平距离,上下两个特征点构成垂直距离 当头像靠近或者远离摄像头时,垂直距离与水平距离的比值基本恒定 根据这一思路 当闭眼时 垂直距离变小 比值固定小于某一个…