FlatBuffers .NET 测试指南:在 Linux 上运行与清理 NetTest 测试套件
【免费下载链接】flatbuffersFlatBuffers: Memory Efficient Serialization Library项目地址: https://gitcode.com/GitHub_Trending/fl/flatbuffers
导读
本文以 FlatBuffers 仓库中的 tests/FlatBuffers.Test/README.md 为核心,系统讲解如何在 Linux 环境下编译并运行 C#/.NET 语言的 FlatBuffers 单元测试套件。你将掌握前置依赖的安装(mono 与 msbuild)、一键测试脚本NetTest.sh的完整执行流程、三种构建配置(默认 / UnsafeByteBuffer / SpanT)的差异,以及使用clean.sh清理下载缓存的方法;同时结合仓库中的测试源码与工程配置,理解这套测试到底在验证什么,以及如何自行扩展。
一、测试套件概览:它测什么
tests/FlatBuffers.Test是 FlatBuffers 仓库中面向 .NET(C#)运行时的测试工程。它并不使用常见的 NUnit/xUnit 框架,而是自带一套极简的测试运行器:通过FlatBuffersTestClassAttribute与FlatBuffersTestMethodAttribute两个自定义特性标记测试类与方法,再由 Program.cs 使用反射(Assembly.GetExecutingAssembly().GetExportedTypes())自动发现并逐个执行,最后输出N tests run, M failed的汇总结果,失败数大于 0 时以退出码 -1 结束。
测试内容覆盖了 .NET 运行时库的各个核心模块,主要测试类包括:
| 测试文件 | 覆盖范围 |
|---|---|
| ByteBufferTests.cs | ByteBuffer的读写、端序(Little/Big-Endian)处理、越界检查与对齐 |
| FlatBufferBuilderTests.cs | FlatBufferBuilder的构建、偏移量管理、字符串/向量/表的写入 |
| FlatBuffersExampleTests.cs | 端到端验证:用 C# 从零构建MonsterFlatBuffer,并与monsterdata_test.mon等 wire 文件交叉比对 |
| FlatBuffersFixedLengthArrayTests.cs | 定长数组([ubyte:4]等固定长度字段)的读写 |
| FlatBuffersFuzzTests.cs | 基于Lcg(线性同余伪随机数生成器)的模糊测试,随机构造数据验证鲁棒性 |
这些测试直接引用net/FlatBuffers目录下的运行时源码(ByteBuffer.cs、FlatBufferBuilder.cs、Table.cs、Struct.cs等)以及由tests/monster_test.fbs生成的测试类型,属于白盒级别的运行时验证。
二、前置条件:Linux 上需要安装什么
README 明确列出在 Linux 上运行测试需要两个前置工具:
- mono—— .NET Framework 兼容的跨平台运行时,用于最终执行编译出的测试二进制;
- msbuild—— 微软构建引擎,用于编译测试工程。
注意:这两者是构建与执行的宿主工具;
NetTest.sh内部还会额外下载 .NET Core SDK 用于dotnet restore还原 NuGet 依赖(详见下文)。
在 Debian/Ubuntu 系发行版上,典型的安装命令为:
sudo apt-get install mono-devel mono-mcs msbuild在 Fedora/RHEL 系上对应为:
sudo dnf install mono-devel msbuild安装完成后可用mono --version与msbuild -version验证环境是否就绪。
三、一键运行:./NetTest.sh 的完整执行流程
在满足前置条件后,进入测试目录并执行:
cd tests/FlatBuffers.Test ./NetTest.sh对照 NetTest.sh 的源码,该脚本依次完成以下步骤:
3.1 准备临时目录与下载 .NET 安装器
TEMP_DOTNET_DIR=.dotnet_tmp TEMP_BIN=.tmp [ -d $TEMP_DOTNET_DIR ] || mkdir $TEMP_DOTNET_DIR [ -f dotnet-install.sh ] || curl -OL https://dot.net/v1/dotnet-install.sh ./dotnet-install.sh --version latest --install-dir $TEMP_DOTNET_DIR- 首次运行时通过
curl下载官方dotnet-install.sh脚本(文件已存在则跳过下载); - 将 .NET SDK 安装到本地目录
.dotnet_tmp,不污染系统全局环境; - README 特别说明:下载的安装器与 SDK 在测试结束后不会被删除,它们会被保留以便后续多次运行复用,且这些文件已被 git 默认忽略,可以放心留在工作目录中。
3.2 创建解决方案并还原依赖
DOTNET=$TEMP_DOTNET_DIR/dotnet $DOTNET new sln $DOTNET sln add FlatBuffers.Test.csproj $DOTNET restore -r linux-x64 FlatBuffers.Test.csproj脚本用刚下载的 SDK 创建.sln解决方案、把测试工程加入其中,并以linux-x64运行时标识执行restore。依赖还原依据 FlatBuffers.Test.csproj 中的PackageReference:目前仅依赖Newtonsoft.Json 13.0.3(旧版使用 packages.config 管理 NuGet 包)。
3.3 以三种配置构建并运行
这是脚本的核心部分,同一份测试代码会以三种不同配置各构建、执行一次:
# 1) 默认配置 msbuild -property:Configuration=Release,OutputPath=$TEMP_BIN -verbosity:quiet FlatBuffers.Test.csproj $TEMP_BIN/FlatBuffers.Core.Test.exe # 2) 启用 UnsafeByteBuffer msbuild -property:Configuration=Release,UnsafeByteBuffer=true,OutputPath=$TEMP_BIN -verbosity:quiet FlatBuffers.Test.csproj $TEMP_BIN/FlatBuffers.Core.Test.exe # 3) 启用 SpanT msbuild -property:Configuration=Release,EnableSpanT=true,OutputPath=$TEMP_BIN -verbosity:quiet FlatBuffers.Test.csproj $TEMP_BIN/FlatBuffers.Core.Test.exe三种配置的含义可以在 FlatBuffers.Test.csproj 中找到依据:
| 配置 | 传递的属性 | 效果 |
|---|---|---|
| 默认 | 无 | 常规构建,仅 Debug/Release 配置允许 unsafe 代码块 |
| UnsafeByteBuffer | UnsafeByteBuffer=true | 设置AllowUnsafeBlocks并定义UNSAFE_BYTEBUFFER编译常量,启用基于指针的快速读写路径 |
| SpanT | EnableSpanT=true | 设置AllowUnsafeBlocks并定义ENABLE_SPAN_T编译常量,启用基于Span<T>的现代 .NET API 路径 |
UnsafeByteBuffer与EnableSpanT对应net/FlatBuffers运行时中两套可选的底层读写实现:前者通过 unsafe 指针绕过边界检查换取极致性能,后者利用Span<T>在保持安全性的同时降低分配开销。测试套件对两套实现分别运行全部用例,正是为了确保任何启用方式下行为一致。
3.4 清理构建产物
rm -fr $TEMP_BIN # 每次构建后删除二进制输出 rm FlatBuffers.Test.sln # 删除临时解决方案文件 rm -rf obj # 删除中间对象文件注意脚本清理的是.tmp与obj等构建产物,而.dotnet_tmp(下载的 SDK)和dotnet-install.sh会按 README 说明保留,供下次复用。
四、Windows 上的对应入口:NetTest.bat
虽然 README 聚焦 Linux,仓库同样提供了 Windows 版本的一键脚本 NetTest.bat。它使用系统安装的dotnetCLI 完成等价流程:创建解决方案、dotnet build -c Release、执行生成的FlatBuffers.Test.exe并删除临时目录。脚本注释标明它目前只支持默认配置,UnsafeByteBuffer与SpanT两种变体仍需通过 Linux 下的NetTest.sh覆盖。
五、清理下载缓存:./clean.sh
如果希望完全清除此前下载的 .NET 安装器与 SDK(例如磁盘空间紧张或希望强制重新下载最新版本),运行:
cd tests/FlatBuffers.Test ./clean.sh对照 clean.sh,它会删除以下内容:
.dotnet_tmp—— 下载的 .NET SDK 目录;packages—— NuGet 包缓存目录;.tmp—— 测试二进制输出目录;nuget.exe与dotnet-install.sh—— 下载的安装器脚本。
清理之后,下次执行NetTest.sh时会自动重新下载全部文件,README 明确说明"Those will be automatically re-downloaded when runningNetTest.sh",因此清理是安全且可逆的。
六、深入理解:工程配置与测试数据
6.1 目标框架与源码组织
FlatBuffers.Test.csproj 声明了双目标框架net6.0;net8.0。工程通过<Compile Include="..\..\net\FlatBuffers\...">直接链接 net/FlatBuffers 下的运行时源文件,同时以<Link>方式引入MyGame/Example、union_vector、optional_scalars、KeywordTest、namespace_test、nested_namespace_test等由.fbsschema 生成的多语言测试类型,覆盖枚举、联合、可选标量、命名空间嵌套、关键字冲突等边界场景。
6.2 测试数据文件
工程将两份数据文件以CopyToOutputDirectory=PreserveNewest复制到输出目录供测试读取:
tests/monsterdata_test.mon—— 二进制 FlatBuffer 数据;tests/monsterdata_test.json—— 对应的 JSON 表示。
FlatBuffersExampleTests.CanReadCppGeneratedWireFile()等用例正是利用这些文件验证 C# 运行时读取由其他语言(C++ 编译器)生成的 wire 数据的兼容性,这是跨语言序列化正确性的关键保障。测试目录下还有monsterdata_cstest.mon与monsterdata_cstest_sp.mon(后者为带 size-prefix 的变体),供 C# 侧独立生成的样本使用。
6.3 如何判断测试结果
Program.cs中的自定义运行器会在全部用例执行完毕后打印:
N tests run, M failed其中M为失败的用例数;若M > 0,进程返回码为 -1(shell 中表现为非零退出码),可用于 CI 流水线直接判定构建失败。单个用例失败时,控制台会输出测试类名: FAILED when invoking 方法名 with error ...的具体异常信息,便于定位问题。
七、常见问题与故障排查
msbuild: command not found:说明 mono/msbuild 未安装或不在PATH中,回到第二节完成安装;curl下载失败:NetTest.sh依赖网络下载dotnet-install.sh与 SDK,需要确认网络可达;下载失败时先删除残留的dotnet-install.sh再重试;- 测试全部通过但退出码非零:检查是否同时存在失败的断言用例(
M failed不为 0); - 想强制使用最新 .NET 版本:
NetTest.sh固定以--version latest安装,若希望更新缓存的 SDK,先运行clean.sh再重新执行NetTest.sh。
八、总结
FlatBuffers 的 .NET 测试套件提供了一条简洁、自包含的 Linux 验证路径:依赖仅有 mono 与 msbuild,NetTest.sh自动完成 SDK 下载、依赖还原、三种配置(默认 / UnsafeByteBuffer / SpanT)的编译与执行,测试产物即用即清,而下载缓存可被clean.sh一键清除。这套流程既适合开发者本地快速验证 C# 运行时改动,也适合 CI 环境做回归检查,是理解 FlatBuffers .NET 运行时各实现路径行为差异的最佳入口。
【免费下载链接】flatbuffersFlatBuffers: Memory Efficient Serialization Library项目地址: https://gitcode.com/GitHub_Trending/fl/flatbuffers
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考