首先说下我从事的测试是安卓 TV,盒子,路由等安卓产品相关的自动化及性能测试工作。主要部分是独立负责性能测试部分,脚本及临时需求也是需要 support。主要是 shell 脚本相关更多。在有权限的情况下,我更喜欢 shell 的直接,组织好逻辑是关键。开此贴主要是应群里建议,讨论下目前我正在尝试的获取性能数据方案。
一、自动化性能测试脚本开发,快速区分负责部门
1、性能测试自动化脚本方案确立,目前尝试阶段,尝试中方案如下(多方案组合完成需求):
(1)通过 SurfaceFlinger 句柄变化跟踪显示状态变化收集时间变化
局限性:由于句柄与显示界面不完全是一一对应关系,未操作仍存在句柄变化的场景无法测试
注意点:脚本逻辑包含的判断等操作本身的性能影响精度,需要组织适合的逻辑匹配更加精确的精度需求
优势:可以体现显示性能
(2)通过 log 打印的按键 up/down 时间戳及 uiautomator events 打印的 TYPE_VIEW_FOCUSED 时间戳计算操作变化响应时间
局限性:只适用集成 uiautomator 并且有 focused 属性改变的场景,例如光标移动;忽略显示性能处理时间。
注意点:需要有相关 log 打印,否则无法获取按键响应的 log;uiautomator 是单进程执行并且重定向面临输出 buffer 大小问题需要 kill 进程才会输出。
优势:可以根据时间戳准确获取代码执行的时间
(3)根据研发人员配合添加的 log 字段,通过 log 获取代码执行时间
局限性:配合 log 打印获取有版本局限性,服务于研发自身分析定位
注意点:log 打印本身也存在 10ms 左右的输出时间
优势:准确获取代码逻辑执行时间与总时间的占比,便于定位问题。
2、划分标准:按照脚本测试时间/用例录像测试时间比例划分主要优化的研发部门。
我们这边快速区分 BSP 和 UI 占比可以更有效的对应优化的研发人员。
二、主要介绍下 SurfaceFlinger 句柄变化的方案,log 方案不多做介绍
1、获取数据的部分:dumpsys SurfaceFlinger|grep '|....|'
主要是 handle 和 name 两部分数据判定界面变化,通过 grep 和 awk 组合使用很容易判定界面变化
2、由于 date 命令获取时间是秒级,获取精度更高的时间戳计算时间。
查找多个位置的时间相关数据,最终在/proc/timer_list 中找到 now at 430222772615795 nsecs
cat /proc/timer_list|busybox awk 'NR==3{printf("%.0f\n",$3/1000000)}' 即可取到毫秒时间
3、组织逻辑循环获取数据判定句柄变化,每次发生变化则 echo 时间戳,之后计算时间戳的差值。
这里主要介绍思路,脚本代码就不展示了,我是基于 shell 完成的相关逻辑。