ESP-IDF NVS 主机端测试指南:在 Linux 上构建、运行 nvs_host_test 并生成代码覆盖率报告

发布时间:2026/11/11 0:54:34

ESP-IDF NVS 主机端测试指南:在 Linux 上构建、运行 nvs_host_test 并生成代码覆盖率报告 ESP-IDF NVS 主机端测试指南在 Linux 上构建、运行 nvs_host_test 并生成代码覆盖率报告【免费下载链接】esp-idfEspressif IoT Development Framework. Official development framework for Espressif SoCs.项目地址: https://gitcode.com/GitHub_Trending/es/esp-idf在 ESP-IDF 中NVSNon-Volatile Storage非易失性存储组件负责在 Flash 分区上实现键值存储。components/nvs_flash/host_test/nvs_host_test是一个专为Linux 主机环境设计的测试应用它不依赖真实硬件而是通过 FreeRTOS mock、内存块设备ramdisk和 Catch2 测试框架在 PC 上直接对 NVS 核心逻辑进行单元测试。读完本文你将能够在 Linux 上正确构建该测试应用、理解其配置与测试组织结构、本地运行全部测试用例、通过 CI 的多种配置组合验证 NVS并生成components/nvs_flash组件的代码覆盖率报告。测试应用的整体结构在展开操作步骤之前先了解这个测试应用的组织方式有助于理解后面每一步命令的作用。从源码结构看nvs_host_test是一个标准的 ESP-IDF 工程CMakeLists.txt其关键特征如下目标平台固定为 Linux由 sdkconfig.defaults 中CONFIG_IDF_TARGETlinux决定该测试应用属于 Supported Targets: Linux。使用 FreeRTOS mock 而非真实 RTOS顶层 CMake 中通过EXTRA_COMPONENT_DIRS引入$IDF_PATH/tools/mocks/freertos/注释明确说明 This test app doesntrequire FreeRTOS, using mock instead。测试用例基于 Catch2main/idf_component.yml 声明了espressif/catch2: ^3.4.0依赖由于 Linux 目标下main入口通常由 freertos 组件提供这里通过链接Catch2WithMain让 Catch2 提供main函数。直接复用 NVS 组件源码main/CMakeLists.txt 将nvs_flash/src、nvs_flash/private_include加入包含路径并REQUIRES nvs_flash、PRIV_REQUIRES spi_flash同时设置WHOLE_ARCHIVE保证静态库符号完整保留。测试覆盖面广main组件下包含多组测试文件分别验证不同层面的 NVS 功能test_nvs.cppNVS 基本读写、命名空间等核心 APItest_nvs_cxx_api.cppC 风格接口test_nvs_handle.cpp句柄handleAPItest_nvs_initialization.cpp初始化与迭代器行为test_nvs_storage.cpp存储层加密/扇区擦除逻辑test_partition_manager.cpp分区管理bdl_ramdisk.cpp实现了一个基于内存的块设备blockdev ramdisk使 NVS 加密等依赖esp_blockdev的存储路径可以在无硬件环境下运行test_fixtures.cpp测试夹具负责分区表与块设备的初始化。此外main组件还显式添加了--coverage编译与链接选项这是后文生成覆盖率报告的前提。构建测试应用官方推荐的构建流程来自 README如下先激活 IDF 环境进入测试应用目录设置目标平台为 Linux然后执行构建。cd $IDF_PATH . ./export.sh cd components/nvs_flash/host_test/nvs_host_test idf.py --preview set-target linux idf.py build两点说明idf.py --preview set-target linux中的--preview表明 Linux 主机目标在当前仓库版本中仍属于预览preview阶段的目标使用时需注意其稳定性边界。构建时会应用 sdkconfig.defaults 中的默认配置其中与测试行为直接相关的项包括配置项取值作用CONFIG_IDF_TARGETlinux固定目标平台为 Linux 主机CONFIG_COMPILER_CXX_EXCEPTIONSy启用 C 异常测试代码为 CCONFIG_UNITY_ENABLE_IDF_TEST_RUNNERn不启用 Unity 测试 runner本应用使用 Catch2CONFIG_ESP_PARTITION_ENABLE_STATSy启用分区统计信息供分区管理测试断言使用CONFIG_PARTITION_TABLE_CUSTOMy使用自定义分区表文件CONFIG_PARTITION_TABLE_CUSTOM_FILENAMEpartitions_nvs_host_test.csv指定测试专用分区表CONFIG_PARTITION_TABLE_OFFSET0x8000分区表偏移对应的自定义分区表 partitions_nvs_host_test.csv 内容如下其中三个 NVS 数据分区分别用于普通、加密等不同的存储测试场景# Name, Type, SubType, Offset, Size, Flags # Note: if you have increased the bootloader size, make sure to update the offsets to avoid overlap nvs, data, nvs, , 0xa000, nvs_sec, data, nvs, , 0xa000, nvs_3sec, data, nvs, , 0x3000, phy_init, data, phy, , 0x1000, factory, app, factory, , 1M,构建完成后可执行文件位于build/nvs_host_test.elf。本地运行测试运行步骤来自 README 的官方说明cd $IDF_PATH ./components/nvs_flash/host_test/nvs_host_test/build/nvs_host_test.elfREADME 特别强调必须回到 IDF 根目录再运行该二进制。原因是测试用例内部存在若干基于相对路径的文件访问工作目录不对会导致这些相对路径解析失败。README 同时说明这是 CI 管线的一个已知限制——当时无法为 host 测试指定工作目录因此在 CI 之外本地复现时务必遵守上述运行位置约定。测试全部通过时输出中会出现All tests passed这也是 CI 判定通过的依据见下一节。CI 中的多配置运行方式CI 并不直接裸跑二进制而是通过 pytest_nvs_host_linux.py 使用 pytest-embedded 框架驱动测试应用pytest.mark.host_test pytest.mark.parametrize( config, [ default_set_key, legacy_set_key, esp_blockdev, ], indirectTrue, ) pytest.mark.parametrize(target, [linux], indirect[target]) def test_nvs_host_linux(dut: Dut) - None: dut.expect_exact(All tests passed, timeout60)parametrize列出了三种构建配置各自对应一份 sdkconfig 片段用于覆盖 NVS 不同的运行形态配置名对应文件覆盖场景default_set_keysdkconfig.ci.default_set_key默认行为显式CONFIG_NVS_LEGACY_DUP_KEYS_COMPATIBILITYn关闭旧版重复键兼容legacy_set_keysdkconfig.ci.legacy_set_keyCONFIG_NVS_LEGACY_DUP_KEYS_COMPATIBILITYy验证对旧版本重复键dup key数据的兼容逻辑esp_blockdevsdkconfig.ci.esp_blockdevCONFIG_NVS_BDL_STACKyNVS 内部改走esp_blockdev存储栈而非直接调用esp_partitionAPI与main/bdl_ramdisk.cpp提供的内存块设备配合验证加密 NVS 的块设备路径判定逻辑很直接在 60 秒内等待到精确输出All tests passed即视为该配置下全部用例通过。三种配置组合起来意味着同一套测试用例会在 默认/兼容旧键/块设备存储栈 三个维度上分别回归。生成代码覆盖率报告README 提供了生成覆盖率报告的官方命令cd components/nvs_flash/host_test/nvs_host_test idf.py build coverage open ./build/coverage_report/index.html这条命令能工作依赖顶层 CMakeLists.txt 中定义的两个 CMake 机制coverage自定义目标add_custom_target(coverage ...)其依赖coverage_report/index.html生成规则idf.py build coverage实际会触发gcovr生成 HTML 报告关键参数为--root $IDF_PATH/components/nvs_flash报告以 NVS 组件为根聚焦被测试组件而非整个工程--html-details输出逐文件的详细 HTML 报告--exclude .../managed_components/*排除通过组件管理器拉取的第三方依赖如 Catch2输出到${CMAKE_CURRENT_BINARY_DIR}/coverage_report/index.html即build/coverage_report/index.html。同时main/CMakeLists.txt 中对main组件强制开启--coverage编译与链接选项保证nvs_flash组件中的目标代码在测试运行时产生 gcov 数据文件。此外顶层 CMake 还定义了NO_DEBUG_STORAGE宏用于裁剪测试中不需要的调试存储路径。生成完成后用浏览器打开./build/coverage_report/index.html即可查看components/nvs_flash组件逐文件的行覆盖与分支覆盖明细。小结nvs_host_test展示了 ESP-IDF 主机端组件测试的一个完整范式以idf.py --preview set-target linuxidf.py build在无硬件环境完成构建用 FreeRTOS mocktools/mocks/freertos替代 RTOS用内存块设备bdl_ramdisk替代 Flash使 NVS 的加密存储、分区管理等核心逻辑可在 PC 上被 Catch2 用例完整覆盖运行二进制必须回到$IDF_PATH根目录以正确解析测试内的相对路径CI 通过 pytest_nvs_host_linux.py 在default_set_key、legacy_set_key、esp_blockdev三种配置下回归并以All tests passed输出作为通过判据借助 CMake 内置的coverage目标与gcovr一条idf.py build coverage即可获得 NVS 组件的 HTML 覆盖率报告便于维护者在改动 NVS 源码时评估测试覆盖情况。【免费下载链接】esp-idfEspressif IoT Development Framework. Official development framework for Espressif SoCs.项目地址: https://gitcode.com/GitHub_Trending/es/esp-idf创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/11/10 17:09:24

