【背景】
移动端app飞速发展后,导致各种自动化框架雨后春笋般的发展。纵观这类框架都在声称对于控件的操作是很牛逼的,深入分析后可以看出它们最终会回归到UI基本的坐标点操作。
于是,app自动化测试工程师UI自动化进阶路线:初识各种自动化框架-》编写自动化脚本-》自动化平台化,支持用户脚本录制回放-》持续集成-》玩烂了(case覆盖率越高自动化收益越低、数据问题、产品迭代带来的维护成本)
作为一个app自动化测试的小白,尝试提出一个新的思路:从“运行时”角度尝试自动化。

image.png

【解决的问题】
1.传统Ui自动化录制的人力成本-很难录制完美的执行脚本
2.脚本兼容问题-安卓碎片化严重和程序开发的框架性导致的id丢失和不对应的问题
3.一个机型上录制的脚本,换个机型?
4.各种UI级别自动化的诟病。

【技术探究】

一、安卓的事件分发机制:

Android事件 点击、双击、拖拽、滑动、移动、触摸和多点触控
事件的动作组成 down 按下事件,所有的动作必须都是从down事件开始 move 移动事件 up 手指离开事件,一般也代表事件完成
事件的传递 屏幕硬件捕捉到事件 —> 系统 —> 应用 —> activity —> viewgroup*(多层嵌套) —> view(最终的view)
事件的处理方法 dispatchTouchEvent “是否”分发,事件分发方法,activity、viewgroup、View中都有 onInterceptEvent “是否”拦截,事件拦截方法,只有viewgroup中有该方法,用来拦截事件,view是事件分发的终端,所以不需要拦截事件,而activity是用与用户进行交互的,拦截了事件就没意思了 onTouchEvent “是否”消耗,事件处理方法,用来处理事件
ViewGroup的相关事件有三个: onInterceptTouchEvent、dispatchTouchEvent、onTouchEvent。 View的相关事件只有两个:dispatchTouchEvent、onTouchEvent。
事件分发流程图 分发的是down事件,down事件的分发是为了寻找一个可以处理完整事件的控件,down被处理move和up也就被处理了
注:此事件分发图是不包括拦截的

这里写图片描述

解释:down事件从activity开始往下层子控件分发,分发到没有子控件的控件view,不能继续往下分发了,所以view开始调用onTouchEvent方法判断自己是否能处理该事件,若返回true代表消耗了该事件,view的dispatchTouchEvent方法也返回true,事件结束;若返回false,代表处理不了这个事件,则down事件往上返回到viewgroup2,viewgroup2的处理同view,此处不再赘述。
带有拦截(onInterceptEvent)的事件分发,返回true表示拦截,false表示不拦截。拦截的意思就是强制停止向下分发,此时该控件将要判断自身是否能处理该事件,如果处理不了就继续向上返回,返回让上一级处理,如果该控件可以处理该事件则事件被消耗,事件结束。

总结:这就是事件机制,其实可以用递归的思想来理解,递归函数是dispatchTouchEvent(控件),递归体是循环遍历控件的孩子控件,调用dispatchTouchEvent(孩子控件)方法,递归出口有以下几种,①控件为终端控件,没有孩子控件;②onTouchEvent方法返回true,事件被处理了,此时dispatchTouchEvent方法也返回true;③onInterceptEvent方法返回true,事件被拦截。

二、安卓的事件监听机制

Android事件处理包括两个部分:Android事件处理机制(基本)和Android消息传递机制(进阶)。前者包含三种处理方式,即基于监听的事件处理、基于回调的事件处理、直接绑定到标签;后者包含两种处理方式,即Handler消息传递、异步任务处理。

注:图片来自于裂缝中的阳光JDG

三、安卓的RUNTIME

image.png

从上图看安卓的框架组成,仅仅看出一个安卓模块的组成,我们做个简单的划分:其核心是安卓虚拟机,其余为其lib依赖文件,再往上framework和applocations层是使用java语言开发的事件预处理机制。我们看一个事件在执行时安卓做了什么:

image.png

安卓的运行时其实就是java的运行时!
安卓的运行时其实就是java的运行时!
安卓的运行时其实就是java的运行时!
重要的话说三遍。

【脑洞大开】
我们去想一个问题:
安卓的自动化测试进行录制回放时,我们实际做了什么?
脚本录制-》脚本回放-》框架点击坐标点

接着看自动化框架接下来做了什么?
想了想也没做啥,框架点击了坐标,接下来就是安卓自己触发了操作。

那么安卓做了什么?
事件分发-》触发监听-》从监听程序段入口执行代码-》java和jvm

那么,如果自动化框架可以直接从事件分发时或者触发监听时或者事件入口直接触发事件呢,和现有的自动化效果有何区别?
嗯..... 应该执行的时候没有点击效果,事件会继续完美执行吧?

如果自动化录制时直接拦截这些事件呢?

嗯..... 入参和函数地址无差异化~

【接下来....】
如何实现事件的拦截和事件的回放?

