用Python进行gRPC接口测试(一)

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

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

一、前期准备

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

  1. pip install grpcio

  2. pip install grpcio-tools

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

  1. // helloworld.proto

  2. syntax = "proto3";

  3. service Greeter {

  4.     rpc SayHello(HelloRequest) returns (HelloReply) {}

  5. }

  6. message HelloRequest {

  7.     string name = 1;

  8. }

  9. message HelloReply {

  10.     string message = 1;

  11. }

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

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,我们就在客户端引入这两个模块:

  1. import helloworld_pb2

  2. import helloworld_pb2_grpc

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

import grpc

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

  1. import helloworld_pb2

  2. import helloworld_pb2_grpc

  3. import grpc

  4. def run():

  5.     # 连接 rpc 服务器

  6.     channel = grpc.insecure_channel('localhost:50051')

  7.     # 调用 rpc 服务

  8.     stub = helloworld_pb2_grpc.GreeterStub(channel)

  9.     response = stub.SayHello(helloworld_pb2.HelloRequest(name='test'))

  10.     print("Greeter client received: " + response.message)

  11. if __name__ == '__main__':

  12.     run()

其中,关键的步骤为:

  1. 1、连接rpc服务器;

  2. 2、对service获取一个stub用于调用接口;

  3. 3、发送数据、接收数据。

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

  1. # python client.py

  2. # Greeter client received: Hello

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

三、实际应用

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

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

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

  1. service test {

  2.   rpc GetUsage(GetUsageRequest) returns (GetUsageResponse);

  3. }

  4. message GetUsageRequest {

  5.   string appid = 1;

  6.   string account_id = 4;

  7.   string audience = 2;

  8.   string metric = 3;

  9. }

  10. message GetUsageResponse {

  11.   Usage usage = 1;

  12. }

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

  1. def subcmd_GetUsage(args):

  2.     # 连接 rpc 服务器

  3.     channel = grpc.insecure_channel(ADDRESS)

  4.     # 调用 rpc 服务

  5.     stub = test_pb2_grpc.testStub(channel)

  6.     response = stub.GetUsage(auth_pb2.GetUsageRequest(appid=args.appid,account_id=args.account_id,audience=args.audience,metric=args.metric))

  7.     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相关文档,在之后的文章中,小编会再进行介绍。好了,本期就到这里,我们下期再见~

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

  1. 文档获取方式:

  2. 加入我的软件测试交流群:680748947免费获取~(同行大佬一起学术交流,每晚都有大佬直播分享技术知识点)

这份文档,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

以上均可以分享,只需要你搜索vx公众号:程序员雨果,即可免费领取

  • 13
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python使用gRPC是一种方便的方式来构建分布式系统和微服务。gRPC是一个高性能、开源的远程过程调用(RPC)框架,它使用Protocol Buffers作为接口定义语言(IDL)来定义服务接口和消息格式。 要在Python中使用gRPC,首先需要安装gRPC库。可以使用pip命令进行安装: ``` pip install grpcio ``` 安装完成后,可以开始编写gRPC服务和客户端代码。首先需要定义服务接口和消息格式,这可以通过编写.proto文件来完成。然后使用gRPC提供的工具将.proto文件编译成Python代码。 接下来,可以编写服务端代码。在服务端代码中,需要实现.proto文件中定义的服务接口,并提供相应的方法来处理客户端请求。 最后,可以编写客户端代码来调用服务端提供的方法。客户端代码需要创建一个gRPC通道,并使用通道创建一个stub对象,然后可以通过stub对象调用服务端提供的方法。 下面是一个简单的示例代码,演示了如何在Python中使用gRPC: ```python # 导入所需的模块 import grpc import helloworld_pb2 import helloworld_pb2_grpc # 创建一个gRPC通道 channel = grpc.insecure_channel('localhost:50051') # 创建一个stub对象 stub = helloworld_pb2_grpc.GreeterStub(channel) # 调用服务端提供的方法 response = stub.SayHello(helloworld_pb2.HelloRequest(name='Alice')) # 打印服务端返回的结果 print(response.message) ``` 以上代码中,假设服务端提供了一个名为`SayHello`的方法,客户端通过创建一个stub对象来调用该方法,并传递一个`HelloRequest`对象作为参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值