OpenClaw上云实战:广告营销团队的企业级Agent基础设施搭建

广告营销行业的团队,八成都有同一个感受:渠道后台越来越多,账户结构越来越复杂,素材需求越来越急,而人的精力就那么多。投放优化师一半时间花在拉数据、对报表、调价上,文案策划一天要赶几十条标题变体&…

2026/11/10 12:54:26

数字图像处理期末作业:OpenCV实践与算法优化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/11 0:52:30

弱电工证最低要什么学历在哪考才能顺利上岗

弱电工证最低要什么学历在哪考才能顺利上岗 你是不是正为找不到工作发愁,因为没有弱电工证?别急,这篇文章就是为你准备的。弱电工证是很多行业从业者必须持有的证件,特别是在河南房建工程领域,它直接关系到你能否顺利上岗。这篇文章就来帮你搞清楚:…

2026/11/11 0:52:30

考个低压电工证要多久 考证值不值得考要看这些

考个低压电工证要多久 考证值不值得考要看这些 之前考的证在外省能不能转过来?这是很多准备报考低压电工证的朋友最关心的问题。其实,这背后也藏着一个更深层的疑惑: 考个低压电工证要多久…

2026/11/11 0:52:30

邢台安检局电工证怎么考?良心建议让你少走弯路

邢台安检局电工证怎么考?良心建议让你少走弯路 你是不是正在为找不到工作发愁?手里没有特种作业证,企业根本不肯录用,这事儿真不是夸张。现在各行各业对 邢台安检局电工证 的要求越来越高,尤其是建筑施工、电力安装、制造业这些领域,…

