user_fluency_test_cases 使用文档

⭐ 性能强相关:通用流畅度测试用例文档

前言

💡 user_fluency_test_cases 是一套系统交互场景用例测试集框架,用来评估系统交互体系的整体用户感知流畅度。工具的形态为 Python 脚本,通过命令行的方式进行交互。

user_fluency_test_cases 基于 vison go 工具专属针对小米车机实现的一套系统交互场景用例测试集框架,在其分析能力上进行了定制化的改良提升,并增加了拖滑跟手检测能力,只能用于小米车机定制 ROM

📷 [图片: 流程图/架构示意图(diagram 块,源文档未提供可下载图像)]

环境准备

有三种选择,下面分别介绍下。

主机安装依赖

满足 vison go 的 运行环境,此外需要安装以下库。

pip install requests uiautomator2 PIL re perfetto
# 执行所有cases
./user_fluency_test_cases.py -tr -to

使用 docker

docker 容器集成了脚本程序运行所需要的所有环境配置和依赖,并且可以跨主机平台使用。

具体步骤如下:

 下载容器:    apollo自动化平台客户端
 启动容器:     apollo restart
 登录容器:     apollo login
 下载插件代码: apollo sde
 进入插件目录: cd apollo-sde/
 配置虚拟屏:   Xvfb :99 -screen 0 1024x768x24 & export DISPLAY=:99
 验证:        ./user_fluency_test_cases.py -h
 准备执行环境: ./user_fluency_test_cases.py -p
 执行所用任务: ./user_fluency_test_cases.py -tr -to

Apollo 自动化平台

  1. XCD 台架刷机定制 ROM,然后在 xcd 流水线所在主机上执行命令即可。
apollo trigger 40
  1. 远程触发模式

使用 user_test_fluency_client 脚本,命令如下:

# 指定测试cases
./user_test_fluency_client.py -c OpenAlertDialog,CloseAlertDialog
 
# 全case测试
./user_test_fluency_client.py
 
# 指定每个case的测试次数
./user_test_fluency_client.py -t 2

使用

📷 [图片: 工具使用流程图(diagram 块,源文档未提供可下载图像)]

工具集提供了轻量级的框架能力方便快速扩展 case,基本命令如下:

$ ./user_fluency_test_cases.py -h
usage: user_fluency_test_cases.py [-h] [-t TIMES] [-c CASES] [-l] [-n] [-tr] [-to] [-p] [-nb]
 
User fluency test cases.
 
options:
  -h, --help            show this help message and exit
  -t TIMES, --times TIMES
                        Define the number of times a test case is executed, default: 1.
  -c CASES, --cases CASES
                        Indicate the test cases to be executed. use '-c foo, bar,OpenSettingsOnDock' to test this three cases, use '-c config' to test cases in user_fluency_cases.yaml file" each line of the yaml represents a task
                        name, use '#' to removing tasks you don't want to perform, for example: # OpenSettingsOnDock # CloseSettingsOnDock OpenMapOnDock, default all cases
  -l, --list            list all test cases
  -n, --no-report       do not show report
  -tr, --trace          record perfetto trace
  -to, --touch          show `adb swipe` touch graph
  -p, --prepare         prepare environment before running test cases
  -nb, --not-browser    prepare environment before running test cases

GUI 操作:

./user_fluency_test_cases.py --gui

单测试用例场景

步骤:

  1. 配置环境:点击”一键配置”,此配置需要在每次重启机器或点击恢复配置后执行,当测试完成后,可以选择点击”恢复配置”将车机页面恢复
  2. 选择测试实例:实例中均为具有代表性的实例
  3. 测试次数选择:目前支持最大 5 次连续执行
  4. 选择分析方式:支持上传分析产物和不上传分析产物两种方式
  5. 开始测试:点击”开始测试”,页面会等待测试完成后在测试报告处给出上传 url,若选择了本地分析,则需要去视频对应目录下查询产物

批量测试用例场景

步骤:

  1. 配置环境:点击”一键配置”,此配置需要在每次重启机器或点击恢复配置后执行,当测试完成后,可以选择点击”恢复配置”将车机页面恢复
  2. 选择配置文件:配置文件可选择自己写的,但是需要遵循格式:
OpenSettingsOnDock
# CloseSettingsOnDock
OpenMapOnDock

其中每一行是一个测试用例的名称,用 # 表示注释掉该用例,不会在后续测试该用例

  1. 测试次数选择:目前支持最大 5 次连续执行
  2. 选择分析方式:支持上传分析产物和不上传分析产物两种方式
  3. 开始测试:点击”开始测试”,页面会等待测试完成后在测试报告处给出上传 url,若选择了本地分析,则需要去视频对应目录下查询产物

自定义用例测试

步骤:

  1. 配置环境:点击”一键配置”,此配置需要在每次重启机器或点击恢复配置后执行,当测试完成后,可以选择点击”恢复配置”将车机页面恢复
  2. 选择测试用例文件:测试用例文件中包含了自定义 case,需要注意:case 需继承 user_fluency_test_cases 中的 BaseTask 方法,如:
from user_fluency_test_cases import BaseTask
 
class MyCustomTask(BaseTask):
    def run(self):
        self.start_record()
        self.wait(1)
        # xxxxxx自定义操作xxxxxx
        self.stop_record()
        self.run_analyse_by_model("xxxx")

详细可参考 4.2 节 Case 扩展方式

自定义用例测试中会自动识别当前选择的文件中所有继承 BaseTask 的类,并执行其中的自定义操作

  1. 测试次数选择:目前支持最大 5 次连续执行
  2. 选择分析方式:支持上传分析产物和不上传分析产物两种方式
  3. 开始测试:点击”开始测试”,页面会等待测试完成后在测试报告处给出上传 url,若选择了本地分析,则需要去视频对应目录下查询产物

