网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
黑盒测试中关键截图如何打点Android黑盒测试过程中如何进行有效的打点是我们经常遇到的问题,我们一般会在脚本内部进行数据打点,也可以使用其他进程录屏或截图。那我们如何选取合适的方式进行打点记录呢?下图是对常用打点方式的统计!对于测试开发人员来说有效的关键截图信息是最直观的数据,可以很快定位问题场景!本文重点介绍如何在Shell进程内统计屏幕截图变化。
第三方服务截图
本方案可以在uiautomator1.0脚本内实现,也可以自定义Shell进程服务来实现。个人推荐自定义Shell服务,然后用app_process命令启动。即使脚本出现异常退出了也不会影响截图服务,并且可以截取脚本启动前和结束后的状态。最主要的是Android R开始不再支持uiautomator1.0脚本。
主要通过Activity监听、定时器、进程监听服务触发截图操作:在页面变化时、进程状态变化时以及定时检测页面状态。除此之外我们需要一个App提供图片相似度的比较,或者搭建其他图片匹配服务也可以。
Activity变化和应用异常时截图
1.首先我们要注册ActivityController
①. 直接通过IActivityController.Stub()方法获取ActivityController对象;
②. 通过ActivityManager的setActivityController方法设置监听,设置成功后切换页面时就会回调对应的方法;
2.我们可以在ActivityController的回调中记录关键截屏信息,主要信息有:
**①. **新打开的Activity:点击按钮跳转页面时;
**②. **恢复显示的Activity:按返回键退回到上一级页面时显示的页面;
**③. **App产生崩溃的详细信息以及截图;
**④. **App产生ANR时的详细信息以及截图;
**⑤. **我们可以在activityStarting和activityResuming方法中对打开的页面进行控制。
3.缺点
**①. **如果其他进程也注册这个服务,那么会相互影响,只有最后注册的服务有效;
**②. **当在页面中切换Fragment时无法感知到事件变化;
**③. **必须在Shell进程内执行,普通App内是无法注册成功的;
IActivityController mActivityController = new IActivityController.Stub() {
//当调用Activity的onCreate方法(跳转新页面)时回调此方法,
//return false时不会启动Activity;return true时正常启动Activity
//不要在这个方法内做耗时操作
@Override
public boolean activityStarting(Intent intent, String pkg) throws RemoteException {
return true;
}
//当调用Activity的onResume方法(比如dialog消失)时会调用这个方法
@Override
public boolean activityResuming(String pkg) throws RemoteException {
return true;
}
/**
* 有应用在Java层产生异常时回调此方法
* 返回true时,会显示应用crash的弹窗,返回false时会立即kill应用
*/
@Override
public boolean appCrashed(String processName, int pid,
String shortMsg, String longMsg, long timeMillis,
String stackTrace) throws RemoteException {
return false;
}
/**
* 检测到ANR异常时就会回调此方法
*/
@Override
public int appEarlyNotResponding(String s, int i, String s1) throws RemoteException {
return 0;
}
/**
* 应用产生ANR时回调此方法,
* Return 0 时显示 "应用停止响应" 弹窗。
* Return 1 时不做任何操作,等待应用恢复正常;
* Return -1 时结束产生ANR的应用.
*/
@Override
public int appNotResponding(String processName, int pid,
String processStats) throws RemoteException {
return -1;
}
/**
* 系统停止响应时回调此方法,可以在这个方法里面对设备进行些恢复工作
*/
@Override
public int systemNotResponding(String msg) throws RemoteException {
return 0;
}
};
进程变化监听
由于ActivityController服务存在被干扰的情况,我们需要其他服务进行辅助判断,通过ActivityManager注册IProcessObserver可以获取进程变化的回调,特别是在onForegroundActivitiesChanged方法内可以判断是否触发页面切换。
通过IProcessObserver可以实现的功能:
**①. **在onForegroundActivitiesChanged方法内监听页面变化;
**②. **在onProcessStateChanged和onProcessDied方法内可以统计App的线程生命周期;
**③. **可以统计app运行期间创建的线程信息;
**④. **该服务被不同进程注册时,相互间互不影响;
缺点:
**①. **没有直观信息,需要使用uid进行关联,处理复杂;
IProcessObserver mProcessObserver = new IProcessObserver.Stub() {
//与用户交互的Activity发生变化时foregroundActivities为true,否则foregroundActivities为false
//uid产生该活动的应用标识,可以用包信息匹配到具体的应用
//pid 当前活动的线程/进城ID
@Override
public void onForegroundActivitiesChanged(int pid, int uid,
![img](https://img-blog.csdnimg.cn/img_convert/30351a27cdb12e1fae8fc3c794209be0.png)
![img](https://img-blog.csdnimg.cn/img_convert/9d9aeb6aef0badaaf513c6cec7a49e0c.png)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**