SoloPi 架构解析 | 录制回放的原理与实战

本文涉及的产品
mPaaS订阅基础套餐,标准版 3个月
简介: 通过本文我们将开启《SoloPi 架构解析》连载,围绕 SoloPi 在“录制回放”、“性能测试”、“一机多控”等方面的实践展开,从而深度分析在相应能力的构建与优化过程中,SoloPi 沉淀了怎样的设计思路与实战经验。

SoloPi 架构解析介绍

SoloPi,源自于支付宝开源,面向移动端实现的一套无线化、非侵入、免 Root 的 Android 专项工具,能够脱离 PC 环境,在移动端实现自动化的功能、性能及兼容性测试,降低广大测试开发者的测试成本,提升测试效率。
通过本文我们将开启《SoloPi 架构解析》连载,围绕 SoloPi 在“录制回放”、“性能测试”、“一机多控”等方面的实践展开,从而深度分析在相应能力的构建与优化过程中,SoloPi 沉淀了怎样的设计思路与实战经验。

  • 本文作者:
    茅舍,来自支付宝,SoloPi 核心作者之一
  • 本文概览:
    SoloPi 录制回放 - 录制操作

SoloPi 录制回放 - 用户操作监控与控件获取
SoloPi 录制回放 - 更多控件介绍&功能分类
SoloPi 录制回放 - 用例回放

录制回放是什么?

关于录制回放,大家如果对具体功能还不是非常清晰,可以先阅览下面这个视频:

视频完整呈现了 SoloPi 录制回放的全过程,覆盖“用例录制”、“用例编辑”以及“用例回放”。因此,通过 SoloPi,开发者有能力在完全不插线的情况下,实现自动化用例的录制,并基于多种设备完成回放动作。
那么,SoloPi 是如何做到基于移动端进行自动化用例的录制和回放?毕竟自动化框架的核心在于“控件获取”和“事件驱动”,这两点往往依赖 PC 完成驱动;而在手机端,由于系统的权限管控,往往很难实现类似的功能,因此我们很少见到类似的移动端自动化测试工具。
接下来,我们将通过录制回放通用模式下的一个具体事例,来为大家展开分析 SoloPi 录制回放的具体原理。

SoloPi 录制回放深度解析

首先进入录制回放首页,点击右上角可以切换需要测试的应用。
这里我们以 Snapseed 作为待测应用(SnapSeed 是一个图像处理工具)。

solopi - 录制回放 1.png

点击开始执行,SoloPi 会自动跳转到对应应用,并显示一个悬浮窗。点击悬浮窗绿色三角,即可开始用例录制。

录制操作

用例录制状态下,当你点击屏幕任意一个位置,SoloPi 会监控到具体的点击位置,并将这个位置的控件进行高亮。

solopi - 录制回放 2.png

如图所示,黄点表示用户点击的坐标,红框表示 SoloPi 获取的待操作控件。SoloPi 通过获取到用户点击时的坐标,以及当前页面的控件结构,来实现这种功能。

用户操作监控与控件获取

关于用于操作监控与控件获取,熟悉 Android 系统的开发者可能首先会想到 AccessibilityService。
AccessibilityService 能够获取用户的操作事件并关联对应的控件,确实可以实现大部分功能。但 AccessibilityService 也有不足的地方,比如面向 HTML5 场景,辅助功能获取控件会出现延迟从而导致获取的控件结构不够精确;另外,对于部分自定义控件,辅助功能只能获取到对应的控件,但缺乏具体的坐标信息,从而导致控件操作不符合预期。
为了应对以上不足,SoloPi 采取了“结合 Android 系统 getevnet 功能”策略,通过直接解析系统原生事件,获取到用户的操作行为。

关于 getevent 的具体内容,可以看一下 Google 提供的相关文档:
https://source.android.com/devices/input/getevent

简单来说,通过 getevent,SoloPi 可以获取到用户操作屏幕的具体坐标,以及手指落下、抬起的具体时间。

solopi - 录制回放 3.png

不过,getevent 命令的使用需要 SHELL 权限,这限制了普通 Android 应用获取相关数据的能力。SoloPi 通过Android 系统的无线调试功能实现了一套纯端的 SHELL 执行能力,能够在 Android 系统上执行 adb 相关命令,这块儿的具体介绍可以参考《SoloPi:支付宝开源的 Android 专项测试工具》。

