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

【背景】
移动端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在开发之初没有几行代码。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,326评论 4 369
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,228评论 1 304
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,979评论 0 252
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,489评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,894评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,900评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,075评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,803评论 0 205
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,565评论 1 249
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,778评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,255评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,582评论 3 261
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,254评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,151评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,952评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,035评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,839评论 2 277

推荐阅读更多精彩内容