黑盒测试中关键截图如何打点

黑盒测试中关键截图如何打点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//不要在这个方法内做耗时操作@Overridepublic boolean activityStarting(Intent intent, String pkg) throws RemoteException {return true;}//当调用Activity的onResume方法(比如dialog消失)时会调用这个方法@Overridepublic boolean activityResuming(String pkg) throws RemoteException {return true;}/*** 有应用在Java层产生异常时回调此方法* 返回true时,会显示应用crash的弹窗,返回false时会立即kill应用*/@Overridepublic boolean appCrashed(String processName, int pid, String shortMsg, String longMsg, long timeMillis, String stackTrace) throws RemoteException {return false;}/*** 检测到ANR异常时就会回调此方法*/@Overridepublic int appEarlyNotResponding(String s, int i, String s1) throws RemoteException {return 0;}/***  应用产生ANR时回调此方法,* Return 0 时显示 "应用停止响应" 弹窗。* Return 1 时不做任何操作,等待应用恢复正常;* Return -1 时结束产生ANR的应用.*/@Overridepublic int appNotResponding(String processName, int pid, String processStats) throws RemoteException {return -1;}/*** 系统停止响应时回调此方法,可以在这个方法里面对设备进行些恢复工作         */@Overridepublic 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@Overridepublic void onForegroundActivitiesChanged(int pid, int uid,boolean foregroundActivities) throws RemoteException {if(foregroundActivities) {//}}//活动状态发生变化时调用,在此方案内实际意义不大@Overridepublic void onProcessStateChanged(int pid, int uid, int importance) throws RemoteException {}//结束时调用@Overridepublic void onProcessDied(int pid, int uid) throws RemoteException {}
};

综合应用

上面两种方案各有优劣,我们可以将他们整合在一个流程内实现较为完善的截图机制:

①. 首先我们的服务主要依赖于ActivityController进行页面变化的感知,以便于获取详细的信息和精确控制;

**②. **我们注册IProcessObserver进行辅助验证,当页面发生变化时我们进行截屏,并通过ActivityController最后一次接收事件的时间判断其服务状态,如果服务状态异常,那么我们重新注册ActivityController服务;

**③. **开始监控页面时我们初始化一个定时器,可以定时(2S)截取屏幕,将当前截图Bitmap与上一次的截图Bitmap做图像匹配,如果图片相似度小于0.8,那么可以认定页面发生了变化,如果5S内没有保存过页面信息,那么需要重新初始化ActivityController服务。

Root设备的特殊方案

Android系统是基于Linux系统的移动操作系统。它们可以通过getevent命令输出键盘和屏幕事件,包括响应事件的坐标区域和键盘key值。但是Android系统基于安全考虑,大部分真机系统是没有权限执行getevent命令的,它不会输出任何有效信息,但是华为手机(荣耀20 i)上却可以正常使用。这是一个非常危险的权限,大家自己的手机还是不要开启开发者模式了!

/dev/input/event2: EV_ABS       ABS_MT_POSITION_X    0000024b
/dev/input/event2: EV_ABS       ABS_MT_POSITION_Y    0000065d
/dev/input/event2: EV_ABS       ABS_MT_PRESSURE      000000f5
/dev/input/event2: EV_ABS       ABS_MT_TRACKING_ID   00000000
/dev/input/event2: EV_ABS       ABS_MT_TOUCH_MAJOR   000000a5
/dev/input/event2: EV_ABS       ABS_MT_TOUCH_MINOR   00000087
/dev/input/event2: EV_ABS       ABS_MT_ORIENTATION   ffffffc6
/dev/input/event2: EV_ABS       ABS_MT_BLOB_ID       00000002
/dev/input/event2: EV_SYN       SYN_MT_REPORT        00000000
/dev/input/event2: EV_KEY       BTN_TOUCH            DOWN
/dev/input/event2: EV_SYN       SYN_REPORT           00000000
/dev/input/event2: EV_ABS       ABS_MT_POSITION_X    0000024b
/dev/input/event2: EV_ABS       ABS_MT_POSITION_Y    0000065c
/dev/input/event2: EV_ABS       ABS_MT_PRESSURE      00000067
/dev/input/event2: EV_ABS       ABS_MT_TRACKING_ID   00000000
/dev/input/event2: EV_ABS       ABS_MT_TOUCH_MAJOR   000000b4
/dev/input/event2: EV_ABS       ABS_MT_TOUCH_MINOR   000000a5
/dev/input/event2: EV_ABS       ABS_MT_ORIENTATION   ffffffc1
/dev/input/event2: EV_ABS       ABS_MT_BLOB_ID       00000002
/dev/input/event2: EV_SYN       SYN_MT_REPORT        00000000
/dev/input/event2: EV_SYN       SYN_REPORT           00000000
/dev/input/event2: EV_SYN       SYN_MT_REPORT        00000000
/dev/input/event2: EV_KEY       BTN_TOUCH            UP
/dev/input/event2: EV_SYN       SYN_REPORT           00000000