通过 getevent 命令,SoloPi 获取到了用户点击的具体坐标。结合 AccessibilityService 的控件结构树,我们便可以查找到用户实际想要操作的控件了。
或许有人会问,我们既然能够获取用户的操作,以及屏幕上的控件信息,为什么录制时要卡一道,选择对应的操作,直接让用户进行操作不好吗?确实,直接操作的体验会更加顺滑,但 SoloPi 通过选择功能的界面,既可以给用户一个二次确认的机会,防止进行误操作,又能够提供更多的功能。此外,录制模式与回放模式走的是同一套执行机制,可以更好的保证用例回放的成功率。

更多控件介绍&功能分类

  • 关于更多控件

通过辅助功能,可以获取到比较完整的 Native 控件结构,但对于最近较为火热的 HTML5、小程序的控件结构,就显得较为力不从心了。
针对 HTML5、小程序,SoloPi 通过 ChromeDevtoolProtocal 与 Chrome 内核通信从而获取到页面结构。这种方式同样基于 SoloPi 的 SHELL 能力,与可调试的 Chrome 内核完成通信,实现了 PC 上的 Chrome Driver 功能。通过注入 JS 获取到 HTML5 页面的完整控件结构信息。同时,SoloPi 能够将 Native 结构的控件信息与 HTML5 结构的控件信息进行统一,从而构建出一个既包含 Native 结构,也包含 HTML5 结构的页面结构树,让用户摆脱来回切换控件结构的困扰。

图片.gif

此外,在一些通过图像引擎渲染的场景,不管是 Native 模式,还是小程序、HTML5 模式,以上解决思路都无法正常执行。因此,SoloPi 提供了图像查找模式,根据图像的特征来进行查找,补足在游戏、AR 方面的自动化能力。

SoloPi 主要通过AbstractProviderAbstractNodeProcessor这两个类来获取控件信息:通过AbstractProvider 获取控件的原始数据,并生成原始树结构,而 AbstractNodeProcessor 则着眼于处理单个控件节点信息,实现控件树的完善与结构扩展。有兴趣的读者也可以尝试实现这两个类,定义自己的控件结构。

  • 关于功能分类

选择控件后,SoloPi 会弹出具体的操作选择页面,包含点击操作输入操作滑动操作逻辑操作扩展操作五大类。以“点击操作”为例,SoloPi 提供了五种功能,前两种功能(点击及长按)不用赘述,第三种为发现则点击,意味着如果发现了特定控件,则进行点击,主要用于处理弹窗和部分非必然出现的场景,快速点击用于处理一些容易消失的控件,比如播放器的控制器。此外,重复点击意味着针对某一个特定位置完成重复性的点击动作。

solopi - 录制回放 4.png

当开发者选择完相应操作后,SoloPi 便启动自动执行。面对部分耗时较长的操作,SoloPi 的图标将变成红色,待图标变回黄色时,意味着操作已执行完毕。以上,我们便完成了一步操作的录制。
而对于部分非控件类型的操作,如滑动屏幕,返回,Sleep 等不针对特定控件的操作,需要点击屏幕右侧的 SoloPi 图标(如下图所示),从而唤起全局操作框(注意,全局操作模式下屏幕不会显示红框)。在全局操作框下,开发者选择对应的操作完成执行动作,而操作类型主要分为“常用操作”、“应用操作”、“滑动操作”、“设备操作”、“扩展功能”与“流程管控”六大类。

solopi - 录制回放 5.png

用例回放

录制完成后,就可以在最近录制查看全部用例中看到完成好的录制用例。点击用例,会跳转到测试的应用,并显示悬浮窗,点击绿色三角即可开始回放。
回放时,SoloPi 会先高亮查找到的控件,然后再执行操作。

solopi - 录屏.gif

整套 SoloPi 的录制回放,基于同一套逻辑,包括控件结构构建、控件定位、事件驱动三个部分。两者的区别主要在于控件定位:

  • 在录制过程中,SoloPi 会基于用户的点击行为进行定位;
  • 在用例回放时,SoloPi 会根据录制时记录的控件信息,通过 SoloPi 的控件查找算法进行定位。

solopi - 录制回放 6.png

与以往自动化框架通过指定文字、ID 进行查找不同,SoloPi 的控件查找算法会综合控件的各类信息,包括文字、描述、resourceId、Xpath、图像信息,对控件进行打分,并通过录制时的位置信息进行辅助定位,确定目标控件,从而实现较为精确地回放查找。

数据输出

