
智能硬件嵌入式硬件开发【免费下载链接】X-TRACKA GPS bicycle speedometer that supports offline maps and track recording项目地址https://gitcode.com/gh_mirrors/xt/X-TRACK点击查看免费下载导读本文基于 X-TRACK 仓库内置的 LVGL 8.x 测试套件位于 lvgl/tests/README.md展开完整讲解 LVGL 测试的两大类用例可执行测试与仅编译测试、本地运行与自动化 CI 触发方式、测试目录结构与新增测试用例的标准流程并结合仓库内main.py、CMakeLists.txt、Unity 测试引擎与真实测试用例源码深入解析断言体系含截图比对与颜色比对以及 800x480 / 32bit / 默认主题等参考截图生成前提。读完本文你将掌握在 X-TRACK 及其 LVGL 模拟器环境中独立运行、扩展并集成 LVGL 回归测试的完整实战方法。LVGL 测试套件概览两类测试与双通道运行Software/X-Track/Simulator/LVGL.Simulator/lvgl/tests/目录下承载的是 LVGL 库自身的测试工程其设计目标是让测试既能在本地一键运行也能被 GitHub CI 在每次 push 与 pull request 时自动执行针对master与releasev8.*分支。从 main.py 的帮助信息epilog部分可以看到这套测试被明确划分为两种类型build仅编译测试只验证程序在各种编译选项组合下能否成功编译并链接。这类测试不关心运行期行为主要用于捕捉配置组合、头文件包含与链接层面的回归。test可执行测试编译后实际运行通过 Unity 测试框架中的断言验证 LVGL 库的真实行为例如控件默认值、按键事件、范围滑块调节逻辑等。两种运行通道相互独立本地运行通过./tests/main.py驱动底层依赖 CMake 构建、CTest 执行自动运行由 GitHub CI 在代码推送到master或releasev8.*分支包括 Pull Request时自动触发。本地运行环境准备与三条核心命令安装依赖Linux测试工程建议在 Linux 下运行首先通过脚本一次性安装前置依赖scripts/install-prerequisites.sh该脚本位于 tests 目录 的上级scripts/目录下用于安装 CMake、编译工具链、Ruby生成测试运行器以及覆盖率工具 gcovr 等必要组件。三种典型运行方式根据 README 的说明最常用的三条命令为# 1. 运行全部可执行测试 ./tests/main.py test # 2. 仅编译所有 build-only 测试 ./tests/main.py build # 3. 清理旧的构建产物 → 编译 build-only 测试 → 运行可执行测试 → 生成代码覆盖率报告 ./tests/main.py --clean --report build test第三条命令集成了完整的回归流程--clean删除历史构建目录build与test两个 action 按顺序执行--report在测试结束后调用 gcovr 生成覆盖率报告。main.py 的参数体系查看 main.py 的参数定义可得到完整参数表参数作用说明test编译并运行可执行测试默认对OPTIONS_TEST_SYSHEAP与OPTIONS_TEST_DEFHEAP两套配置执行build仅编译 build-only 测试默认对 5 套编译配置执行见下文配置矩阵--build-options name只构建/运行指定的配置名称必须是build_only_options或test_options字典中的合法键--clean操作前清理旧构建产物删除对应的build_options目录--report生成代码覆盖率报告输出 HTMLreport/index.html与 XMLreport/coverage.xml--help可查看完整说明当同时传入build与test时main.py 会合并两套配置字典见main.py中options_to_build {**build_only_options, **test_options}的逻辑。构建与执行的内部调用链从 main.py 源码可以还原完整的底层流程generate_test_runners()先用 Ruby 脚本unity/generate_test_runner.rb为src/test_cases/下每个test_*.c生成对应的src/test_runners/name_Runner.c运行器源码build_tests(options_name, build_type, clean)按配置名创建build_options目录首次创建时执行cmake -DCMAKE_BUILD_TYPEDebug -DOPTIONS_NAME1 ..随后用cmake --build dir --parallel cpu_count并行编译run_tests(options_name)仅对可执行测试配置执行ctest --timeout 30 --parallel cpu_count --output-on-failure单个测试超时 30 秒即判失败generate_code_coverage_report()用gcovr生成带 HTML 详情与 XML 的覆盖率报告并排除examples/、src/test_*、src/lv_test*、unity等非目标目录。自动运行CI 集成方式README 明确指出GitHub CI 会在 push 及 pull request 到master与releasev8.*分支时自动执行整套测试。这意味着开发者提交 PR 前无需手动跑完全部矩阵CI 会代为验证与--clean --report build test对应的完整流程清理、编译、执行、覆盖率可在 CI 上复现保证本地与云端行为一致可执行测试失败时--output-on-failure会让 CTest 输出失败用例的详细断言信息便于在 CI 日志中定位问题。测试目录结构详解根据 README 并结合仓库实际内容tests/目录职责如下Software/X-Track/Simulator/LVGL.Simulator/lvgl/tests/ ├── src/ # 测试源码 │ ├── test_cases/ # 手写的测试用例test_name.c │ ├── test_runners/ # 由 test_cases 自动生成的运行器勿手改 │ ├── lv_test_init.c # 测试环境初始化800x480 虚拟显示、三类输入设备 │ ├── lv_test_indev.c # 鼠标/键盘/编码器模拟输入驱动 │ ├── lv_test_conf.h # 测试专用 LVGL 配置头文件 │ ├── test_fonts/ # 测试用字体资源 │ └── ... # 其他辅助文件 ├── ref_imgs/ # 截图比对参考图片如 dropdown_1.png、table_1.png ├── report/ # 覆盖率报告输出目录传入 --report 时生成 ├── unity/ # Unity 测试引擎源码与运行器生成脚本 ├── config.yml # 测试运行器生成配置suite 初始化/收尾 ├── CMakeLists.txt # 构建脚本含各编译配置矩阵 └── main.py # 一键构建/运行/覆盖率入口其中 config.yml 定义了生成运行器时的统一行为每个测试文件都自动包含lv_test_init.hsuite_setup固定执行lv_test_init();初始化 LVGL 与虚拟 HALsuite_teardown执行lv_test_deinit();并返回失败计数从而保证所有测试共享一致的环境生命周期。测试环境的“虚拟硬件”从 lv_test_init.c 可见测试在无真实屏幕的设备上运行虚拟显示驱动HOR_RES800、VER_RES480flush_cb为dummy_flush_cb直接把帧缓冲拷贝到测试用的test_fb数组供截图比对使用三类模拟输入设备鼠标指针、键盘、编码器均由 lv_test_indev.c 提供回调实现。lv_test_indev.c 中的模拟 API 是编写交互类测试的关键工具API功能lv_test_mouse_move_to(x, y)/lv_test_mouse_move_by(x, y)移动鼠标坐标lv_test_mouse_click_at(x, y)在指定坐标完成一次点击lv_test_key_hit(k)发送一次按键如LV_KEY_RIGHTlv_test_encoder_turn(d)旋转编码器正负值对应方向lv_test_encoder_click()按下并释放编码器lv_test_indev_wait(ms)等待指定毫秒并持续驱动lv_timer_handler()模拟时间流逝新增测试从模板到断言的完整流程第一步创建测试文件在src/test_cases/下新建以test_name.c命名的文件基础骨架直接复制 test_cases/_test_template.c#if LV_BUILD_TEST #include ../lvgl.h #include unity/unity.h void setUp(void) { /* Function run before every test */ } void tearDown(void) { /* Function run after every test */ } void test_func_1(void) { TEST_FAIL(); } #endif要点整个文件必须包在#if LV_BUILD_TEST ... #endif中该宏由 CMake 通过-DLV_BUILD_TEST注入setUp/tearDown分别在每个测试函数前后执行用于准备与清理对象_test_template.c本身被 CMakeLists.txt 显式跳过if (${test_name} STREQUAL _test_template) continue()不会被编译为测试可执行文件。第二步编写断言Unity 提供了大量标准断言如TEST_ASSERT_EQUAL_INT32、TEST_ASSERT_TRUE、TEST_ASSERT_NULL等同时该套件还封装了两个 LVGL 专属断言TEST_ASSERT_EQUAL_SCREENSHOT(image1.png)渲染当前活动屏幕并与ref_imgs/目录下同名参考图片做像素级比对。若比对失败会在lvgl/test_screenshot_error.h中生成失败帧缓冲内容在测试文件中#include test_screenshot_error.h并调用test_screenshot_error_show();即可查看出错画面。TEST_ASSERT_EQUAL_COLOR(color1, color2)比较两个lv_color_t颜色值是否相等。仓库真实用例可作为参考test_dropdown.c 使用TEST_ASSERT_EQUAL_SCREENSHOT(dropdown_1.png)验证下拉框渲染结果test_obj_tree.c 使用TEST_ASSERT_EQUAL_COLOR校验对象树中的颜色属性test_table.c 则对表格组件做截图比对。第三步模拟交互类测试实战以 test_slider.c 为例可看到交互测试的标准写法在setUp中创建被测控件slider并创建lv_group_t组绑定到模拟编码器lv_test_encoder_indev测试函数中先用lv_slider_set_value(slider, 10, LV_ANIM_OFF)设置初值再通过lv_event_send(slider, LV_EVENT_KEY, key)直接注入按键事件验证LV_KEY_RIGHT/LV_KEY_UP使值 1、LV_KEY_LEFT/LV_KEY_DOWN使值 -1、无效键如LV_KEY_ENTER不改变值对范围RANGE模式滑块则组合lv_test_encoder_click()进入编辑态、lv_test_encoder_turn(-10)旋转编码器调节右旋钮、再次点击切换焦点到左旋钮后lv_test_encoder_turn(5)最终断言lv_slider_get_value与lv_slider_get_left_value的期望值。这种“先构造对象 → 注入事件/模拟输入 → 断言状态”的范式适用于绝大多数组件级回归测试。构建配置矩阵7 套编译选项的完整说明CMakeLists.txt 与main.py共同定义了 7 套配置。其中 5 套为 build-only2 套为可执行测试配置各自的核心参数如下配置名类型关键编译参数OPTIONS_MINIMAL_MONOCHROMEbuild-onlyLV_COLOR_DEPTH1、LV_MEM_SIZE65535、LV_DPI_DEF40、LV_DRAW_COMPLEX0、LV_USE_METER0关闭各类断言OPTIONS_NORMAL_8BITbuild-onlyLV_COLOR_DEPTH8、LV_DRAW_COMPLEX1、开启子像素渲染LV_USE_FONT_SUBPX1OPTIONS_16BITbuild-onlyLV_COLOR_DEPTH16、LV_COLOR_16_SWAP0、开启渐变抖动LV_DITHER_GRADIENT1OPTIONS_16BIT_SWAPbuild-onlyLV_COLOR_DEPTH16、LV_COLOR_16_SWAP1另开LV_DITHER_ERROR_DIFFUSION1与 8KB 渐变缓存OPTIONS_FULL_32BITbuild-onlyLV_COLOR_DEPTH32、LV_MEM_SIZE8388608、LV_DPI_DEF160、LV_LOG_LEVELLV_LOG_LEVEL_TRACE开启全部五类断言NULL/MALLOC/MEM_INTEGRITY/OBJ/STYLE与全部字体、LV_USE_FS_STDIO/POSIX、BIDI、消息等高级特性OPTIONS_TEST_SYSHEAPtest基于 32bit 公共配置LV_MEM_CUSTOM1LVGL_CI_USING_SYS_HEAP使用系统堆并开启-fsanitizeaddress与--coverageOPTIONS_TEST_DEFHEAPtest基于 32bit 公共配置LVGL_CI_USING_DEF_HEAPLV_MEM_SIZE2097152LVGL 内部堆同样开启 ASan 与覆盖率可执行测试共用一套LVGL_TEST_OPTIONS_TEST_COMMON基准32bit 色深、2MB 内存、开启日志LV_LOG_PRINTF1、子像素与 BIDI、stdio/posix 文件系统、示例与 demo 编译LV_BUILD_EXAMPLES1、LV_USE_DEMO_WIDGETS1、LV_USE_DEMO_STRESS1。编译期间还施加了严格的告警策略-Wall -Wextra -Werror -Wpedantic-errors等任何告警都会导致构建失败从编译层面保证代码质量。双堆SYSHEAP与DEFHEAP加 AddressSanitizer 的组合使同一批测试在“系统堆 自定义内存分配器”与“LVGL 内置堆”两种内存模型下各跑一遍能有效暴露内存越界、重复释放与堆碎片问题——这正是嵌入式 GUI 最常出 bug 的领域。新增参考截图环境要求与生成方法当新测试使用TEST_ASSERT_EQUAL_SCREENSHOT时需要先在ref_imgs/中准备参考图。README 给出的获取方法是把测试代码复制进 LVGL 模拟器并保存屏幕画面。为保证比对可复现模拟器环境必须满足800x480 分辨率与 lv_test_init.c 中HOR_RES800、VER_RES480一致32 位色深禁用LV_USE_PERF_MONITOR与LV_USE_MEM_MONITOR否则屏幕角落会绘制性能/内存监控信息污染参考图使用默认主题与默认颜色不要手动设置主题自定义主题会改变控件渲染外观导致像素级比对失败。截图比对属于严格像素级校验任何环境差异分辨率、色深、主题、监控浮层都会造成误报因此生成参考图的环境必须与测试运行环境完全对齐。与 X-TRACK 项目的结合点X-TRACK 的 PC 模拟器位于 Simulator/LVGL.Simulator其lvgl/目录正是上述测试套件所属的 LVGL 8.x 源码项目的实际 UI表盘、实时地图、系统信息等页面见 USER/App/Pages全部构建于这套 LVGL 之上。这意味着升级或修改lvgl/前可在本地运行./tests/main.py --clean --report build test完成一次完整的 LVGL 回归避免影响上层页面渲染新增自定义控件或对既有控件行为做改动时可参照 test_cases 中 20 余个测试文件覆盖 slider、dropdown、textarea、table、arc、bar、style、fs 等的写法为改动补充回归用例CI 在 push/PR 时自动执行测试为 X-TRACK 这类长期演进的开源硬件项目提供了持续的质量保障基线。小结LVGL 测试套件以main.py为入口串联起 Ruby 运行器生成、CMake 多配置矩阵构建、CTest 并行执行与 gcovr 覆盖率报告四条链路在测试编写侧以 Unity 断言 模拟输入设备鼠标/键盘/编码器 像素级截图比对为三大支柱。掌握 README 中的本地命令、目录规范与参考图生成条件再结合 main.py、CMakeLists.txt 与 test_cases 中的真实用例即可在 X-TRACK 项目中独立完成 LVGL 回归测试、测试用例扩展与 CI 质量保障工作。赞分享智能硬件嵌入式硬件开发【免费下载链接】X-TRACKA GPS bicycle speedometer that supports offline maps and track recording项目地址https://gitcode.com/gh_mirrors/xt/X-TRACK点击查看免费下载相关推荐RisingWave Iceberg E2E 测试指南本地运行、测试用例编写与 CI 集成RisingWave Iceberg E2E 测试指南本地运行、测试用例编写与 CI 集成 本文围绕 RisingWave 仓库中 e2e_test/iceb数据库流处理后端数据工程Earthly 集成测试指南在本地与 CI 中可复现地运行集成测试Earthly 集成测试指南在本地与 CI 中可复现地运行集成测试 单元测试只验证单一模块自身的行为天然没有外部依赖而集成测试需要验证服务与外部系统文件CI/CDDevOps构建工具TVM 测试指南Python 单元测试的 Target 参数化、本地运行与 CI 集成实战TVM 测试指南Python 单元测试的 Target 参数化、本地运行与 CI 集成实战 导读 本篇指南围绕 Apache TVMOpen Machine模型编译深度学习推理引擎上一篇Emscripten 音频移植指南OpenAL 1.1 实现、扩展支持与音频捕获实战下一篇pip 升级内置 distlib 至 0.4.3Console Script 生成、脚本安装与 vendoring 机制全解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考