【腾讯TMQ】一种Android端Web多进程情况下支持Web自动化测试的方法

针对应用宝Web多进程环境下自动化测试难题,本文提出了一种新的自动化测试方案。该方案通过插件化方式解决了多进程环境下Instrumentation注入问题,并详细介绍了方案的具体实现步骤和技术细节。

​从2016年开始,应用宝的主体工程就开始往多进程方向发展,至7.0版本发布时主工程已完成多进程改造,而彼时应用宝的子进程基本不涉及UI,自动化测试框架采用Robotium+UiAutomator2.0的方式,Robotium基于Instrumentation注入主要负责单个APP内的自动化测试,UiAutomator2.0支持跨应用的自动化测试,因此彼时应用宝的多进程改造并没有影响到BVT自动化测试。

应用宝Web多进程后,就暴露了目前业界主流自动化测试框架的不足,Robotium支持Web自动化但仅限于注入单一进程,UiAutomator2.0支持跨进程但却不支持Web自动化,其它的支持Web自动化的框架例如Selendroid、Espresso等等在原理上均与Robotium相类似(采用Instrumentation注入执行JS提取Web元素),因此也不支持跨进程的Web自动化。

本文介绍一种在Web多进程情况下支持Web自动化测试的方案。介绍当前Web自动化的简要原理、Web多进程后的问题、相应的解决方案及使用方法。

一、Android端Web自动化原理简介

Android端支持Web自动化的测试框架如Robotium、Selendroid、Espresso等等在原理上基本类似,都是采用Instrumentation注入被测app后,执行js脚本,提取并封装成拥有Web元素的文本信息、id或class等属性、坐标信息等等的WebElement对象。

首先,进入Chrome的MobileEmulation模式,访问例如应用宝中视频TAB的H5页面。

然后,进入Chrome的js控制台:Ctrl + shift + j,执行如下JS脚本:

可以看到浏览器的提示框显示了className为classify classify-tv元素的信息。

可以看到,通过JS注入的方式,我们可以获取网页中的包括文字、tag标签、属性、坐标等等信息。

那么,如果我们也能够在Android上用JS的这种方式获取每个网页元素的信息,然后对这些信息进行封装处理,那么在自动化测试时就可以操作这些Web元素了。

WebChromeClient类在Android中,主要用于辅助WebView处理Javascript的对话框、提示框等等


如上图,以onJsPrompt()为例,当WebView加载网页时,如果有Js调用了onPrompt弹出提示框,则onJsPrompt()将会被调用,该方法中的String message参数即为显示在提示框中的提示语,即如下图中的提示语将传递给message参数

以下是Robotium中的实现:

获取到message后,然后按一定规则对message进行分解,然后封装成WebElement对象

简要原理图如下:

二、Web多进程后的问题

由Android端Web自动化的原理可知,核心是Instrumentation注入后,获取目标WebView,对该WebView执行js以提取Web元素。Web多进程后,Web运行在子进程中,而Instrumentation注入的是主进程,且由于Android的沙箱机制导致在主进程中无法获取子进程中的控件对象,也就是Instrumentation注入后,无法获取H5子进程中的目标WebView,示例图如下:

出现该问题后,解决思路主要有两个方向:

1、让Instrumentation注入Web子进程而不是主进程:经尝试后发现Instrumentation在注入时,会判断当前进程名,即当前进程名需要与测试工程AndroidManifest.xml文件中申明的targetPackage一致,而Web子进程的进程名为主进程包名加后缀的形式,即:com.tencent.android.qqdownloader:web。若直接修改targetPackage,在AndroidManifest.xml申请instrumentation时又不能带:号,因此该方向不可行。

2、将测试app中获取目标WebView及执行js等等模块移植到web子进程执行,再通过IPC跨进程通信将执行结果传回测试app,此方向可行。

三、Web多进程后的支持Web自动化测试方案 #

上文第二中的第二个方向虽然可行,但结合项目实际情况还需要优化改进方案,在项目侧会有以下要求:

