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

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 是否与当前屏幕一致

在右侧可以看到测试的界面:

start

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

end

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);
    }
}

参考 链接到标题

https://docs.lvgl.io/master/xml/features/tests.html