1.代码替换。
xpose框架怎么完成某些app的监听与代执行的?
通过安卓虚拟机和框架层的连接控制jar包hook住各个安卓包的class文件,找到对应的类。

2.反转注入与aop
如果把java主流开发框架spring的思路运用在这里?
貌似spring在开发之初没有几行代码。

UI自动化新思路-基于RUNTIME的自动化测试设想相关推荐

  1. UI自动化框架 基于selenium+pytest和PO分层思想

    最近在编写UI自动化框架,现在将一些碎片化东西进行梳理,便于记忆 同时,为了方便于各个模块的独立管理,以及秉承高复用,低耦合的思想,这里是根据PO模型编写,同时将所有的模块进行了独立,页面和元素,以及 ...

  2. iOS自动化测试之基于模拟器的自动化测试

    本文来自霍格沃兹测试开发学社 本文节选自霍格沃兹测试学院内部教材 本章节主要讲解 WebDriverAgent 环境搭建以及如何通过 iOS模拟器完成自动化. WebDriverAgent简介 Web ...

  3. 浅尝UI自动化之Airtest实践

    1.浅尝UI自动化之Airtest实践 背景 由于很多公司都采用敏捷开发的模式,测试也要跟着进行敏捷测试.而每个迭代的周期非常短,经常要对原有功能进行回归测试,这样就增加了大量重复人力成本. 引入UI ...

  4. 【得物技术】浅尝UI自动化之Airtest实践

    一.背景 由于很多公司都采用敏捷开发的模式,测试也要跟着进行敏捷测试.而每个迭代的周期非常短,经常要对原有功能进行回归测试,这样就增加了大量重复人力成本.引入UI自动化测试可以用来快速回归测试app原 ...

  5. Robot Framework ui自动化中级-unittest(四)

    本章节学习RF框架UI自动化 Selenium 介绍:Selenium 自动化测试工具,它主要是用于 Web 应用程序的自动化测试,但并不只局限于此,同时支 持所有基于 web 的管理任务自动化. S ...

  6. python图片比对、自动化测试_基于python+appium通过图片对比来做的UI自动化

    1.python + appium +图片对比实现UI自动化: 背景: 当手机需要适配不同的语言时,测试过程中易出现因为语言不熟悉,导致UIbug被遗漏(例如setting中的描述性文字显示不完整等等 ...

  7. pythonapp自动化_基于python的App UI自动化环境搭建

    Android端Ui 自动化环境搭建 一,安装JDK.SDK 二,添加环境变量 Widows: 1.系统变量→新建 JAVA_HOME 变量 E:\Java\jdk1.7.0 jdk安装目录 2.系统 ...

  8. python的web自动化框架实例_Selenium基于Python web自动化测试框架 -- PO

    关于selenium测试框架首先想到的就是PO模型,简单说下PO模型 PO模型的概念和理解: PO就是一个设计思想,将代码以页面为单位进行组织,针对这个页面上的所有信息.相关操作都放到一个类中,从而使 ...

  9. Ui自动化概念+Web自动化测试框架介绍

    目录 UI 1.UI自动化测试概念:我们先明确什么是UI 2.为什么对UI采用自动化测试? 3.什么项目适合做UI自动化测试? 4.UI自动化测试介入时机 5.UI自动化测试所属分类 Web自动化测试 ...

最新文章

  1. Animator窗口视图Project视图PlayerIdleAnimation和PlayerWalkingAnimation
  2. C语言--字符串和数字的相互转换
  3. CentOS的改变系统启动级别
  4. linux nohup /dev/null,nohup结合/dev/null
  5. 日志 中文乱码、nacos 中文乱码、saltstack 中文乱码、docker中文乱码
  6. C# 实现将网络资源保存到本地
  7. BZOJ2081 [Poi2010]Beads
  8. vue 项目中遇到的问题及解决方案
  9. 0507Python基础-set-深浅copy
  10. java-Socket文件传输
  11. Mac技巧1: 精确倍速QuickTime Player 播放器
  12. wincc 服务器授权型号,WINCC 授权详解
  13. 鸿蒙系统微信双开,支持微信双开 老旗舰一加3/3T喜迎系统更新
  14. 智能暖风机——1.硬件搭建
  15. coffeescript html5,CoffeeScript函数
  16. P1714 切蛋糕(线段树+前缀和)
  17. 基于微信小程序的学习记录与提醒应用设计与实现-计算机毕业设计源码+LW文档
  18. 两款网页在线刷网站访客pv和ip的源码
  19. 蚁群优化算法(ACO)详细介绍
  20. 动态规划之硬币面值组合问题

热门文章

  1. ZooKeeper客户端ZKClient使用
  2. Ubuntu10下MySQL搭建Amoeba_读写分离
  3. 学习Exchange管理最佳实践
  4. 3.25Day06元组、字典、集合常用及内置方法
  5. 一个自定义python分布式爬虫框架。
  6. jQuery异步上传文件
  7. springboot~Compiler时开启插件的注解功能
  8. Objective-C 内存管理之ARC规则
  9. 根据已有项目jar文件生成maven的pom.xml
  10. css基础 设置链接颜色