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 -toApollo 自动化平台
- XCD 台架刷机定制 ROM,然后在 xcd 流水线所在主机上执行命令即可。
apollo trigger 40- 远程触发模式
使用 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 casesGUI 操作:
./user_fluency_test_cases.py --gui单测试用例场景

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

步骤:
- 配置环境:点击”一键配置”,此配置需要在每次重启机器或点击恢复配置后执行,当测试完成后,可以选择点击”恢复配置”将车机页面恢复
- 选择配置文件:配置文件可选择自己写的,但是需要遵循格式:
OpenSettingsOnDock
# CloseSettingsOnDock
OpenMapOnDock其中每一行是一个测试用例的名称,用 # 表示注释掉该用例,不会在后续测试该用例
- 测试次数选择:目前支持最大 5 次连续执行
- 选择分析方式:支持上传分析产物和不上传分析产物两种方式
- 开始测试:点击”开始测试”,页面会等待测试完成后在测试报告处给出上传 url,若选择了本地分析,则需要去视频对应目录下查询产物
自定义用例测试

步骤:
- 配置环境:点击”一键配置”,此配置需要在每次重启机器或点击恢复配置后执行,当测试完成后,可以选择点击”恢复配置”将车机页面恢复
- 选择测试用例文件:测试用例文件中包含了自定义 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 的类,并执行其中的自定义操作
- 测试次数选择:目前支持最大 5 次连续执行
- 选择分析方式:支持上传分析产物和不上传分析产物两种方式
- 开始测试:点击”开始测试”,页面会等待测试完成后在测试报告处给出上传 url,若选择了本地分析,则需要去视频对应目录下查询产物
产物分析

相比较 vison go 工具,user_fluency_test_cases 脚本程序配合系统源码定制,进一步升级了能力,主要是增加了拖滑跟手性的检测能力以及提升了 trace 帧定位的分析能力。
拖滑跟手性检测
如果一个视图元素拖动跟手,可以等价描述为,在相同的时间单位下,手指移动多少像素,视图元素就位移多少像素。
💡 如何判断跟手性
- 速度是否一致:帧间距曲线与 touch 曲线 y 轴如果基本重合则跟手,反之不跟手
- 毛刺抖动是否一致:帧间距曲线上有毛刺,但是 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 扩展方式。
步骤
- 场景设计
- 确定要测试的动效场景
- 选择合适的模型
- 设计场景
- 编码
- 继承
BaseTask,复写run方法 - 模拟点击动效场景
- 录制该动效场景
- 选择合适的模型进行分析
- 注册任务
- 继承
示例
- 场景:dock 打开设置,测量页面打开这段动效
🎬 [视频: dock 打开设置动效示例 (mp4)](token:
WzEGbe6Zeo1q6pxI4uzcHgI6nge,源空间 403 不可下载)
- 编码
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())
...- 飞书报告输出:测试完成后会输出到关联的飞书表格 report(sheet-id:
2yGyJ2,doc-id:shtk4WzHvc1TiM7n5pFbvy3SQYZ)
📥 抓取自飞书 wiki 空间 7541192071952990209,obj_token: TH3adaHq7oPvouxykq5cgZhsnWq 🔗 性能强相关:通用流畅度分析见 blog/performance/rendering/;本系列总览见 用户感知流畅度评估体系