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官方的example: 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