文章目录
- [1.Protocol buffers](#1.Protocol buffers)
- 2.如何进行PB(Protobuf)协议接口测试呢?
-
- 2.1定义pb结构体=定义消息Message
- [2.2 使用编译器生成想要语言的文件](#2.2 使用编译器生成想要语言的文件)
- [2.3 在各个语言中构建 Protobuf Runtime](#2.3 在各个语言中构建 Protobuf Runtime)
- [2.4 测试pb协议接口-代码示例](#2.4 测试pb协议接口-代码示例)
- [3. 测试流程-实际工作](#3. 测试流程-实际工作)
- 总结
✨✨✨学习的道路很枯燥,希望我们能并肩走下来!
编程真是一件很奇妙的东西。你只是浅尝辄止,那么只会觉得枯燥乏味,像对待任务似的应付它。但你如果深入探索,就会发现其中的奇妙,了解许多所不知道的原理。知识的力量让你沉醉,甘愿深陷其中并发现宝藏。

本文开始
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. 测试流程-实际工作
整个链条是这样的:
- 开发人员编写 demo.proto (定义数据结构)。
- 运行编译命令 (例如 protoc --java_out=src/main/java demo.proto)。
- 编译器生成 Demo.java (包含 Person 类等所有代码)。
- 测试/开发人员 在项目中引用这个生成的 Demo.java,然后就可以使用 Person.newBuilder() 等方法了。
总结
✨✨✨各位读友,本篇分享到内容是否更好的帮助你理解,如果对你有帮助给个👍赞鼓励一下吧!!
🎉🎉🎉世上没有绝望的处境,只有对处境绝望的人。
🎉🎉🎉一遇挫折就灰心丧气的人,永远是个失败者。而一向努力奋斗,坚韧不拔的人会走向成功。
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!


