
嵌入式系统编程【免费下载链接】fprimeF´ - A flight software and embedded systems framework项目地址https://gitcode.com/gh_mirrors/fpri/fprime点击查看免费下载导读本文聚焦 F´F Prime飞行软件与嵌入式系统框架中 CMake 构建系统自身的单元测试体系cmake-uts.md。这套测试用于验证 CMake 系统的各项核心功能符合 CMake SDD 的设计需求确保构建系统在自动化环境中长期可维护。读完本文你将掌握 CMake 构建系统测试的运行方式、测试套件的组织架构、底层 CMake 调用封装原理以及测试数据部署的构造方法可直接在本地虚拟环境中复现并扩展这套测试。测试目标验证构建系统的“需求合规”与“可维护性”F´ 的 CMake 构建系统承担着模块注册、依赖解析、自动代码生成autocoder、单元测试生成、部署生成等复杂职责。与普通项目测试不同这里的被测对象是构建系统本身——它必须通过自动化手段保证需求合规CMake 系统在运行过程中满足 CMake SDD 中规定的全部需求例如模块、可执行程序、单元测试的正确注册与产出核心流程稳定CMake 生成、构建、安装、字典生成等关键环节按预期工作可维护性通过自动化系统持续回归验证避免构建系统在演进过程中发生隐性破坏。这些测试全部存放在仓库的 cmake/test 目录下与运行时软件的单元测试如 test_unittests.py 中构建的各_ut_exe相互独立、互为补充前者验证构建系统本身后者验证被构建的软件模块。实现方式PyTest subprocess 调用 CMake原文档明确说明CMake 构建系统测试通过PyTest实现并借助 Python 标准库subprocess直接驱动cmake命令。选择这一方案的理由是PyTest提供标准的测试框架能力fixture、断言、参数化实现代码精简、可读性强subprocess以命令行方式运行 CMake最贴近真实用户操作路径能够暴露真实的命令行行为问题。这一封装体现在 cmake.py 中其核心函数构成了一条完整的“生成—构建—校验”调用链函数职责subprocess_helper(args, cwd)启动子进程并同时“tee”输出到控制台与捕获缓冲区支持 pytest 的-s/--captureno实时打印run_cmake(source_directory, build_path, options)将 options 字典转换为-Dkeyvalue参数并执行cmake在独立的临时构建目录中生成构建系统run_make(build_directory, target)在生成好的构建目录中执行make target -j2完成实际构建assert_process_success(data_object, errors_ok)统一断言 CMake 生成与各 make target 的返回码、stdout/stderr校验产物数据对象字段完整性get_build(...)组合以上步骤生成一个 session 级 pytest fixture并在测试结束后清理临时构建/安装目录subprocess_helper中使用了select.select对 stdout/stderr 做非阻塞读取避免管道阻塞导致死锁get_build则用tempfile.mkdtemp()创建隔离的构建目录并在 fixture 收尾时通过shutil.rmtree清理保证每次测试运行的确定性。环境准备与运行方法原文档给出了明确的运行前置条件与命令这里结合仓库补充完整上下文前置条件按照 F´ 安装流程在Python 虚拟环境virtual environment中运行 fprime系统必须已安装cmake与make可执行文件cmake.py 中直接以cmake、make命令调用已安装pytest。运行命令fprime cd cmake/test pytest执行后PyTest 会依次收集 src 目录下的测试文件并运行。若需要实时查看子进程输出可追加-s或--captureno参数此时subprocess_helper会将 CMake/make 的输出实时打印到终端。测试套件结构三类构建场景全覆盖src 目录下共有 4 个 Python 模块前三个文件分别构建不同的 CMake 场景覆盖构建系统的主要功能面。功能构建测试test_feature.pytest_feature.py 针对 TestDeployment 展开是覆盖面最广的一组测试验证框架模块识别检查Fw_*、Os、Svc_CmdDispatcher等框架模块的静态库libmodule.a是否生成在build/lib/platform/下对应settings.FRAMEWORK_MODULES列表外部库识别验证通过FPRIME_LIBRARY_LOCATIONS引入的两个测试库TestLibrary_TestComponent、TestLibrary2_TestComponent被正确构建部署产出确认可执行文件TestDeployment出现在build/bin/platform/autocoder 集成验证自定义 autocoder 生成的test-ac-1、test-ac-2两个产物存在自定义 target确认global-test、deployment-test、TestLibrary_TestComponent-test等 target 均被执行安装流程校验安装目录install/platform/lib/static/下所有静态库与install/platform/bin/TestDeployment存在。该测试的关键 CMake 参数如下展示了如何在一个测试部署中注入框架路径、项目根与外部库cmake.get_build( FEATURE_BUILD, settings.DATA_DIR / TestDeployment, { FPRIME_FRAMEWORK_PATH: settings.REF_APP_PATH.parent, FPRIME_PROJECT_ROOT: settings.DATA_DIR, FPRIME_LIBRARY_LOCATIONS: ;.join([ str(settings.DATA_DIR / test-fprime-library), str(settings.DATA_DIR / test-fprime-library2), ]), }, make_targets[TestDeployment, test, TestDeployment_test, TestLibrary_TestComponent_test], )其中FPRIME_LIBRARY_LOCATIONS使用;分隔多个库清单路径与 FPrime-Code.cmake 中遍历FPRIME_LIBRARY_LOCATIONS查找各*.cmake清单文件的逻辑一一对应。单元测试构建test_unittests.pytest_unittests.py 以 Ref 参考部署为被测对象使用BUILD_TESTINGON开启测试构建参见 cmake-advanced.md 中关于构建类型的说明构建目标为Ref与ut_exe随后断言框架模块与标准模块settings.FRAMEWORK_MODULES settings.STANDARD_MODULES的静态库全部产出Ref可执行文件以及全部 39 个单元测试可执行文件如Fw_Types_ut_exe、Svc_CmdDispatcher_ut_exe、Os_ut_exe等存在于build/bin/platform/安装目录包含对应静态库、Ref可执行文件以及 F´ 命令/遥测字典文件RefTopologyAppDictionary.xml位于install/platform/dict/。这组测试直接验证了register_fprime_ut等单元测试注册 API 的正确性——正如 API.cmake 所述单元测试仅在BUILD_TESTING启用时生成并使用MODULE_NAME_ut_exe作为默认可执行名与测试中断言的ut_exe目标命名完全吻合。共享库构建test_ref_shared.pytest_ref_shared.py 通过BUILD_SHARED_LIBSON验证构建系统的共享库动态库路径断言libmodule.soLinux或libmodule.dylibmacOS在构建目录与安装目录中均正确产出同时验证Ref可执行文件与字典文件的共享库安装形态。它与 cmake-intro.md 中描述的库类型配置相互印证。共享配置settings.pysettings.py 集中管理测试常量DATA_DIR指向 cmake/test/data 测试数据目录REF_APP_PATH指向仓库根目录的 Ref 参考部署FRAMEWORK_MODULES/STANDARD_MODULES/REF_MODULES框架、标准、参考部署三组模块清单供各测试断言产物时复用避免魔法字符串散落各处。测试数据部署TestDeployment 与测试库TestDeployment功能测试的载体TestDeployment/CMakeLists.txt 是功能测试的最小化部署展示了 F´ CMake API 的标准用法cmake_minimum_required(VERSION 3.13) cmake_policy(SET CMP0048 NEW) project(TestDeployment VERSION 1.0.0 LANGUAGES C CXX) include(${FPRIME_FRAMEWORK_PATH}/cmake/FPrime.cmake) register_fprime_target(target/test) # 注册自定义 target 及支撑它的 autocoder include(${FPRIME_FRAMEWORK_PATH}/cmake/FPrime-Code.cmake) set(SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/Main.cpp) set(MOD_DEPS Svc_CmdDispatcher TestLibrary_TestComponent TestLibrary2_TestComponent) register_fprime_deployment()其要点在于MOD_DEPS同时声明了框架模块Svc_CmdDispatcher与两个外部测试库模块从而在一个部署中同时验证框架依赖与库依赖的解析register_fprime_target(target/test)则用于验证自定义 target 注册机制。其 Main.cpp 是一个空操作可执行程序仅返回 0因为该部署的存在意义是测试构建系统而非业务逻辑。测试库清单FPRIME_LIBRARY_LOCATIONS 的验证样本test-fprime-library.cmake通过add_fprime_subdirectory(.../TestLibrary/TestComponent)将测试组件加入构建test-fprime-library2.cmake第二个库清单用于验证多库清单;分隔的解析。add_fprime_subdirectory定义于 API.cmake是add_subdirectory的封装它会自动计算组件的binary_dir以避免产物冲突并保持以仓库根为基准的标准 include 路径——这正是功能测试能同时在构建目录中产出TestLibrary_TestComponent与TestLibrary2_TestComponent两个库的原因。自定义 autocoder验证 autocoder 扩展点cmake/autocoder/test.cmake 演示了如何在测试中注入一个自定义 autocoderautocoder_setup_for_individual_sources()启用逐源文件处理test_is_supported通过autocoder_support_by_suffix(TestComponent.fpp ...)声明仅处理TestComponent.fpp文件test_setup_autocode定义生成脚本使用cmake -E touch在构建目录生成test-ac-1、test-ac-2两个标记文件。功能测试中的test_feature_autocoder正是通过断言这两个文件存在验证自定义 autocoder 被 CMake 正确发现并执行。关键 CMake 选项与测试的对应关系CMake 构建系统测试对以下选项尤其敏感理解它们有助于解读测试行为选项默认值对测试的影响BUILD_TESTINGOFF控制单元测试目标与ut_exe是否生成test_unittests.py 显式开启该选项BUILD_SHARED_LIBSOFF控制静态库/共享库构建路径test_ref_shared.py 显式开启FPRIME_ENABLE_FRAMEWORK_UTSON控制是否加入框架自身 UT 目标如 ci/tests/Ref.bash 所示CI 对 Ref 部署会以-DFPRIME_ENABLE_FRAMEWORK_UTSOFF关闭以聚焦部署自身的 UTFPRIME_ENABLE_AUTOCODER_UTSON与上述选项共同控制 autocoder 的 UT 是否生成见 FPrime-Code.cmake 中的__FPRIME_NO_UT_GEN__开关逻辑FPRIME_ENABLE_UTIL_TARGETSON控制check、coverage等 fprime-util 目标是否生成定义于 options.cmake在 FPrime-Code.cmake 中可以看到框架 UT 的门控逻辑当BUILD_TESTING与FPRIME_PRESCAN未定义时引入 googletest 与 STest随后依据FPRIME_ENABLE_FRAMEWORK_UTS与FPRIME_ENABLE_AUTOCODER_UTS的组合决定__FPRIME_NO_UT_GEN__最终控制框架各目录Fw、Svc、Os、Drv、CFDP、Utils中的 UT 目标是否注册。测试在 CI 中的集成这套 CMake 测试已经纳入仓库的持续集成流程。以 Ref.bash 为例CI 脚本会设置CTEST_OUTPUT_ON_FAILURE1、为 Ref 部署关闭框架 UT并遍历fputil目标generate、build、test 等逐一执行。此外fputil.bash 中可以看到 CI 同时运行部署test目录下的 pytest 集成测试并配合timeout --kill-after10s 180s pytest限定运行时长出现内存泄漏时输出 valgrind 日志并判定失败——这与 CMake 构建系统测试“在自动化环境中持续回归”的目标一脉相承。进一步阅读cmake-intro.mdCMake 构建系统入门理解模块、部署与库的基础概念cmake-api.mdCMake API 参考包含register_fprime_*系列函数的完整签名cmake-advanced.md构建类型、安装流程与进阶用法sdd.mdCMake 系统设计文档其中 5.3 节给出了BUILD_TESTINGON下的单元测试构建示例是本文所涉测试断言行为的权威依据。赞分享嵌入式系统编程【免费下载链接】fprimeF´ - A flight software and embedded systems framework项目地址https://gitcode.com/gh_mirrors/fpri/fprime点击查看免费下载相关推荐F´fprimeCMake 构建系统单元测试指南基于 PyTest 的构建系统自动化验证F´fprimeCMake 构建系统单元测试指南基于 PyTest 的构建系统自动化验证 本指南围绕 F´ 飞行软件框架的构建系统单元测试展开介绍这套以嵌入式系统编程F´ CMake 构建系统单元测试PyTest实战指南F´ CMake 构建系统单元测试PyTest实战指南 F´F Prime是一个由 NASA JPL 主导的开源飞行软件与嵌入式系统框架。其 CMake嵌入式系统编程F´ 框架 Autocoders/Python 测试套件基于 CMake 的构建配置与 Pytest 运行指南F´ 框架 Autocoders/Python 测试套件基于 CMake 的构建配置与 Pytest 运行指南 导读 本文聚焦 F´F Prime飞行软件嵌入式系统编程上一篇终极指南如何用biliTickerBuy轻松搞定B站会员购抢票难题下一篇探秘 CyberZHG Toolbox一款强大的在线编程工具箱创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考