在进行Android自动化测试时,我们常常需要通过adb
工具向设备内推送文件,例如推送视频文件到相册目录。但是系统的媒体扫描机制并不能实时识别新增文件,导致我们的测试无法观察到文件变化。
为了优化效率,简化自动化测试的流程,本文将介绍如何使用adb强制触发媒体扫描的方法,实现文件变化的实时观察。
Android
系统中有一个媒体扫描服务MediaScannerService
,它会定期扫描设备存储空间的媒体文件,提取文件信息生成媒体数据库。各类媒体应用如相册、音乐播放器都依赖这个数据库展示文件。当通过adb等方式新增文件时,由于扫描不实时,需要等待下次系统自动扫描或者手动刷新,才能在应用中展现新文件。这为我们的自动化测试带来不便。
Android系统提供了多种方式强制触发媒体扫描,通过adb
命令可以方便使用。
adb shell
使用media scanner
命令在adb shell内可以直接执行media scanner
命令,扫描指定文件或目录:
//扫描单个文件
media scanner file /sdcard/DCIM/camera/test.jpg
//扫描整个目录
media scanner file /sdcard/DCIM/camera/
这种方法仅扫描指定文件或目录,适合我们已知文件的位置。
am broadcast
命令发送扫描广播我们也可以通过am(Activity Manager)
向系统发送扫描广播,触发媒体扫描服务。
常用的扫描目录广播命令:
adb shell am broadcast -a android.intent.action.MEDIA_MOUNTED -d file:///sdcard/
针对单个文件扫描的命令:
adb shell am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d file:///sdcard/DCIM/camera/test.jpg
上面命令中的每个参数含义如下:
adb shell //进入adb shell环境
am //调用Activity Manager
broadcast //发送广播
-a //指定action,扫描媒体文件
-d //指定扫描目录
结合
broadcast
和参数,我们可以发送各类系统广播给Activity Manager
。
知道上述原理后,在我们「批量视频发布自动化的脚本」中加入这些命令,例如:
//推送文件
adb.push(filename, '/sdcard/DCIM/Camera')
sleep(1)
//发送扫描广播
shell('am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d file:///sdcard/DCIM/Camera/')
//打开相册选取最新的视频进行发布操作
...
...
...
这就可以在文件推送后立即执行扫描,误差控制在1秒以内,相当于实时扫描文件变化。
另外,定时执行上述扫描命令也可以用来监控目标目录文件变化,发现新文件后执行相应逻辑。
应用这种强制扫描技巧,可以明显优化我们的自动化测试脚本:
在执行强制媒体扫描时,也需要注意一些问题:
熟练运用adb shell
的媒体扫描命令可以显著提升我们Android
自动化测试的效率,特别是在需要频繁查看文件变化的场景中。文件变化是自动化测试一个关键的观察点。
当然,过度扫描会有性能影响,仍需针对实际需求酌情使用。但适当应用扫描命令带来的好处是显著的。
作为自动化测试人员,掌握这些技巧可以帮助我们编写出更智能、可靠的自动化测试脚本。培养运用adb shell
的习惯也使我们更好地理解Android系统,成为出色的自动化测试工程师。