2026/11/11 0:47:30

厦门供电局电工证复审怎么搞?2026河南最新政策别踩坑

厦门供电局电工证复审怎么搞?2026河南最新政策别踩坑 证书过期了不知道怎么复审延期?特别是像你这样在许昌中小施工企业干活的,电工证要是没及时复审,轻则影响项目进场,重则直接被清退。2026年河南最新政策出台后,很多地方对特种作业证书的复审…

2026/11/10 8:12:38

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/11 0:02:26

考低压电工证通过率考试真题与备考技巧

低压电工证通过率高不高?学历不高也能考,值不值得考? 你是不是总听说电工证能帮你找高薪工作,但又担心自己学历不够,考不上?其实,低压电工证考试门槛并没有你想象中那么高,关键是方法对不对。这篇文章就告诉你, 考低压电工证通过率到底有多高 ,…

2026/11/11 0:02:26

低压电工证学时千万别踩坑,濮阳毕业生怎么避坑报名

低压电工证学时千万别踩坑,濮阳毕业生怎么避坑报名 你是不是也和我一样,刚毕业就听说低压电工证学时必须达标才能上岗?可一打听,发现报名机构五花八门,价格参差不齐, 不知道去哪报名怕被中介坑…

2026/11/10 20:08:15

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/10 10:29:37

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