1、应用宝严格控制安装包大小,因此支持Web自动化测试相关代码若移植入子进程,显然会增大不少安装包的大小。那么采用开关控制打包?

2、项目正在做持续交付流程,自动化所测包即为最终希望发布的包,因此测试代码需要对外发布。

终上,最后方案确定为将测试代码采用插件化的方式,将主要实现代码在插件app中实现,应用宝web子进程中只实现少量的调用插件app的代码,对安装包影响小、安全风险可控。方案示例图如下:

另外,由于应用宝使用了手机QQ浏览器提供的TBS(TencentBrowsing Service)浏览服务,在web子进程中可能出现系统WebView或者X5WebView,两者在实现Web元素提取时有所不同,需要区别对待,整体方案的核心逻辑流程如下图所示:

1、测试app发送cmd命令:在Android端Web自动化测试中,要想完全支持Web的测试,除了获取Web的元素外,还有例如获取Web页面的url链接、标题、进度条、上下滑动等等,因此本方案以cmd命令字的方式来区分这些不同的操作。

2、支持Web自动化测试的代码以插件方式实现,子进程收到cmd命令时,需要先判断是否需要安装插件,插件app采用Android工程进行开发,最终编译生成的是一个插件apk,需要安装插件时则从手机上的指定目录安装插件apk。

3、映射ClassLoader:插件app需要能支持X5 WebView的自动化测试,因此插件工程需要引入TBS提供的SDK,但在编译时不打包进插件apk。应用宝内使用X5内核提供的服务时,也是用的TBS提供的SDK,且是以TBS插件形式使用,因此本方案中的插件app在实际运行时要找到TBS SDK中的类时需要做ClassLoader映射。

4、判断当前Web子进程在用的是否是X5 WebView:若是X5 WebView,则走X5 WebView相应的js执行、提取Web元素的流程;若是系统WebView,则走系统WebView相应的js执行、提取Web元素的流程。

5、测试app解析并封装成WebElement:测试app发送的cmd命令为获取Web元素时,插件app提取到的元素是以json数组转字符串形式进行存储,因此解析时该json数组每个元素就对应于一个Web元素,可以封装成WebElement对象。若发送的cmd命令为例如获取Web的url链接、标题等等时,则无需解析。

获取更多测试干货,请搜索微信公众号:腾讯移动品质中心TMQ!

这里写图片描述

版权所属,禁止转载

### 商城项目的自动化测试实践 #### 测试框架的选择 对于商城项目而言,选择合适的自动化测试工具至关重要。例如,在移动iOS平台上的逻辑自动化测试实践中提到,通过腾讯TMQ进行iOS自动化测试能够有效提升效率[^1]。 #### 用户交互流程模拟 在设计商城项目的自动化测试方案时,应站在最终用户的视角来考虑整个购物流程。这包括但不限于商品浏览、加入购物车、结算支付等功能模块。每个功能模块都可以被拆分为多个独立的小型测试用例来进行验证。例如: - 商品详情页加载速度及显示准确性; - 加入购物车按钮响应情况及其后的库存更新机制; - 支付网关接口调用的成功率以及异常处理能力等。 这些具体的业务场景不仅限于界面上的操作,还涉及到后台服务之间的通信协议和数据库状态变更等方面的内容[^2]。 #### 关键路径优先级划分 并非所有的操作都需要完全依赖UI级别的自动化脚本来完成。对于那些不直接影响用户体验但又十分重要的环节(比如订单创建过程中的某些参数校验),可以直接利用API请求的方式来简化测试步骤并提高执行效率。这样既能保证核心交易链路的安全稳定运行,又能减少不必要的资源消耗。 ```python import requests def create_order(api_url, payload): response = requests.post(url=api_url, json=payload) if response.status_code == 200: return True else: raise Exception(f"Failed to create order with status code {response.status_code}") ``` 此代码片段展示了如何通过POST方法向指定URL发送JSON格式的数据体以创建新订单实例,并根据返回的状态码判断是否成功。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值