本文档介绍了 Protocol Buffers (protobuf) 项目的开发工作流程、测试基础设施和贡献指南。它解释了如何有效地为代码库做贡献、使用测试框架以及确保跨平台兼容性。
Protocol Buffers 支持多种构建系统,其中 Bazel 是开发和测试的主要系统。
来源:.bazelrc1-42 ci/common.bazelrc1-84 examples/BUILD.bazel1-209 examples/WORKSPACE1-86 examples/MODULE.bazel1-31
Bazel 是主要的开发构建系统。该存储库包含针对不同构建类型的多个 Bazel 配置选项。
| 构建类型 | 配置 | 目的 |
|---|---|---|
| 调试 | --config=dbg | 带调试信息构建 |
| 优化 | --config=opt | 带优化构建 |
| ASAN | --config=asan | 用于内存错误的 AddressSanitizer |
| MSAN | --config=msan | 用于未初始化读取的 MemorySanitizer |
| TSAN | --config=tsan | 用于数据竞争的 ThreadSanitizer |
| UBSAN | --config=ubsan | UndefinedBehaviorSanitizer |
来源:.bazelrc1-42 ci/common.bazelrc1-84
Protocol Buffers 使用全面的测试基础设施来确保跨多种语言、平台和配置的可靠性。
来源:.github/workflows/test_cpp.yml1-591 .github/workflows/test_upb.yml1-318 .github/workflows/test_php.yml1-252 .github/workflows/test_ruby.yml1-213 .github/workflows/test_java.yml1-143 .github/workflows/test_objectivec.yml1-167 .github/workflows/test_python.yml1-126 .github/workflows/test_csharp.yml1-122
该项目使用 GitHub Actions 进行持续集成。CI 系统针对以下方面运行测试:
每个拉取请求在合并前都必须通过所有相关测试。
来源:.github/workflows/test_cpp.yml1-591 .github/workflows/test_java.yml1-143
Protocol Buffers 采用多种测试类型
| 测试类型 | 目的 | 示例 |
|---|---|---|
| 单元测试 | 测试单个组件 | //src/google/protobuf:map_test |
| 符合性测试 | 确保语言实现符合规范 | //conformance:conformance_test |
| 集成测试 | 测试组件之间的交互 | //examples:test |
| 内存测试 | 检查内存泄漏 | PHP 内存泄漏测试 |
| Sanitizer 测试 | 查找各种运行时问题 | ASAN, MSAN, TSAN, UBSAN |
来源:.github/workflows/test_cpp.yml30-37 .github/workflows/test_php.yml40-44 python/google/protobuf/internal/testing_refleaks.py1-129
Protocol Buffers 设计用于跨不同平台和架构工作。代码库包含平台检测逻辑和条件编译。
来源:src/google/protobuf/stubs/platform_macros.h1-115 .github/workflows/test_cpp.yml412-450
文件 src/google/protobuf/stubs/platform_macros.h 包含用于在编译时检测平台和架构的宏。
架构检测示例
GOOGLE_PROTOBUF_ARCH_X64GOOGLE_PROTOBUF_ARCH_IA32GOOGLE_PROTOBUF_ARCH_ARMGOOGLE_PROTOBUF_ARCH_AARCH64操作系统检测示例
GOOGLE_PROTOBUF_OS_APPLEGOOGLE_PROTOBUF_OS_ANDROID来源: src/google/protobuf/stubs/platform_macros.h15-79 .github/workflows/test_cpp.yml81-98
CI 系统在多个平台上测试 Protocol Buffers
此外,测试还在不同架构上运行
来源: .github/workflows/test_cpp.yml26-105 .github/workflows/test_cpp.yml148-167 .github/workflows/test_cpp.yml412-450
每种语言的实现都有特定的测试要求和配置。
C++ 测试包括:
--config=opt,--config=asan)来源: .github/workflows/test_cpp.yml26-105 .github/workflows/test_cpp.yml148-167
Python 测试包括:
Python 提供了一个特殊的 TestCase 来检测引用泄漏
来源: .github/workflows/test_python.yml26-125 python/google/protobuf/internal/testing_refleaks.py1-129
Java 测试包括:
来源: .github/workflows/test_java.yml26-122
PHP 测试包括:
来源: .github/workflows/test_php.yml26-186 .github/workflows/test_php_ext.yml1-78
Ruby 测试包括:
来源: .github/workflows/test_ruby.yml26-213
Objective-C 测试包括:
来源: .github/workflows/test_objectivec.yml26-167
C# 测试包括:
来源: .github/workflows/test_csharp.yml14-122
Rust 测试包括:
来源: .github/workflows/test_rust.yml1-57
该项目维护着一个 CONTRIBUTORS.txt 文件,以表彰对代码库做出贡献的人员。贡献以各种形式出现,包括:
典型的开发工作流程包括
贡献 Protocol Buffers 时,请确保
Protocol Buffers 区分预提交测试和持续测试
这种方法平衡了全面性和开发速度。
来源: .github/workflows/test_cpp.yml3-19 .github/workflows/test_java.yml3-20
对于 Python、PHP 和 C++ 等语言,该项目包含专门用于检测内存泄漏的测试。
来源: python/google/protobuf/internal/testing_refleaks.py1-129 .github/workflows/test_php.yml40-44
Sanitizer 工具可帮助检测各种运行时问题
来源: .bazelrc13-35 ci/common.bazelrc8-35
Protocol Buffers 项目拥有全面的开发和测试基础设施,旨在确保跨多种语言、平台和架构的可靠性。通过遵循本文档中概述的指南,贡献者可以有效地开发和测试代码库的更改。
有关 Protocol Buffers CI/CD 系统的更多信息,请参阅 持续集成。