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

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

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

目录
相关文章
|
17天前
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
63 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
|
2月前
|
测试技术 UED Python
探索软件测试的边界:自动化与手动测试的协同
【8月更文挑战第59天】在追求效率和质量的软件生产中,自动化测试与手动测试的辩论从未停止。本文将通过实际案例,揭示二者如何相辅相成,共同构建更健壮的软件测试体系。我们将深入探讨自动化测试的优势、手动测试不可替代的角色以及它们如何在实际项目中协同工作,旨在为读者提供一种平衡的视角来看待软件测试的实践。
131 65
|
13天前
|
安全 前端开发 测试技术
如何选择合适的自动化安全测试工具
选择合适的自动化安全测试工具需考虑多个因素,包括项目需求、测试目标、系统类型和技术栈,工具的功能特性、市场评价、成本和许可,以及集成性、误报率、社区支持、易用性和安全性。综合评估这些因素,可确保所选工具满足项目需求和团队能力。
|
13天前
|
机器学习/深度学习 SQL 安全
如何确保自动化安全测试的全面性和准确性?
如何确保自动化安全测试的全面性和准确性?
|
1月前
|
测试技术
自动化测试项目实战笔记(三):测试用户注册(验证码错误,成功,出现弹框时处理)
本文是关于自动化测试项目实战笔记,主要介绍了如何测试用户注册功能,包括验证码错误、注册成功以及弹框处理的测试步骤和代码实现。
91 2
自动化测试项目实战笔记(三):测试用户注册(验证码错误,成功,出现弹框时处理)
|
1月前
|
测试技术
自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
本文介绍了如何使用Pytest和Allure生成自动化测试报告。通过安装allure-pytest和配置环境,可以生成包含用例描述、步骤、等级等详细信息的美观报告。文章还提供了代码示例和运行指南,以及重构项目时的注意事项。
206 1
自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
|
1月前
|
测试技术 Python
自动化测试项目学习笔记(一):unittest简单运行(初始化,清除,设置测试行为)
本文介绍了Python的unittest框架的基础用法,包括测试初始化(setup)、清除(tearDown)函数的使用,以及assertEqual和assertGreaterEqual等断言方法,并展示了如何创建测试用例,强调了测试函数需以test_开头才能被运行。
64 1
自动化测试项目学习笔记(一):unittest简单运行(初始化,清除,设置测试行为)
|
23天前
|
前端开发 数据管理 测试技术
前端自动化测试:Jest与Cypress的实战应用与最佳实践
【10月更文挑战第27天】本文介绍了前端自动化测试中Jest和Cypress的实战应用与最佳实践。Jest适合React应用的单元测试和快照测试,Cypress则擅长端到端测试,模拟用户交互。通过结合使用这两种工具,可以有效提升代码质量和开发效率。最佳实践包括单元测试与集成测试结合、快照测试、并行执行、代码覆盖率分析、测试环境管理和测试数据管理。
42 2
|
24天前
|
前端开发 JavaScript 数据可视化
前端自动化测试:Jest与Cypress的实战应用与最佳实践
【10月更文挑战第26天】前端自动化测试在现代软件开发中至关重要,Jest和Cypress分别是单元测试和端到端测试的流行工具。本文通过解答一系列问题,介绍Jest与Cypress的实战应用与最佳实践,帮助开发者提高测试效率和代码质量。
31 2
|
18天前
|
Web App开发 测试技术 数据安全/隐私保护
自动化测试的魔法:使用Python进行Web应用测试
【10月更文挑战第32天】本文将带你走进自动化测试的世界,通过Python和Selenium库的力量,展示如何轻松对Web应用进行自动化测试。我们将一起探索编写简单而强大的测试脚本的秘诀,并理解如何利用这些脚本来确保我们的软件质量。无论你是测试新手还是希望提升自动化测试技能的开发者,这篇文章都将为你打开一扇门,让你看到自动化测试不仅可行,而且充满乐趣。
下一篇
无影云桌面