SoloPi Solopi 性能自动化测试 + 持续集成方案

蔡伟琪 · 2019年09月05日 · 最后由 weidy 回复于 2019年11月21日 · 4295 次阅读

前言

由于 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>

贴上代码

app_process 开启 AccessibilityService

解决了广播后我们还需要能通过命令行启动 Soloπ的辅助功能服务,参考自动开启辅助功能的 “黑科技”

整个脚本执行的流程就是这样:

  1. 前期准备:获取设备、安装被测包等
  2. 开启远程调试接口 adb tcpip 5555
  3. 将打好的.dex push 到手机并执行,启动 AccessibilityService adb push SilentStartServices.dex /sdcard/ adb shell app_process -Djava.class.path=/sdcard/SilentStartServices.dex /sdcard SilentStartServices
  4. adb 发送广播 adb shell am broadcast -a lizhi.lizhifm.case.action.START_REPLAY -f 0x01000000

用例结果及性能数据上报

1、用例执行结果跟性能数据的上报是分开的,因此我们需要通过添加一个 caseID 将它们关联起来。

  • 我这边暂时是用例名、用例开始执行时间跟设备序列号拼起来取哈希作为 caseID

  1. OperationStepProvider准备阶段 prepare() 将当前用例的 caseID 存到 SharedPreferences

  2. PerformanceActionProvider执行到 ACTION_STOP_RECORD 结束性能录制时,去 SharedPreferences 读 caseID,若读取到有 caseID 则说明当前是在进行性能自动化测试,将 caseID 跟性能数据一起上报

  3. 所有用例执行结束后再将 caseID 清空

画了个比较挫的流程图

2、在 CaseReplayManager.OnFinishListener 上报用例报告

将用例执行结果跟设备信息等打包上传,我这边将截图转成 base64 也一起上传

后台解析报告

拿到上报的 json 报告后参考Soloπ的 CaseReplayResultActivity生成报告的四个 tab 页,还有性能数据用 EChart 生成图表

这里有两点需要注意

  1. 由于各操作步骤的 operationParam 参数都是加密的,入库前需要先进行 AES 解密,解密方法参考Soloπ的 AESUtils
  2. 因为某些国家的进口管制限制,Java 发布的运行环境包中的加解密有一定的限制。比如默认不允许 256 位密钥的 AES 加解密,解决方法就是修改策略文件参考

最后的效果大概是这样的

  • 首页

  • 用例步骤执行情况

  • 截图列表及大图预览

  • 最后是各项性能数据的报表

单独调用性能录制

此外还可以通过操作DisplayProvider单独实现性能录制的开关,可以用来录制跑 monkey 的性能数据

共收到 3 条回复 时间 点赞

感觉 app_process 开启 AccessibilityService 这块儿可以不用走推 dex 的方式,SoloPi 本身也可以执行多条命令

您好,可以更加详细的发下怎么去构建配置吗

可以有开源代码参考吗

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册