SoloPi 的用例是以 JSON 操作序列的形式保存,每一步操作都被分为操作控件与操作方法两部分,操作控件部分包含了原始控件的各类信息,包括文字、图像、resourceId、Xpath、坐标等信息,而操作方法则包含具体的操作类型、方法参数这些信息。
除了在 SoloPi 应用间传递, SoloPi 用例也支持转化为 Appium 、 Macaca 的用例格式,可以在各种运行环境进行回放。

{
  "operationId": "dt24chb7ar",
  "operationIndex": 0,
  "operationMethod": { // 操作方法
    "actionEnum": "CLICK", // 操作方法
    "encrypt": false, // 是否加密
    "operationParam": {
      "localClickPos": "0.7982456,0.5479452"  // 相对于控件的位置
    }
  },
  "operationNode": {  // 操作节点
    "assistantNodes": [  // 辅助定位节点
      {
        "className": "android.widget.ImageView",
        "parentHeight": 1,
        "resourceId": "tv.danmaku.bili:id/tab_icon"
      },
      {
        "className": "android.widget.TextView",
        "parentHeight": 1,
        "resourceId": "tv.danmaku.bili:id/tab_text",
        "text": "会员购"
      }
    ],
    "className": "android.widget.LinearLayout",
    "depth": 12,
    "extra": {
      "captureImage": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAEBAQEBAQEBAQEBAQEB......",  // 截图
      "originSize": "720,1480",  // 截图尺寸
      "screenSize": "1440,2960"  // 原始屏幕大小
    },
    "id": "-4294967206",
    "nodeBound": {  // 控件坐标
      "bottom": 2878,
      "empty": false,
      "left": 1203,
      "right": 1317,
      "top": 2732
    },
    "nodeType": "AccessibilityNodeTree",
    "packageName": "tv.danmaku.bili",
    "xpath": "/android.widget.FrameLayout/android.widget.LinearLayout[1]/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.support.v4.widget.DrawerLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[2]/android.widget.LinearLayout[1]/android.widget.FrameLayout[4]/android.widget.LinearLayout" 
  }
}

小结

通过本文,我们针对 SoloPi 在 Android 端录制回放的全流程及具体实现原理展开解析,后续我们将围绕“一机多控”、“性能测试”、“用例的高级玩法”展开分享。

希望大家能够尝试体验 SoloPi,在过程中遇到任何疑惑,或者痛点,请积极反馈建议。期待和大家能够持续共建 SoloPi,拓展并完善更多能力。
也可以通过钉钉扫码以下二维码,进入“SoloPi 钉钉交流群”,期待你的加入。

联系我们.png