**ABS_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的事件计算抬起的屏幕位置,然后用按下和抬起的坐标差来判断该时间是点击还是滑动,然后我们可以进行屏幕截图,甚至在截图上绘制事件的轨迹。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/286700.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式软件测试(黑盒测试)---三年嵌入式软件测试的理解

文章内容为本人这三年来在嵌入式软件测试(黑盒)上的一些积累吧,说起来也挺快的,毕业三年的时间就这样过去了,在两家公司工作过(现在这家是第二家),这几年的测试项目基本都是围绕着嵌…

AI抠图软件哪个好用?推荐这三款抠图工具给你

AI抠图软件哪个好用?你是否听说过AI抠图这个操作呢?简单来说,抠图就是一种对图像进行处理的技术,它的目的是将图片中的某些区域去除或者替换。比如,如果你有一张背景很杂乱的图片,你想把背景去掉&#xff0…

Ubuntu中基础命令使用

前言 以下指令测试来自于Ubuntu18.04 如果有说的不对的,欢迎指正与补充 以下指令为我学习嵌入式开发中使用过最多的指令 目录 前言 1 ls 首先我们进入到Linux操作系统中 2 touch创建一个文件 3 pwd查看当前路径 4 创建目录 5 删除文件 6 cd 目录跳转 0…

基于Java SSM框架实现停车场车位管理系统项目【项目源码】计算机毕业设计

基于java的SSM框架实现停车场车位管理系统演示 JSP技术 JSP技术本身是一种脚本语言,但它的功能是十分强大的,因为它可以使用所有的JAVA类。当它与JavaBeans 类进行结合时,它可以使显示逻辑和内容分开,这就极大的方便了运动员的需…

全链路压力测试:解析其主要特点

随着信息技术的飞速发展和云计算的普及,全链路压力测试作为一种关键的质量保障手段,在软件开发和系统部署中扮演着至关重要的角色。全链路压力测试以模拟真实生产环境的压力和负载,对整个业务流程进行全面测试,具有以下主要特点&a…

使用RedisCacheWriter#clean在线异步地批量扫描匹配删除缓存数据-spring-data-redis

1.背景 生产环境,某云的某个业务Redis实例,触发内存使用率,连续 3 次 平均值 > 85 %告警。 运维同学告知,看看需要怎么优化或者升级配置?分享了其实例RDB的内存剖析链接。 通过内存剖析详情发现,存在某…

【数据分享】2019-2023年我国地级市逐年新房房价数据(免费获取/Excel/Shp格式)

房价是一个城市发展程度的重要体现,一个城市的房价越高通常代表这个城市越发达,对于人口的吸引力越大!因此,房价数据是我们在各项城市研究中都非常常用的数据!之前我们分享了2019—2023年我国地级市逐月的新房房价数据…

超实用的Web兼容性测试经验总结,建议Mark

在日常工作中,我们经常碰到网页不兼容的问题。我们之所以要做兼容性测试,目的在于保证待测试项目在不同的操作系统平台上正常运行。 主要包括待测试项目能在同一操作系统平台的不同版本上正常运行;待测试项目能与相关的其他软件或系统的“和…

springboot 学生信息管理

介绍 一个学生信息管理后台,适用于大作业,课设等 软件架构 springbootmybatisthymeleaf (前后端未分离) 安装教程 注:mysql数据库要8.0以上,,本地mysql新建一个名为 student 的空数据库&am…

Nodejs 第二十五章(http)

“http” 模块是 Node.js 中用于创建和处理 HTTP 服务器和客户端的核心模块。它使得构建基于 HTTP 协议的应用程序变得更加简单和灵活。 创建 Web 服务器:你可以使用 “http” 模块创建一个 HTTP 服务器,用于提供 Web 应用程序或网站。通过监听特定的端…

LVGL 移植

LVGL 移植 LVGL简介移植步骤获取LVGL源码添加LVGL源码编写MakeFile显示设备驱动输入设备驱动文件系统 LVGL简介 LVGL(Light and Versatile Graphics Library)是一个免费的轻量级开源图形库,其主要特征有: 丰富的部件&#xff1a…

大数据机器学习-梯度下降:从技术到实战的全面指南

大数据机器学习-梯度下降:从技术到实战的全面指南 文章目录 大数据机器学习-梯度下降:从技术到实战的全面指南一、简介什么是梯度下降?为什么梯度下降重要? 二、梯度下降的数学原理代价函数(Cost Function)…