用Python进行gRPC接口测试

在近期的测试中,小编又遇到了一些关于grpc接口的测试,踩了一些坑,也总结了一些经验,想与大家分享交流一下。本期我们主要来谈谈有关protobuf中一些特殊数据类型在python中的处理方式。由于目前protobuf3已经成为主流,本文将直接以proto3进行探讨。

一、标量值类型

标量值类型与我们在编程语言使用的基本数据类型概念类似,用来携带的数据也大体相同。在python中,这些标量值类型都能找到与之对应的python数据类型,处理起来简单便捷。

使用举例:

message Student { string name = 1; int32 age = 2; // true: male, false:female bool sex = 3; }

Python实现代码:

name="小王" age=15 sex=True #方式1 student=Student(name=name,age=age,sex=sex) #方式2 student=Student() student.name=name student.age=age student.sex=sex

二、一些特殊类型

除了上面提到的标量值类型,proto3中还定义了其他一些特殊的数据类型,方便我们用来构造、传递各种复杂的数据结构。官方给出了一个关于这些类型的JSON映射表,可以直观地看到各种类型所含数据的基本结构。

这些类型使得我们可以方便地构造出各种各样的数据形式。这其中有几个较为常用的类型,在小编进行的测试中经常遇到,下面我们就结合实际中的例子来为大家介绍一下。

1、message

message,根据映射表我们可以看到,它类似于我们在编程语言中所使用的类的对象(object)。在一个类中,我们可以添加各种其他类型的数据,也包括类本身。通过类比,message也有类似的概念,我们可以在里面添加各种proto类型的数据,也包括message。其实正如message的名字一样——消息,它是protobuf中的核心类型,在grpc接口中,我们正是通过发送和接收消息来完成数据交互,来实现对应的功能。

简单的message:

message Person { int32 id = 1; string name = 2; string email = 3; }

含其他message的message:

message Point { int32 latitude = 1; int32 longitude = 2; } message Feature { string name = 1; Point location = 2; }

在Python中的使用:

location=Point(latitude=5,longitude=10) Feature=Feature(name="我是个名字",location=location)
2、Timestamp、Duration

这两种类型都是关于时间的,Timestamp是时间戳,Duration表示的时间长度。

在AI平台账号服务的测试中,某Account类型的message定义如下:

location=Point(latitude=5,longitude=10) Feature=Feature(name="我是个名字",location=location)

在Python中的使用:

update_at=Timestamp() #从字符串获取 update_at.FromJsonString("1970-01-01T00:00:00Z") #获取当前时间 update_at.GetCurrentTime() time_limit=Duration() #从纳秒转换 time_limit.FromNanoseconds(1999999999) #从秒转换 time_limit.FromSeconds(100) account=Account(account_id="account1",update_at=update_at,time_limit=time_limit)
3、Any

Any类型比较特殊,它可以包含不同的message,结合pack和unpack,只需声明一个Any,即可传递各种类型的message而不用声明多个字段。

在大会同传项目中,某个请求的message中需要传递两种信息——图片和音频,于是通过Any类型来实现同一字段的复用:

message ImageData { string index = 1; bytes image = 2; } message Data { string appid = 1; bytes payload = 2; string extra = 3; } message Request { google.protobuf.Any body = 1; }

在Python中的使用:

imageData=msg_pb2.ImageData(index="001",image=open("1.jpg","rb").read()) req1=msg_pb2.Request() req1.body.Pack(imageData) data=msg_pb2.Data(name="no.1",payload=open("1.wav","rb").read(),extra="no use") req=msg_pb2.Request() req.body.Pack(data)
4、enum

enum枚举类型和其他大多数编程语言的枚举类型概念相同,主要是通过提前设定好一些固定的值来限定可以传递的内容。

在AI平台实名认证服务的测试中,需要一个认证人类型的字段,由于认证人类型收敛,于是使用enum类型来定义:

enum PersonType { PERSONTYPE_UNSPECIFIED = 0; INDIVIDUAL = 1; LEGAL = 2; AUTHORIZE = 3; } message Person { string real_name = 1; PersonType person_type = 2; }

在Python中的应用:

person_type=PersonType.Value("INDIVIDUAL") Person(real_name="小王",person_type=person_type)
5、map

map相当于json中的键值对,在Python中类似于字典(dict),我们可以利用Python的dict类型数据来对map进行设置。map在proto中声明时一般会带有尖括号,来指定key和value的具体类型,如map就表示键值对的key、value都为string类型。

在AI平台鉴权相关的测试中,需要为用户创建的应用绑定若干个不同的特殊属性,每个特殊属性对应着一个属性值,此处采用了map类型:

message App { string appid = 1; map<string, string> extra_informations = 2; }

在Python中的应用:

extra_informations={"name":"app1","expired":"no"} app=App(appid="1234567", extra_informations=extra_informations)
6、repeated

repeated相当于json中的list,在Python中类似于列表(list),我们可以利用Python的list类型数据来对repeated进行设置。

在AI平台账号服务的测试中,需要为账号添加各种不同的能力,每个能力有多个属性,而每个能力属性的种类和数据类型一致。此处采用了repeated类型:

message Audience { string name = 1; string tier = 2; } message Account { string account_id = 1; repeated Audience audience = 2; }

在Python中的应用:

audience=[{"name":"ASR","tier":"stand"},{"name":"TTS","tier":"free"},{"name":"MT","tier":"stand"}] account=Account(account_id="account1",audience=audience)

三、实际应用中的问题与技巧

1、repeated类型赋值问题

如果把上面所讲repeated类型例子中的Python代码改成如下形式,那么在运行时会报错:

audience=[{"name":"ASR","tier":"stand"},{"name":"TTS","tier":"free"},{"name":"MT","tier":"stand"}] account=Account(account_id="account1") account.audience=audience

错误信息:

AttributeError: Assignment not allowed to repeated field "name" in protocol message object.

这与我们上面所说的message的两种赋值方式似乎有所出入,但事实是因为protobuf中的repeated类型并不是我们想象的那样与python中的list完全对应,因此在这里会出现问题。所以在实际应用中,我们应避免这种写法,尽量采用上面例子中的方式。另外我们还可以采用另外一种方式来达到同样的效果:

audience=[{"name":"ASR","tier":"stand"},{"name":"TTS","tier":"free"},{"name":"MT","tier":"stand"}] for audience1 in audience: a=account.audience.add() a.name=audience1['name'] a.tier=audience1['tier']

2、复杂message的数据构造问题

在实际测试的接口中,有时某个message的结构可能会非常复杂,比如像语音识别服务一些接口,协议里包含很多不同的message和repeated类型,这样对于我们编写测试客户端代码以及构造case、解析case都会有一些影响。之前我们介绍过使用命令行的方式传递参数的方式显然难以满足这种情景下的需求,手动拼message的方式也显得十分不便。

经过一番调研发现,对于这种情况,我们可以使用protobuf库中json_format里面的Parse、MessageToJson两个方法来有效解决,这两个方法可以实现protobuf message和json的互转。因为处理json的方式有很多,也很灵活,因此我们在构造case时可以使用json的方式,通过Parse方法直接将json转换成message。在收到返回结果之后,可以使用MessageToJson方法将message转换成json,这样对于我们测试人员来说,发送和接收的数据看起来都是json,无论是准备测试数据还检验结果都会轻松不少。

示例:

from google.protobuf import json_format json_obj='{"a1":1,"a2":2}' request = json_format.Parse(json_obj,MessageName()) json_result = json_format.MessageToJson(request) print (json_result)

其中MessageName为message的名称,json_result为转为json后的返回结果。

小结

本文介绍了protobuf数据类型与Python数据类型的一些联系以及构造方法。结合前面两篇所介绍的四种gRPC接口测试请求方法,我们就可以构造各种类型的数据、对各种不同的gRPC接口进行测试了。

最后作为一位过来人也是希望大家少走一些弯路,在这里我给大家分享一些软件测试的学习资料和我花了3个月整理的软件测试自学全栈,这些资料希望能给你前进的路上带来帮助。

视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中文论文格式模板使用指南

中文论文格式模板使用指南 【免费下载链接】中文论文格式模板下载分享 中文论文格式模板下载 项目地址: https://gitcode.com/Open-source-documentation-tutorial/90604 学术论文写作中&#xff0c;规范的格式要求往往让许多研究者感到困扰。为了简化这一过程&#xff…

windows下载Mingw,超级简单保姆,这都下不出来就别学c/c++了

windows下载Mingw 1.直接上干货&#xff0c;搜索vscode&#xff0c;进vscode官网&#xff1a;https://code.visualstudio.com/ 2.点击Docs3.点击languages4.再点击C5.往下滑找到下载链接点击

【怎么在手机上访问部署在电脑上的网页,不在一个局域网】

其实可以使用cloudefare提供的那个&#xff0c;支持使用自己的域名 百度回答 方法一&#xff1a;使用内网穿透工具&#xff08;推荐&#xff09; 通过工具如贝锐蒲公英或Ngrok&#xff0c;将本地服务映射到公网&#xff0c;手机直接访问生成的公网地址即可。无需公网IP&#xf…

26、线程编程中的库处理与调试提示

线程编程中的库处理与调试提示 在软件开发中,线程编程已经变得越来越普遍。当涉及到使用库时,无论是创建新库还是处理现有库,都有许多需要考虑的因素。同时,调试线程程序也面临着独特的挑战。本文将探讨如何使现有库具备线程安全性,以及如何避免在调试线程程序时遇到的问…

PIVlab粒子图像测速终极指南:从零开始掌握流体可视化

PIVlab粒子图像测速终极指南&#xff1a;从零开始掌握流体可视化 【免费下载链接】PIVlab Particle Image Velocimetry for Matlab, official repository 项目地址: https://gitcode.com/gh_mirrors/pi/PIVlab 还在为复杂的流体力学实验感到困惑吗&#xff1f;PIVlab粒子…

告别繁琐!FastAPI模板助你高效启动项目开发

告别繁琐&#xff01;FastAPI模板助你高效启动项目开发 【免费下载链接】FastAPI-boilerplate An extendable async API using FastAPI, Pydantic V2, SQLAlchemy 2.0, PostgreSQL and Redis. 项目地址: https://gitcode.com/gh_mirrors/fastap/FastAPI-boilerplate 还在…

27、线程编程中避免常见错误的指南

线程编程中避免常见错误的指南 在多线程编程中,避免错误是至关重要的。本文将详细介绍一些常见的线程编程错误类型,并提供相应的解决方法,帮助你在设计和调试过程中避免这些问题。 1. 避免依赖“线程惯性” 线程是异步的,这是多线程编程中需要时刻牢记的一点。在单处理器…

“没有网络安全就没有国家安全”就业转行网安的发展方向保姆级讲解,一定有适合你的黑客方向!

小白学网安必看&#xff01;就业/转行网安的发展方向保姆级讲解&#xff0c;一定有适合你的黑客方向&#xff01; “没有网络安全就没有国家安全”。 当前&#xff0c;网络安全已被提升到国家战略的高度&#xff0c;成为影响国家安全、社会稳定至关重要的因素之一。 一、网络安…

如何通过Cognita构建企业级RAG系统的完整指南

如何通过Cognita构建企业级RAG系统的完整指南 【免费下载链接】cognita RAG (Retrieval Augmented Generation) Framework for building modular, open source applications for production by TrueFoundry 项目地址: https://gitcode.com/GitHub_Trending/co/cognita …

Champ:基于3D参数化引导的可控一致人体图像动画革命

Champ&#xff1a;基于3D参数化引导的可控一致人体图像动画革命 【免费下载链接】champ Champ: Controllable and Consistent Human Image Animation with 3D Parametric Guidance 项目地址: https://gitcode.com/GitHub_Trending/ch/champ devin.cursorrules项目为AI编…

Evernote2md:高效笔记格式转换工具使用指南

Evernote2md&#xff1a;高效笔记格式转换工具使用指南 【免费下载链接】evernote2md Convert Evernote .enex files to Markdown 项目地址: https://gitcode.com/gh_mirrors/ev/evernote2md 在信息爆炸的时代&#xff0c;笔记管理成为每个人的必修课。Evernote2md作为一…

Thinking-Claude完全重塑指南:5种颠覆性思维模式彻底改变AI对话体验

Thinking-Claude完全重塑指南&#xff1a;5种颠覆性思维模式彻底改变AI对话体验 【免费下载链接】Thinking-Claude Let your Claude able to think 项目地址: https://gitcode.com/gh_mirrors/th/Thinking-Claude 在人工智能对话领域&#xff0c;思维重构正成为提升AI交…

代码随想录 200.岛屿数量

思路&#xff1a;&#xff08;1&#xff09;题目中每座岛屿只能由水平方向和竖直方向上相邻的陆地连接而成&#xff0c;也就是说斜角度的连接不算。例如示例二&#xff0c;是三个岛屿。&#xff08;2&#xff09;本题的思路是遇到一个没有遍历过的节点陆地&#xff0c;计数器就…

Rocket框架配置文件管理完整指南:从基础配置到高级实战

Rocket框架配置文件管理完整指南&#xff1a;从基础配置到高级实战 【免费下载链接】Rocket A web framework for Rust. 项目地址: https://gitcode.com/gh_mirrors/roc/Rocket Rocket框架作为Rust生态中备受推崇的web开发工具&#xff0c;其配置管理系统设计精妙且功能…

2025 年网络安全学习路线:从零基础到实战大神,避开 90% 的坑(非常详细,附工具包以及学习资源包)

2025 年网络安全学习路线&#xff1a;从零基础到实战大神&#xff0c;避开 90% 的坑 2025 年&#xff0c;数字化浪潮下的网络世界暗流涌动。数据泄露、勒索软件、供应链攻击如同悬在头顶的利剑&#xff0c;让企业和个人都绷紧了神经。 与此同时&#xff0c;网络安全人才市场却…

了解网络 构造网络

在 5G 全面普及、人工智能加速渗透的今天&#xff0c;网络信息技术早已不是程序员的专属技能&#xff0c;而是像 “办公软件” 一样的全民基础能力。小到个人手机流量管理、家庭网络搭建&#xff0c;大到企业数字化转型、智慧城市建设&#xff0c;都离不开网络信息技术的支撑。…

wangEditor实现word文档公式粘贴转MathML

《独立开发者的"富文本粘贴攻坚战"&#xff1a;从Word地狱到云端救赎的技术实录》 ——上海.NET程序员的破局之路 第一章&#xff1a;当需求文档变成"技术恐怖片" 作为独立开发者&#xff0c;我独自维护着一个基于Vue2 wangEditor的文档协作平台。某天&…

AxGlyph v12.25 终极矢量绘图指南 - 免费高效的论文插图解决方案

AxGlyph v12.25 终极矢量绘图指南 - 免费高效的论文插图解决方案 【免费下载链接】AxGlyphv12.25免费安装版-矢量图绘制软件 AxGlyph 是一款功能强大的矢量图绘制软件&#xff0c;适用于插图、曲线图标、流程图等多种矢量图的绘制。软件支持中文界面&#xff0c;操作简单易上手…

普通人学会后黑客技术能有多爽?一文讲清!

黑客一词已经被大家”神秘化了“&#xff0c;其实说白了就是网络安全工程师/专家。 在当今互联网当道期间&#xff0c;数据安全比以前任何时候都重要。黑客就是利用你的技能来改进安全系统并保护组织免受潜在的网络威胁。它是一种安全测试技术&#xff0c;用于识别计算机系统中…

网络信息技术从入门到精通:理论 + 实操 + 资源

在 5G 基站数量突破 337 万座&#xff08;工信部 2024 年数据&#xff09;、人工智能渗透率同比提升 47% 的今天&#xff0c;网络信息技术早已不是程序员的专属技能&#xff0c;而是像 “办公软件” 一样的全民基础能力。小到个人手机流量超额预警、家庭 Mesh 网络组网&#xf…