ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Unity 测试框架的 Meson Test Runner 自动生成:从 subproject 到构建管线的一体化实践

Unity 测试框架的 Meson Test Runner 自动生成:从 subproject 到构建管线的一体化实践 测试嵌入式【免费下载链接】UnitySimple unit testing for C项目地址https://gitcode.com/gh_mirrors/un/Unity点击查看免费下载导读本文聚焦 Unity面向 C 语言的单元测试框架在Meson 构建系统下的测试运行器Test Runner自动生成方案。如果你不使用 Ceedling就需要自行生成*_Runner.c而借助 Unity 仓库内置的 Meson generator可在把 Unity 作为 subproject 引入时仅用两行 Meson 语句拿到生成器、自动产出包含main入口的测试驱动文件并像普通源文件一样纳入构建。读完本文你将掌握gen_test_runner生成器的获取与调用、测试文件绝对路径的传入方式、与test()集成成可执行测试程序以及生成器底层generate_test_runner.rb的关键行为与限制。为什么需要自动生成 Test Runner在 Unity 的常规工作流中每个测试文件例如test_example.c都需要一个配套的test_example_Runner.c它提供main方法以及测试执行所需的管道plumbing包含必要的头文件、声明各测试函数的外部引用、实现setUp/tearDown的调用序列、统计并通过UNITY_END()汇总结果等。使用 Ceedling 时这一切是自动完成的一旦脱离 Ceedling手动为每个测试文件维护 Runner 既繁琐又易错。Unity 仓库在 auto/generate_test_runner.rb 中提供了一个 Ruby 脚本只要给定测试文件就能生成对应的 Runner。而为了让 Meson 用户免于手工执行该脚本仓库在根 meson.build 中将其包装为一个 Meson generator# Create a generator that can be used by consumers of our build system to generate # test runners. gen_test_runner generator( find_program(auto/generate_test_runner.rb), output: BASENAME_Runner.c, arguments: [EXTRA_ARGS, INPUT, OUTPUT] )可以看到生成器的三个要素程序auto/generate_test_runner.rb由find_program解析为可执行脚本输出命名BASENAME_Runner.c即输入test_example.c会得到test_example_Runner.c与文档描述的命名一致参数模板EXTRA_ARGS用于透传额外参数INPUT为输入的测试文件OUTPUT为生成的 Runner 文件。在父项目中获取生成器subproject 用法通常的做法是把 Unity 作为 Meson subproject 引入并从父项目访问其暴露的变量。文档给出的核心片段如下unity_proj subproject(unity) runner_gen unity_proj.get_variable(gen_test_runner)get_variable(gen_test_runner)正是取回上文定义的 generator 对象。之后把它当作普通对象对测试文件调用.process()即可触发生成。仓库中 examples/example_1/meson.build 给出了完整可运行的示范该示例通过 examples/example_1/subprojects/unity.wrap 以 git wrap 方式拉取 Unityunity_subproject subproject(unity) unity_dependency unity_subproject.get_variable(unity_dep) unity_gen_runner unity_subproject.get_variable(gen_test_runner) src1 files([ src / ProductionCode.c, test / TestProductionCode.c, ]) test1 executable(test1, sources: [ src1, unity_gen_runner.process(test / TestProductionCode.c) ], include_directories: [ inc ], dependencies: [ unity_dependency ], ) test(test1, test1, should_fail: true)这里同时获取了两个变量unity_depUnity 的编译/链接依赖由 meson.build 中的declare_dependency(link_with: unity_lib, include_directories: unity_inc)定义gen_test_runnerRunner 生成器。unity_gen_runner.process(test / TestProductionCode.c)的返回值生成的TestProductionCode_Runner.c被直接放进sources与测试文件、被测源码一起编成可执行程序最后通过test(test1, test1)注册为 Meson 测试。整个流程无需任何手工步骤。examples/example_4则演示了另一条路径——通过系统安装的dependency(unity)使用 Unityexamples/example_4/meson.build并在 examples/example_4/test/test_runners/meson.build 中把已生成的 Runner 与测试文件配对构建。相较之下subproject generator 的方式省去了在仓库中提交 Runner 文件的需求。关键细节为何需要传入绝对路径文档特别强调传给生成器的必须是测试文件的绝对路径并指出这看起来是 Meson 处理 subproject 路径时的一个 bug。原因在于generator 定义在 Unity 的 subproject 内其内部的相对路径解析基于 subproject 的构建目录若直接传相对路径脚本可能找不到测试文件。文档给出的解决方法是借助meson.source_root()test_runner meson.source_root() / test/test_example.c即把父项目根目录下的相对路径拼成绝对路径后再交给生成器。这一写法在examples/example_1中并不需要那里直接传了相对路径也能工作因此在没有遇到路径解析问题的环境中直接使用.process(test/TestProductionCode.c)是可行的但若在更复杂的 subproject 嵌套场景中遇到文件未找到请优先按文档建议改用绝对路径。将 Runner 纳入构建与 test 注册生成器输出的 Runner 是构建期中间产物因此它应作为executable(...)的sources之一参与编译并与 Unity 依赖unity_dep一起链接之后用test(test-name, exe)注册Meson 会负责在meson test时运行它并汇总结果。需要特别留意的限制文档明确给出Meson 会在每个 build target 的私有目录private directory中创建 Runner 文件它只服务于构建过程本身。如果你的工作流需要在构建之后引用该 Runner 文件例如拷贝到其他目录、手工重编译generator 的产物对你并不可用——此时应当把生成脚本作为构建工具链的一部分或预先手动生成并提交 Runner 源码。生成器底层的 Runner 长什么样可以用仓库中的真实产物对照验证。examples/example_1/test/TestProductionCode.c测试文件经过生成后得到 examples/example_1/test/test_runners/TestProductionCode_Runner.c其结构包含自动探测并#include的头文件unity.h、被测模块头ProductionCode.h及系统头所有测试函数的外部声明如extern void test_FindFunction_..._ShouldReturnZeroIfItemIsNotInList_...setUp/tearDown/resetTest的调用逻辑对每个测试执行Unity.CurrentTestName、Unity.CurrentTestLineNumber的设置、TEST_PROTECT()保护下的用例调用、UnityConcludeTest()收尾最终的main与UNITY_END()。文件头部带有/* AUTOGENERATED FILE. DO NOT EDIT. */标记提醒任何针对它的修改都会被重新生成覆盖。生成器的能力面generate_test_runner.rb 的输入输出虽然 Meson 侧只暴露了gen_test_runner一个入口其底层脚本 auto/generate_test_runner.rb 本身是一个功能完整的命令行工具理解它有助于排查生成问题或理解EXTRA_ARGS能透传什么。直接运行脚本的用法为ruby auto/generate_test_runner.rb (files) (options) input_test_file (output)其中input_test_file是待生成 Runner 的 C 测试文件output缺省时自动取input_test_file去掉.c后缀并追加_Runner.c。脚本支持的主要文件与选项来自脚本内建的 usage 信息参数/选项作用*.yml/*.yaml从配置文件中:unity或:cmock段加载选项由 yaml_helper.rb 解析*.h作为额外#include加入 Runner-cexception生成支持 CException 的 Runner-externc为 C 兼容性添加extern C包裹--setup_name/--teardown_name重定义setUp/tearDown函数名--main_name重定义main函数名设为:auto时按文件自动生成--test_prefix重定义测试函数前缀默认test\|spec\|should--test_reset_name/--test_verify_name重定义resetTest/verifyTest函数名--suite_setup/--suite_teardown注入整个测试套件的 setup/teardown 代码--use_param_tests1启用参数化测试默认关闭支持TEST_CASE/TEST_RANGE/TEST_MATRIX--omit_begin_end1省略UnityBegin与UNITY_END调用默认关闭--header_file同时生成测试头文件--shuffle_tests1随机打乱测试执行顺序默认关闭内部采用 Fisher-Yates 洗牌--rng_seed1洗牌随机种子0 表示用时间做种子脚本的解析核心在find_tests与find_includesgenerate_test_runner.rb它会先对源码做字符串/注释擦洗scrubbing再以正则匹配void test_xxx(...)形式的函数来枚举测试find_mocks则根据Mock前缀识别 CMock mock 头文件并在 Runner 中生成CMock_Init/Verify/Destroy管理逻辑。这解释了为何只要遵循test_前缀命名约定Runner 就能自动发现全部测试。另外当测试文件中没有任何匹配测试时生成器会自动注入一个test_empty_warning占位用例并输出TEST_IGNORE_MESSAGE(...)避免产出无法运行的 Runner——这一行为同样适用于 Meson 生成器路径。小结获取生成器unity_proj subproject(unity)后runner_gen unity_proj.get_variable(gen_test_runner)调用生成对测试文件执行runner_gen.process(test_file)将结果加入executable(...)的sources路径注意subproject 场景下路径解析可能出错必要时用meson.source_root() / test/test_example.c传入绝对路径产物性质Runner 是构建期私有目录中的中间文件只可用于构建构建完成后无法再引用底层能力生成器封装的是auto/generate_test_runner.rb其丰富的 CLI 选项参数化测试、洗牌、suite setup/teardown 注入等在需要定制时可通过EXTRA_ARGS或直接调用脚本发挥。仓库内的 examples/example_1/meson.build 与 examples/example_4/test/test_runners/meson.build 是两份可以直接对照的实战范例前者完整展示了 subproject generator 的最小集成后者展示了基于已生成 Runner 的组装方式可作为新项目接入时的模板参考。赞分享测试嵌入式【免费下载链接】UnitySimple unit testing for C项目地址https://gitcode.com/gh_mirrors/un/Unity点击查看免费下载相关推荐Unity测试新范式ET框架与Test Runner无缝集成Unity测试新范式ET框架与Test Runner无缝集成 你还在为Unity项目测试效率低下而困扰吗当业务逻辑与测试代码纠缠不清时是否渴望一套标准化的游戏开发后端微服务云原生如何快速上手trt-samples-for-hackathon-cnTensorRT新手必备教程如何快速上手trt samples for hackathon cnTensorRT新手必备教程 trt samples for hackathon cn是一超实用chineseocr_lite单元测试框架Google Test自动化测试实践指南超实用chineseocr_lite单元测试框架Google Test自动化测试实践指南 chineseocr_lite是一款超轻量级中文OCR项目支持竖人工智能计算机视觉深度学习OCR上一篇Rugby终极CocoaPods缓存工具让Xcode项目编译速度提升3倍下一篇SVG优化终极指南SVGOMG完整使用教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表