pb协议接口测试

文章目录

✨✨✨学习的道路很枯燥,希望我们能并肩走下来!

编程真是一件很奇妙的东西。你只是浅尝辄止,那么只会觉得枯燥乏味,像对待任务似的应付它。但你如果深入探索,就会发现其中的奇妙,了解许多所不知道的原理。知识的力量让你沉醉,甘愿深陷其中并发现宝藏。



本文开始

1.Protocol buffers

Protocol buffers:是 Google用于序列化结构化数据的语言中立、平台中立、可扩展机制--想想XML,但更小、更快、更简单。您只需定义一次数据的结构化方式,然后就可以使用特殊生成的源代码轻松地将结构化数据写入和读取各种数据流,并使用各种语言。

应用场景:Dubbo, gRPC-主要

官网地址:https://grpc.io/docs/what-is-grpc/introduction/

2.如何进行PB(Protobuf)协议接口测试呢?

2.1定义pb结构体=定义消息Message

Protobuf :是高性能微服务通信(如 gRPC)的首选协议,它用二进制换来了极速传输,用预编译机制换来了数据结构的安全与稳定。

基础定义语法

原始类型:integers, booleans, floats

消息类型:message

字段规则:required-必传 optional-可选 repeated-重复

查看官方文档:https://protobuf.dev/programming-guides/proto3/

示例定义结构

proto3 和 proto2 语法差一点,详细查看官方文档

demo.proto文件定义如下:

bash 复制代码
syntax = "proto3"; // 或者 proto2

message Person {
  int32 id = 1;           // 字段1
  string name = 2;        // 字段2
  string email = 3;       // 字段3
  
  // 嵌套消息,对应 PhoneNumber
  message PhoneNumber {
    string number = 1;
    enum PhoneType {
      MOBILE = 0;
      HOME = 1;
      WORK = 2;
    }
    PhoneType type = 2;
  }
  
  repeated PhoneNumber phones = 4; // 字段4,重复类型
}

从定义的结构查看测试需要调用的方法

2.2 使用编译器生成想要语言的文件

编译消息到各个语言代码 Protocol Compiler

下载编译器

github上下载地址:
https://github.com/protocolbuffers/protobuf/releases

【注】对应平台下载相应版本的编译器

编译器命令行命令

命令:protoc下载路径 输出语法 输出路径文件夹 定义的Proto结构文件

bash 复制代码
# protoc下载路径 输出语法 输出路径文件夹 定义的Proto文件
xxx/protoc --java_out out_java/ demo.proto
# 将demo.proto文件编译成python文件
protoc --python_out=$DST_DIR demo.proto
# 将demo.proto文件编译成java文件
protoc --java_out=$DST_DIR demo.proto

2.3 在各个语言中构建 Protobuf Runtime

可以寻找的下载路径:https://github.com/protocolbuffers/protobuf?tab=readme-ov-file#fprotobuf-runtime-installation

示例:以Java为例,Java中配置依赖

xml 复制代码
<dependency>
  <groupId>com.google.protobuf</groupId>
  <artifactId>protobuf-java</artifactId>
  <version>3.21.4</version>
</dependency>

2.4 测试pb协议接口-代码示例

在项目代码中应用 序列化反序列化网络传输等

【注】在序列化和反序列化过程中,模拟实际网络传输

开发人员会定义好pb结构,也会编译生成对应的pb文件,测试人员需要编写单元测试,调用对应编译语言的文件方法(例如:调用了Java编译的方法),验证数据序列化和反序列化结果;

java 复制代码
@Test
void pbDemo() throws InvalidProtocolBufferException {
  //1.构建对象
	Person john = Person.newBuilder()
	    .setId(1234)
	    .setName("John Doe")
	    .setEmail("jdoe@example.com")
	    .addPhones(
	        Person.PhoneNumber.newBuilder()
	            .setNumber("555-4321")
	            .setType(Person.PhoneType.HOME)
	    )
	    .build();
	  //2.序列化-模拟发送端
	  byte[] raw = john.toByteArray();
	  //3.反序列化-模拟接收端
	  Person john2 = Person.parseFrom(raw);
	  //4.断言验证
	  //验证特定字段的值是否正确传递
	  assertEquals(john2.getId(), 1234);
	  //验证序列化=反序列化后结果
	  assertEquals(john,john2);
}

作用:

标准的 单元测试,用于验证 Protobuf 生成的 Java 类功能正常。

确保数据在"对象 <-> 二进制"转换过程中准确无误。

微服务架构(特别是使用 gRPC 时)中常见的测试环节。

3. 测试流程-实际工作

整个链条是这样的:

  1. 开发人员编写 demo.proto (定义数据结构)。
  2. 运行编译命令 (例如 protoc --java_out=src/main/java demo.proto)。
  3. 编译器生成 Demo.java (包含 Person 类等所有代码)。
  4. 测试/开发人员 在项目中引用这个生成的 Demo.java,然后就可以使用 Person.newBuilder() 等方法了。

总结

✨✨✨各位读友,本篇分享到内容是否更好的帮助你理解,如果对你有帮助给个👍赞鼓励一下吧!!
🎉🎉🎉世上没有绝望的处境,只有对处境绝望的人。
🎉🎉🎉一遇挫折就灰心丧气的人,永远是个失败者。而一向努力奋斗,坚韧不拔的人会走向成功。
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!

相关推荐
IpdataCloud2 小时前
资源受限设备上轻量级IP查询模块的部署方法
网络·数据库·网络协议·tcp/ip
青槿吖2 小时前
SpringMVC通关秘籍(下):日期转换器、拦截器与文件上传的奇幻冒险
java·开发语言·数据库·sql·mybatis·状态模式
weixin_456321642 小时前
Java架构设计:Redis AOF持久化深度解析(原理+实战+避坑)
java·开发语言·redis
楼田莉子2 小时前
MySQL数据库:表及其表相关的操作
数据库·学习·mysql
ZTLJQ2 小时前
驾驭高并发:Python协程与 async/await 完全解析
服务器·数据库·python
百年੭ ᐕ)੭*⁾⁾2 小时前
DataFrame存入mysql以及读取操作
数据库·mysql·numpy·pandas·ipython
²º²²এ松2 小时前
vs code连接ubuntu esp项目
linux·数据库·ubuntu
四谎真好看3 小时前
Redis学习笔记(实战篇3)
redis·笔记·学习·学习笔记
Maverick063 小时前
02-SQL执行计划与优化器:Oracle是怎么决定“该怎么查“的
数据库·sql·oracle·ffmpeg