找回密码
 会员注册
查看: 22|回复: 0

黑盒测试中-关键截图-的打点方案

[复制链接]

22

主题

0

回帖

67

积分

注册会员

积分
67
发表于 2024-10-12 10:19:16 | 显示全部楼层 |阅读模式
点击上方蓝字关注我们!导读Android黑盒测试过程中如何进行有效的打点是我们经常遇到的问题,我们一般会在脚本内部进行数据打点,也可以使用其他进程录屏或截图。那我们如何选取合适的方式进行打点记录呢?下图是对常用打点方式的统计!对于测试开发人员来说有效的关键截图信息是最直观的数据,可以很快定位问题场景!本文重点介绍如何在Shell进程内统计屏幕截图变化。第三方服务截图本方案可以在uiautomator1.0脚本内实现,也可以自定义Shell进程服务来实现。个人推荐自定义Shell服务,然后用app_process命令启动。即使脚本出现异常退出了也不会影响截图服务,并且可以截取脚本启动前和结束后的状态。最主要的是Android R开始不再支持uiautomator1.0脚本。主要通过Activity监听、定时器、进程监听服务触发截图操作:在页面变化时、进程状态变化时以及定时检测页面状态。除此之外我们需要一个App提供图片相似度的比较,或者搭建其他图片匹配服务也可以。Activity变化和应用异常时截图通过ActivityController监听可以在Activity变化时获取对应的事件。但是进程A先初始化了Activity监听服务,我们再启动进程B初始化Activity监听,那么A进程的监听服务就被中断了,并且不会有任何提示信息。下面我们先介绍ActivityController监听Activity的方案:1.首先我们要注册ActivityController①. 直接通过IActivityController.Stub()方法获取ActivityController对象;②. 通过ActivityManager的setActivityController方法设置监听,设置成功后切换页面时就会回调对应的方法;2.我们可以在ActivityController的回调中记录关键截屏信息,主要信息有:①. 新打开的Activity:点击按钮跳转页面时;②. 恢复显示的Activity:按返回键退回到上一级页面时显示的页面;③. App产生崩溃的详细信息以及截图;④. App产生ANR时的详细信息以及截图;⑤. 我们可以在activityStarting和activityResuming方法中对打开的页面进行控制。3.缺点①. 如果其他进程也注册这个服务,那么会相互影响,只有最后注册的服务有效;②. 当在页面中切换Fragment时无法感知到事件变化;③. 必须在Shell进程内执行,普通App内是无法注册成功的;IActivityController相关方法解释:IActivityControllermActivityController=newIActivityController.Stub(){//当调用Activity的onCreate方法(跳转新页面)时回调此方法,//return false时不会启动Activity;return true时正常启动Activity//不要在这个方法内做耗时操作@OverridepublicbooleanactivityStarting(Intentintent,Stringpkg)throwsRemoteException{returntrue;}//当调用Activity的onResume方法(比如dialog消失)时会调用这个方法@OverridepublicbooleanactivityResuming(Stringpkg)throwsRemoteException{returntrue;}/***有应用在Java层产生异常时回调此方法*返回true时,会显示应用crash的弹窗,返回false时会立即kill应用*/@OverridepublicbooleanappCrashed(StringprocessName,intpid,StringshortMsg,StringlongMsg,longtimeMillis,StringstackTrace)throwsRemoteException{returnfalse;}/***检测到ANR异常时就会回调此方法*/@OverridepublicintappEarlyNotResponding(Strings,inti,Strings1)throwsRemoteException{return0;}/***应用产生ANR时回调此方法,* Return 0时显示"应用停止响应"弹窗。* Return 1 时不做任何操作,等待应用恢复正常;*Return-1时结束产生ANR的应用.*/@OverridepublicintappNotResponding(StringprocessName,intpid,StringprocessStats)throwsRemoteException{return-1;}/***系统停止响应时回调此方法,可以在这个方法里面对设备进行些恢复工作*/@OverridepublicintsystemNotResponding(Stringmsg)throwsRemoteException{return0;}};进程变化监听由于ActivityController服务存在被干扰的情况,我们需要其他服务进行辅助判断,通过ActivityManager注册IProcessObserver可以获取进程变化的回调,特别是在onForegroundActivitiesChanged方法内可以判断是否触发页面切换。通过IProcessObserver可以实现的功能:①. 在onForegroundActivitiesChanged方法内监听页面变化;②. 在onProcessStateChanged和onProcessDied方法内可以统计App的线程生命周期;③. 可以统计app运行期间创建的线程信息;④. 该服务被不同进程注册时,相互间互不影响;缺点:①. 没有直观信息,需要使用uid进行关联,处理复杂;②.只有进程变化的简要信息,需要进一步加工才能获取我们想要的信息IProcessObservermProcessObserver=newIProcessObserver.Stub(){//与用户交互的Activity发生变化时foregroundActivities为true,否则foregroundActivities为false//uid产生该活动的应用标识,可以用包信息匹配到具体的应用//pid当前活动的线程/进城ID@OverridepublicvoidonForegroundActivitiesChanged(intpid,intuid,booleanforegroundActivities)throwsRemoteException{if(foregroundActivities){//}}//活动状态发生变化时调用,在此方案内实际意义不大@OverridepublicvoidonProcessStateChanged(intpid,intuid,intimportance)throwsRemoteException{}//结束时调用@OverridepublicvoidonProcessDied(intpid,intuid)throwsRemoteException{}};综合应用上面两种方案各有优劣,我们可以将他们整合在一个流程内实现较为完善的截图机制:①. 首先我们的服务主要依赖于ActivityController进行页面变化的感知,以便于获取详细的信息和精确控制;②. 我们注册IProcessObserver进行辅助验证,当页面发生变化时我们进行截屏,并通过ActivityController最后一次接收事件的时间判断其服务状态,如果服务状态异常,那么我们重新注册ActivityController服务;③. 开始监控页面时我们初始化一个定时器,可以定时(2S)截取屏幕,将当前截图Bitmap与上一次的截图Bitmap做图像匹配,如果图片相似度小于0.8,那么可以认定页面发生了变化,如果5S内没有保存过页面信息,那么需要重新初始化ActivityController服务。Root设备的特殊方案Android系统是基于Linux系统的移动操作系统。它们可以通过getevent命令输出键盘和屏幕事件,包括响应事件的坐标区域和键盘key值。但是Android系统基于安全考虑,大部分真机系统是没有权限执行getevent命令的,它不会输出任何有效信息,但是华为手机(荣耀20 i)上却可以正常使用。这是一个非常危险的权限,大家自己的手机还是不要开启开发者模式了!下面是点击屏幕时该命令的输出:getevent -lt/dev/input/event2:EV_ABSABS_MT_POSITION_X0000024b/dev/input/event2:EV_ABSABS_MT_POSITION_Y0000065d/dev/input/event2:EV_ABSABS_MT_PRESSURE000000f5/dev/input/event2:EV_ABSABS_MT_TRACKING_ID00000000/dev/input/event2:EV_ABSABS_MT_TOUCH_MAJOR000000a5/dev/input/event2:EV_ABSABS_MT_TOUCH_MINOR00000087/dev/input/event2:EV_ABSABS_MT_ORIENTATIONffffffc6/dev/input/event2:EV_ABSABS_MT_BLOB_ID00000002/dev/input/event2:EV_SYNSYN_MT_REPORT00000000/dev/input/event2:EV_KEYBTN_TOUCHDOWN/dev/input/event2:EV_SYNSYN_REPORT00000000/dev/input/event2:EV_ABSABS_MT_POSITION_X0000024b/dev/input/event2:EV_ABSABS_MT_POSITION_Y0000065c/dev/input/event2:EV_ABSABS_MT_PRESSURE00000067/dev/input/event2:EV_ABSABS_MT_TRACKING_ID00000000/dev/input/event2:EV_ABSABS_MT_TOUCH_MAJOR000000b4/dev/input/event2:EV_ABSABS_MT_TOUCH_MINOR000000a5/dev/input/event2:EV_ABSABS_MT_ORIENTATIONffffffc1/dev/input/event2:EV_ABSABS_MT_BLOB_ID00000002/dev/input/event2:EV_SYNSYN_MT_REPORT00000000/dev/input/event2:EV_SYNSYN_REPORT00000000/dev/input/event2:EV_SYNSYN_MT_REPORT00000000/dev/input/event2:EV_KEYBTN_TOUCHUP/dev/input/event2:EV_SYNSYN_REPORT00000000ABS_MT_POSITION_X 屏幕的横坐标,后面一列是坐标的十六进制数据ABS_MT_POSITION_Y 屏幕纵坐标,后面一列是坐标的十六进制数据BTN_TOUCH 代表屏幕事件,后面如果是DOWN则代表按下,后面如果是UP代表抬起我们可以根据ABS_MT_POSITION_X和ABS_MT_POSITION_Y信息和BTN_TOUCH为DOWN的事件计算响应按下事件的屏幕位置,然后通过BTN_TOUCH为UP的事件计算抬起的屏幕位置,然后用按下和抬起的坐标差来判断该时间是点击还是滑动,然后我们可以进行屏幕截图,甚至在截图上绘制事件的轨迹。来呀!来呀!关注我吧!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2024-12-26 12:52 , Processed in 0.652476 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表