目录
相关文章
|
10天前
|
存储 JSON 数据库
Elasticsearch 分布式架构解析
【9月更文第2天】Elasticsearch 是一个分布式的搜索和分析引擎,以其高可扩展性和实时性著称。它基于 Lucene 开发,但提供了更高级别的抽象,使得开发者能够轻松地构建复杂的搜索应用。本文将深入探讨 Elasticsearch 的分布式存储和检索机制,解释其背后的原理及其优势。
39 5
|
6天前
|
运维 监控 持续交付
深入浅出:微服务架构的设计与实战
微服务,一个在软件开发领域如雷贯耳的名词,它代表着一种现代软件架构的风格。本文将通过浅显易懂的语言,带领读者从零开始了解微服务的概念、设计原则及其在实际项目中的运用。我们将一起探讨如何将一个庞大的单体应用拆分为灵活、独立、可扩展的微服务,并分享一些实践中的经验和技巧。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和深入的理解。
31 3
|
8天前
|
域名解析 网络协议
DNS服务工作原理
文章详细介绍了DNS服务的工作原理,包括FQDN的概念、名称解析过程、DNS域名分级策略、根服务器的作用、DNS解析流程中的递归查询和迭代查询,以及为何有时基于IP能访问而基于域名不能访问的原因。
21 2
|
11天前
|
设计模式 存储 人工智能
深度解析Unity游戏开发:从零构建可扩展与可维护的游戏架构,让你的游戏项目在模块化设计、脚本对象运用及状态模式处理中焕发新生,实现高效迭代与团队协作的完美平衡之路
【9月更文挑战第1天】游戏开发中的架构设计是项目成功的关键。良好的架构能提升开发效率并确保项目的长期可维护性和可扩展性。在使用Unity引擎时,合理的架构尤为重要。本文探讨了如何在Unity中实现可扩展且易维护的游戏架构,包括模块化设计、使用脚本对象管理数据、应用设计模式(如状态模式)及采用MVC/MVVM架构模式。通过这些方法,可以显著提高开发效率和游戏质量。例如,模块化设计将游戏拆分为独立模块。
37 3
|
11天前
|
存储 SQL Cloud Native
Hologres 的架构设计与工作原理
【9月更文第1天】随着大数据时代的到来,实时分析和处理数据的需求日益增长。传统的数据仓库在处理大规模实时数据分析时逐渐显露出性能瓶颈。为了解决这些问题,阿里巴巴集团研发了一款名为 Hologres 的新型云原生交互式分析数据库。Hologres 能够支持 SQL 查询,并且能够实现实时的数据写入和查询,这使得它成为处理大规模实时数据的理想选择。
36 2
|
11天前
|
开发者 图形学 Java
揭秘Unity物理引擎核心技术:从刚体动力学到关节连接,全方位教你如何在虚拟世界中重现真实物理现象——含实战代码示例与详细解析
【8月更文挑战第31天】Unity物理引擎对于游戏开发至关重要,它能够模拟真实的物理效果,如刚体运动、碰撞检测及关节连接等。通过Rigidbody和Collider组件,开发者可以轻松实现物体间的互动与碰撞。本文通过具体代码示例介绍了如何使用Unity物理引擎实现物体运动、施加力、使用关节连接以及模拟弹簧效果等功能,帮助开发者提升游戏的真实感与沉浸感。
27 1
|
5天前
|
负载均衡 网络协议 安全
DNS解析中的Anycast技术:原理与优势
【9月更文挑战第7天】在互联网体系中,域名系统(DNS)将域名转换为IP地址,但网络规模的扩张使DNS解析面临高效、稳定与安全挑战。Anycast技术应运而生,通过将同一IP地址分配给多个地理分布的服务器,并依据网络状况自动选择最近且负载低的服务器响应查询请求,提升了DNS解析速度与效率,实现负载均衡,缓解DDoS攻击,增强系统高可用性。此技术利用动态路由协议如BGP实现,未来在网络发展中将扮演重要角色。
25 0
|
11天前
|
开发者 图形学 API
从零起步,深度揭秘:运用Unity引擎及网络编程技术,一步步搭建属于你的实时多人在线对战游戏平台——详尽指南与实战代码解析,带你轻松掌握网络化游戏开发的核心要领与最佳实践路径
【8月更文挑战第31天】构建实时多人对战平台是技术与创意的结合。本文使用成熟的Unity游戏开发引擎,从零开始指导读者搭建简单的实时对战平台。内容涵盖网络架构设计、Unity网络API应用及客户端与服务器通信。首先,创建新项目并选择适合多人游戏的模板,使用推荐的网络传输层。接着,定义基本玩法,如2D多人射击游戏,创建角色预制件并添加Rigidbody2D组件。然后,引入网络身份组件以同步对象状态。通过示例代码展示玩家控制逻辑,包括移动和发射子弹功能。最后,设置服务器端逻辑,处理客户端连接和断开。本文帮助读者掌握构建Unity多人对战平台的核心知识,为进一步开发打下基础。
32 0
|
11天前
|
开发者 图形学 C#
揭秘游戏沉浸感的秘密武器:深度解析Unity中的音频设计技巧,从背景音乐到动态音效,全面提升你的游戏氛围艺术——附实战代码示例与应用场景指导
【8月更文挑战第31天】音频设计在游戏开发中至关重要,不仅能增强沉浸感,还能传递信息,构建氛围。Unity作为跨平台游戏引擎,提供了丰富的音频处理功能,助力开发者轻松实现复杂音效。本文将探讨如何利用Unity的音频设计提升游戏氛围,并通过具体示例代码展示实现过程。例如,在恐怖游戏中,阴森的背景音乐和突然的脚步声能增加紧张感;在休闲游戏中,轻快的旋律则让玩家感到愉悦。
24 0
|
11天前
|
C# 开发者 Windows
勇敢迈出第一步:手把手教你如何在WPF开源项目中贡献你的第一行代码,从选择项目到提交PR的全过程解析与实战技巧分享
【8月更文挑战第31天】本文指导您如何在Windows Presentation Foundation(WPF)相关的开源项目中贡献代码。无论您是初学者还是有经验的开发者,参与这类项目都能加深对WPF框架的理解并拓展职业履历。文章推荐了一些适合入门的项目如MvvmLight和MahApps.Metro,并详细介绍了从选择项目、设置开发环境到提交代码的全过程。通过具体示例,如添加按钮点击事件处理程序,帮助您迈出第一步。此外,还强调了提交Pull Request时保持专业沟通的重要性。参与开源不仅能提升技能,还能促进社区交流。
22 0

热门文章

最新文章

推荐镜像

更多