背景

启动耗时作为 App 一项核心性能指标,腾讯地图现在是基本上每个版本都会进行数据的收集。纵向的对比(与自己)之前我们都依赖于开发埋点,横向的对比(与竞品)就是人工拿高清摄像头录制采集,然后用分帧工具进行分帧后统计,我们一直在想启动耗时如果可以自动化测试就可以释放人力了。

这期间也同其他项目组的测试同学讨教过图像识别方法,对比如下:

1 启动耗时采集

整体思路如下:

录制视频的过程这里先省略——可以自动化,后续接下来再进一步研究,本次实验采用的是录屏大师采集的,后面建议使用系统接口:MediaProjection 和 MediaProjectionManager 进行实时的屏幕采集(Android 5.0 以上系统支持)。

2 机器学习

总是在听说机器学习,一直觉得好高大上的名词,在测试工作中还是第一次用到,瞬间觉得 level 提升一个档次,嘿嘿,小白入门请勿喷 o(╯□╰) o。

Scikit-learn(简称 sklearn)是目前最受欢迎,也是功能最强大的一个用于机器学习的 Python 库(也是在组里同学的一次分享中了解到的)。它广泛地支持各种分类、聚类以及回归分析方法比如支持向量机、随机森林、DBSCAN 等等,具有其强大的功能、优异的拓展性以及易用性,目前受到了很多数据科学从业者的欢迎,相关算法就不会具体去讨论了,这次实践主要以实战为目的!

这是一个初级的图像内容学习实践,是有监督学习的一个代表,其本质是通过分析已知分类图片的构成信息来对未知分类图片进行分类。

2.1 图像处理

选用的 Python 图像处理库 PIL 的 Image 模块,通过 Image.open() 函数打开制定的图像文件,而真实的图像数据直到试图处理该数据才会从文件读取文件,对象必须实现 read()、seek() 和 tell() 方法,并且是以二进制模式打开。

我们看下输入结果:

使用 flatten() 将多维图像转成单行矩阵,将数据扁平化 [height, width, channel] —>[byte]。

2.2 训练模型

拿到图像数据后我们要开始正式训练模型了,这里就要引入机型学习的算法了——LinearSVC,从名字就可以看出,它是线性分类,也就是不支持各种低维到高维的核函数,仅仅支持线性核函数,对线性不可分的数据不能使用。

我们再看下 fit() 方法:fit(self, X, y, sample_weight=None) 它是用于训练 SVM,具体参数已经在定义 SVC 对象的时候给出了,这时候只需要给出数据集 X 和 X 对应的标签 y 。

在机器学习过程中,一般用来训练模型的过程比较长,所以我们一般会通过 joblib.dump() 的方法将训练的模型进行保存(持久化),然后进行评估,预测等等,这样便可以节省大量的时间。

2.3 通过模型进行学习预测

2.4 输出学习结果

3 实际运用

我录制了 11 组启动视频,一组用来当做训练集,剩下的十组用来作为测试数据。

在训练集里,将启动过程拆分为以下五个阶段,将每个阶段的起终页做了一下对比:

3.1 desk:桌面

3.2 splash:闪屏页

3.3 loading:加载内容

3.4 stable:稳定页

这个阶段的图像就是一张图就可以展示了。

3.5 end:关闭录屏软件

其中,stable 和 end 阶段不计入启动耗时的采集数据,我仅仅列出来给大家看下展示效果。

这里会有个疑问 stable 的状态界定,我取的是—连续对比前后两张图有差别,直到连续两张图在肉眼查看下没有明显区别为止,如下图所示:

运行结果如下:

十组实验部分测试数据:

PS:自动识别率 = 机器学习识别总帧数/人工识别总帧数 *100(这个应该建立在学习模型足够精准的基础上,自动识别率应该会越高)。

最后,如何计算启动耗时呢?

我们是通过这个命令:
ffmpeg -i TX.mp4 -r 60 %d.jpeg
可以将视频以固定 60 帧截取的图片,所以总耗时 = 总帧数 * 1/60。

希望能够给到大家一些思路,将实际的测试工作中引入一些机器学习的方法。

关注腾讯移动品质中心 TMQ,获取更多测试干货!


↙↙↙阅读原文可查看相关链接,并与作者交流