产物分析

相比较 vison go 工具,user_fluency_test_cases 脚本程序配合系统源码定制,进一步升级了能力,主要是增加了拖滑跟手性的检测能力以及提升了 trace 帧定位的分析能力。

拖滑跟手性检测

如果一个视图元素拖动跟手,可以等价描述为,在相同的时间单位下,手指移动多少像素,视图元素就位移多少像素。

💡 如何判断跟手性

  1. 速度是否一致:帧间距曲线与 touch 曲线 y 轴如果基本重合则跟手,反之不跟手
  2. 毛刺抖动是否一致:帧间距曲线上有毛刺,但是 x 轴方向的 touch 曲线也有,则属于正常,反之不跟手。

举例 dock 图标拖拽滑动跟手性检测。

🎬 [视频: dock 图标拖拽滑动跟手性检测演示 (mp4)](token: XnKPb7CZsofzsVxLZLSc4vo2nrh,源空间 403 不可下载)

场景设计与操作

场景为命令编写的自动化 case,主要操作为先按住拖滑图标,然后放手,代码如下:

class SlideDockIcon(BaseTask):
    """
    Slide dock icon
    """
 
    def run(self):
        # 1.Operations and recording
        adb_install_vision_go_demo()
 
        # Open app drawer
        adb_click(1525, 1719)
        self.wait(1)
 
        # Swipe right to ensure demo icon visible
        adb_swipe(2132, 1498, 2000, 1498, 100)
        self.wait(1)
 
        # Move dock icon settings to app drawer for empty place
        adb_drag_and_drop(867, 1711, 867, 1236, 1000)
        self.wait(1.5)
 
        # Move dock icon colordemo to dock
        position = adb_find_position_by_text("ColorDemo")
        if position:
            x, y = position
            y -= 150
            adb_drag_and_drop(x, y, 862, 1715, 1000)
            self.wait(1.5)
        else:
            raise Exception("Failed to find position of ColorDemo")
 
        adb_logcat_clear()
        self.start_record()
        self.wait(1)
        # Move dock icon settings to app drawer for empty place
        adb_drag_and_drop(867, 1711, 867, 1236, 1000)
        self.wait(1.5)
        self.stop_record()
 
        # 2.Analyze the video
        self.run_analyse_by_model("color-motion-transition_y")
        self.record_touches()
 
        # Move back dock icon settings to dock
        position = adb_find_position_by_text("设置")
        if position:
            x, y = position
            y -= 150
            adb_drag_and_drop(x, y, 862, 1715, 1000)

结果分析

拖滑速度与帧间距速度一致,且”毛刺”变化规律基本一致,较为跟手。

Trace 帧定位

当出现丢帧或者异常帧时,主要通过 trace 来分析原因,该功能主要提升问题帧的分析效率,提供快速定位出问题帧在 trace 中的位置

举例 AppDrawer 打开。

🎬 [视频: AppDrawer 打开 trace 帧定位演示 (mp4)](token: KXr3btkdWoIhsUxA0sicACWhnpf,源空间 403 不可下载)

场景设计与操作

点击 docker 上的图标,打开 appdrawer。

结果分析

50ms 附近丢了一帧,其他地方较为平滑,通过 trace 帧对齐功能查找该帧在 trace 中的位置。

帧间距为 0 的帧所对应的时间戳为 27700259,在 trace 中搜索该时间戳对应的 submit buffer 时间,顺藤摸瓜逐步定位到应用层丢帧位置。

Case 扩展方式

对于一个测试集框架来说,最常用的能力是如何简单快速的增加 case。user_fluency_test_cases 具备非常简单灵活的 case 扩展方式。

步骤

  1. 场景设计
    1. 确定要测试的动效场景
    2. 选择合适的模型
    3. 设计场景
  2. 编码
    1. 继承 BaseTask,复写 run 方法
    2. 模拟点击动效场景
    3. 录制该动效场景
    4. 选择合适的模型进行分析
    5. 注册任务

示例

  1. 场景:dock 打开设置,测量页面打开这段动效

🎬 [视频: dock 打开设置动效示例 (mp4)](token: WzEGbe6Zeo1q6pxI4uzcHgI6nge,源空间 403 不可下载)

  1. 编码
class OpenSettingsOnDock(BaseTask):
    """
    Open settings on dock
    """
 
    def run(self):
        # 1.Operations and recording
 
        # navigate to home
        adb_click(143, 1719)
        self.wait(2)
 
        # start recording
        self.start_record()
        self.wait(1)
        # tap settings app icon
        adb_click(923, 1715)
        self.wait(1)
        # stop recording
        self.stop_record()
 
        # 2.Analyze the video
        self.run_analyse_by_model("motion")
 
        ...
 
def task_registry(task_manager):
    """
    Registers tasks with the task manager.
 
    :param task_manager: The task manager instance to register tasks with.
    :return: None
    """
    ...
    task_manager.register_task(OpenSettingsOnDock())
    ...
  1. 飞书报告输出:测试完成后会输出到关联的飞书表格 report(sheet-id: 2yGyJ2,doc-id: shtk4WzHvc1TiM7n5pFbvy3SQYZ

📥 抓取自飞书 wiki 空间 7541192071952990209,obj_token: TH3adaHq7oPvouxykq5cgZhsnWq 🔗 性能强相关:通用流畅度分析见 blog/performance/rendering/;本系列总览见 用户感知流畅度评估体系