辅助程序实现黑盒自动化测试的特点
辅助功能相较于测试框架在部分场景下有一定的优势,可以做更多场景的测试:
1. 运行辅助程序过程中可以执行Uiautomator1.0或Uiautomator2.0测试用例,执行测试用例过程中辅助程序会被中断,当测试用例执行结束后辅助程序会恢复运行;
2. 大部分机型重启设备,服务会自动运行,可以测试部分app开机自启功能等功能;
3. 由于是App方案,所以可以直接读取手机短信,设备插上手机卡后,可以在逻辑数据层拦截短信验证码,实现程序的验证码登陆;
4.辅助程序有较高的优先级,程序保活能力非常强;
由于测试方式是基于Accessibility服务的app,所以也有很多限制:
1. 和被测应用不在同一进程内,相较于Uiautomator2.0只能做黑盒测试;
2. 由于是App实现方案,所以在各系统上存在权限问题,不能像Uiautomator1.0一样获取系统运行信息(最近运行的应用、当前显示的activity)
3. 执行点击动作需要使用AccessibilityNodeInfo#performAction方法,但是此方法只能在clickable=true时生效;
4. 无法直接操作屏幕,需要借助AccessibilityService的手势功能实现滑动屏幕、点击屏幕等动作;
5. 由于系统限制,高版本系统中启动其他App失败;
6. 发送键盘事件受限制,只能发送Home、back、打开通知、打开快捷设置、打开电源弹窗等有限功能;
7. 辅助程序异常退出时会关闭辅助程序配置,需要在设置页面手动配置;
辅助程序服务配置与黑盒自动化测试实现
自定义AccessibilityService服务,在服务内重载系统方法,
初始化测试服务:重载onServiceConnected方法
当服务激活时调用此方法,在这里进行服务的初始化工作,主要配置onAccessibilityEvent方法感知的事件类型和服务配置。
1、获取AccessibilityServiceInfo 对象:
getServiceInfo()方法获取当前使用的AccessibilityServiceInfo对象,如果方法返回null,直接通过AccessibilityServiceInfo()构造方法创建。 AccessibilityServiceInfo accessibilityServiceInfo = getServiceInfo();
if (accessibilityServiceInfo == null) {
accessibilityServiceInfo = new AccessibilityServiceInfo();
setServiceInfo(accessibilityServiceInfo);
}
2、设置AccessibilityServiceInfo#eventTypes标记过滤AccessibilityEvent事件类型:
直接通过或运算符(|)添加标记,下面代码配置过滤控件点击、控件选择、控件获取焦点和文本变化事件,发生配置的事件时会调用onAccessibilityEvent方法。