由于 Soloπ所有操作都在手机上完成,虽然录制确实方便,但是没法像传统自动化框架一样进行持续集成,为此我进行了一些改造
注册一个 BroadcastReceiver,接收到后进行用例导入及批量执行
Soloπ使用 GreenDao 保存用例信息,使用GreenDaoManager.getInstance().getRecordCaseInfoDao().queryBuilder().orderDesc(RecordCaseInfoDao.Properties.GmtCreate).list();
就能拿到当前保存的用例信息啦
拿到用例以后,执行用例前首先确保已执行adb tcpip 5555
开启设备远程 adb 调试端口
MyApplication.getInstance().updateAppAndName()
设置被测应用,应用名及包名从取出的用例RecordCaseInfo中获取
实例化一个用例 provider,Soloπ现在有三种 OperationStepProvider、RepeatStepProvider、BatchStepProvider,我们的应用场景需要批量执行用例,所以使用 BatchStepProvider。将上面获取到的用例集合放进 BatchStepProvider
Soloπ一些常用服务都实现了 ExportService 接口,然后在LauncherApplication统一注册并维护一个 map 记录注册的服务及对应的引用,使用LauncherApplication.getInstance().findServiceByName(类名)
就可以直接拿到对应的服务
拿到CaseReplayManager服务以后直接调用 start 方法进入 Replay 流程,这里可以自定义 OnFinishListener 实现一些上报操作
start 过后可以看到悬浮窗已经出来了,这个时候直接调 CaseReplayManager 的 startProcess() 方法就可以开始用例执行啦
注册 BroadcastReceiver 的时候需要设置 exported=true,后续才可以用 adb 调用
<receiver android:name=".service.CaseReplayReceiver"
android:exported="true">
<intent-filter>
<action android:name="lizhi.lizhifm.case.action.IMPORT_CASE"/>
<action android:name="lizhi.lizhifm.case.action.START_REPLAY"/>
</intent-filter>
</receiver>
贴上代码
解决了广播后我们还需要能通过命令行启动 Soloπ的辅助功能服务,参考自动开启辅助功能的 “黑科技”
整个脚本执行的流程就是这样:
adb tcpip 5555
adb push SilentStartServices.dex /sdcard/
adb shell app_process -Djava.class.path=/sdcard/SilentStartServices.dex /sdcard SilentStartServices
adb shell am broadcast -a lizhi.lizhifm.case.action.START_REPLAY -f 0x01000000
在OperationStepProvider准备阶段 prepare() 将当前用例的 caseID 存到 SharedPreferences
当PerformanceActionProvider执行到 ACTION_STOP_RECORD 结束性能录制时,去 SharedPreferences 读 caseID,若读取到有 caseID 则说明当前是在进行性能自动化测试,将 caseID 跟性能数据一起上报
所有用例执行结束后再将 caseID 清空
画了个比较挫的流程图
将用例执行结果跟设备信息等打包上传,我这边将截图转成 base64 也一起上传
拿到上报的 json 报告后参考Soloπ的 CaseReplayResultActivity生成报告的四个 tab 页,还有性能数据用 EChart 生成图表
这里有两点需要注意
最后的效果大概是这样的
此外还可以通过操作DisplayProvider单独实现性能录制的开关,可以用来录制跑 monkey 的性能数据