LVGL Pro使用指南[16] LVGL XML 测试
LVGL Pro Editor 提供了一个强大的 XML 测试模块,用于定义功能性的 UI 测试。测试 XML 文件使用<test>标签描述,由两部分组成:
- UI 定义(UI Definition):使用
<styles>、<consts>和<view>定义要测试的 UI ,与<component>的结构完全相同。 - 测试步骤(Test Steps):封装在
<steps>标签中,用于定义测试的操作和断言(assertions)。
测试步骤类型 链接到标题
目前支持的测试步骤类型如下:
<move_to x="10" y="30"/>:将鼠标移动到指定屏幕坐标。<click_at x="10" y="30"/>:在指定屏幕坐标模拟点击。<press/>:在当前坐标按下。<release/>:在当前坐标释放。<wait ms="100"/>:等待毫秒。但 LVGL 会继续运行,包括动画和定时器。<freeze ms="100"/>:暂停 UI 及 LVGL 的内部时间,用于视觉调试。<subject_set subject="subject1" value="5"/>:设置整数或字符串类型 subject 的值。<subject_compare subject="subject1" value="10"/>:将整数或字符串类型 subject 的值与参考值进行比较。<screenshot_compare path="path/to/image.png"/>:将当前屏幕与参考图片比较。如果图片不存在,则会创建。如果比较失败,会保存一个带_err后缀的图片以便检查。
下面是 LVGL Editor 官方的示例:https://github.com/lvgl/lvgl_editor/tree/master/examples
测试相关的目录树如下:

test.xml 的测试代码如下:
<test>
<view extends="elements">
</view>
<steps>
<subject_set subject="dark_theme" value="0"/>
<subject_set subject="thermostat_temp" value="20"/>
<subject_set subject="room_temp" value="22"/>
<screenshot_compare path="start.png" />
<move_to x="10" y="300"/>
<press />
<wait ms="100" />
<move_to x="10" y="200"/>
<wait ms="100" />
<release />
<wait ms="500" />
<screenshot_compare path="show_move_goal.png" />
</steps>
</test>
view extends="elements"表示测试的是 elements.xml 这个screen,测试步骤如下:
- 先设置 dark_theme 为 0,thermostat_temp 为 20,room_temp 为 22
- 截图比较 start.png 是否与当前屏幕一致
- 移动鼠标到 (10, 300),按下,等待 100ms,移动到 (10, 200),等待 100ms,释放,等待 500ms
- 截图比较 show_move_goal.png 是否与当前屏幕一致
在右侧可以看到测试的界面:

当点击右边红色三角形按钮后就会自动执行上面的测试步骤,测试结果如下:

C 代码中运行测试 链接到标题
C 代码中可以在运行时加载 test.xml,然后执行其中的测试步骤。这为 LVGL 应用的测试提供了很大的便利。
注册测试 链接到标题
测试通过两种方式注册:
- 从文件注册:
lv_xml_test_register_from_file("path/to/test.xml", "A:ref_images") - 从字符串注册:
lv_xml_test_register_from_data(xml_data, "A:ref_images")
第一个参数指定测试 XML 文件的路径或字符串数据,第二个参数指定用于比较图片的目录路径。
注销测试使用:lv_xml_test_unregister()。由于在注册新测试时会自动注销上一次测试,因此该 API 通常无需手动调用。
执行测试 链接到标题
自动执行 链接到标题
使用:lv_xml_test_run_all(slowdown)执行已注册的测试,会清空当前screen并创建一个新的view实例进行测试。
slowdown参数用于控制测试速度:
0:最大速度1:实时速度2:半速10:慢 10 倍,其它数字以此类推
lv_xml_test_run_all()是阻塞执行,所有步骤完成后才会返回。返回值是失败测试的数量。
逐条执行 链接到标题
逐条执行每个测试步骤方法如下:
- 调用
lv_xml_test_run_init()准备执行测试,它会清空屏幕并创建一个新的view实例。 - 使用
lv_xml_test_get_step_count()获取测试步骤总数。 - 多次调用
lv_xml_test_run_next(slowdown)执行每一步。true表示当前步骤通过,返回false表示失败。 - 最后调用
lv_xml_test_run_stop()清理并退出测试。
获取测试结果 链接到标题
目前,只有screenshot_compare步骤可能失败。可以参考下面代码查询每个步骤的执行结果:
// 获取步骤总数
uint32_t step_cnt = lv_xml_test_get_step_count();
for(uint32_t i = 0; i < step_cnt; i++) {
// 判断步骤类型
if(lv_xml_test_get_step_type(i) == LV_XML_TEST_STEP_TYPE_SCREENSHOT_COMPARE) {
// 是图片比较的获取步骤状态
if(lv_xml_test_get_status(i)) // 返回true表示通过
printf("Step %d passed\n", i);
else // 返回false表示失败
printf("Step %d failed\n", i);
} else {
// 不是图片比较的步骤单独处理
printf("Step %d is not a screenshot comparison\n", i);
}
}