用Python进行gRPC接口测试

发表于:2020-1-02 10:13

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:大帆船    来源:搜狗测试

  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客户端。
  三、实际应用
  在知音平台项目中,官网控制台需要获取某个用户对于某种服务的用量。官网控制台与后端服务之间使用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)。关于其他三种通信方式的实现。

     本文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号