Python测开28期-偕行-app自动化测试体系与appium介绍及环境安装

一、 app自动化测试体系

1、 UI 自动化价值

  • 提高效率
    • 融入企业迭代流水线,与 CI/CD/DevOps 结合
    • 回归测试、功能测试加速
  • 提高质量:
    • 兼容性测试
    • 专项/非功能测试
    • 自动化探索测试

2、 app 测试的时代背景

  • 按月发布->按周发布->按小时发布
  • 多端发布:Android、iOS、微信小程序、h5
  • 多环境发布:联调环境、测试环境、预发布环境、线上环境
  • 多机型发布:众多设备型号、众多系统版本
  • 多版本共存:用户群体中存在多个不同的版本
  • 历史回归测试任务:成百上千条业务用例如何回归

3、 技术选型

  • 推荐Appium–新版本也支持图像识别

    • 跨语言:Java、Python、nodejs 等
    • 跨平台
      • Andoid、iOS
      • Windows桌面应用、Mac桌面应用
    • 底层多引擎可切换
    • 生态丰富,社区强大
  • Airtest–游戏测试框架(图像识别)

  • 其他框架:

    • calabash–只支持ruby语言
    • macaca–支持js、Python、java
    • atx
  • iOS:KIF WDA XCUITest

  • Android:Robotium Uiautomator2

目前 mobile 自动化解决方案

iOS Android
Calabash-iOS calabash-Android
Frank MonkeyTalk
UIAutomation Robotium
iOS-driver UIAutomator
KeepItFunctional Selendroid
Macaca Macaca
Appium Appium

自动化工具选择

工具名称 被测系统 脚本语言 是否支持 H5 是否支持跨应用 工具稳定性 是否为 sdk 自带
MonkeyRunner Android Java Y N 稳定 Y
Monkey Android Java N N 稳定 Y
Uiautomator2 Android Java Y Y 稳定 Y
Uiautomation iOS 弃用
Adb-For-Test Android Java/Python Y Y 稳定 Y
Appium Android,iOS Java/Python/JS/C# Y Y 一般 N

选择条件

  • 单平台测试/多平台测试?
  • 是否多设备同时测试?
  • 不局限测试环境,任何版本、任何环境都可以测试?
  • 最擅长开发语言
  • 当前市面是否有满足项目需求的测试工具?是否需二次开发?

4、 UI 自动化测试用例如何编写–核心是降低维护成本

  • 业务流程不频繁改动
  • UI 元素不频繁改动
  • 需要频繁回归的场景
  • 核心场景等

5、appium学习路线

二、appium2.x介绍

image

1、前言

自 2022 年 1 月 1 日起,Appium 核心团队不再维护 Appium 1.x,也就是说Appium GUI Server 和Appium Desktop都不要用了,直接用命令行安装Appium Server,结合Appium Inspector进行元素定位即可。官方支持的平台驱动程序的所有最新版本均不兼容 Appium 1.x,需要 Appium 2 才能运行。

Appium 2是一个自动化移动应用程序的开源工具,它带来了以下重要改进:
1.支持最新的移动操作系统版本;
2.进行了性能优化,提高了自动化测试执行的效率和稳定性;
3. 引入了新的命令和API,使得测试脚本编写更加灵活和便捷;
4. 提供了更新的文档和更加活跃的社区支持。

2、appium2.x的变化

  • 解绑所有的 drivers。在Appium V2版本中驱动和Appium Server是分开的,驱动可以分开安装和升级。

    • Appium 1.0 是和系统有绑定关系的,比如安卓绑定了 Uiautomator2、iOS 绑定了 xcuitest,其他的测试驱动安装起来比较麻烦。
    • 解绑 drivers 后,appium 2.0 能非常轻松的通过命令行添加需要的 driver。
  • 创建完善的 drivers 生态。

    • Appium 1.0 其实已经具备了跨平台测试的能力,iOS、android、window、Mac、flutter 都已经有对应的driver 可以使用,但是部分 driver 还是没什么人去使用。
    • Appium 2.0 支持每个人基于已经有的驱动修改和定制,甚至自己做一个完全新的驱动进行测试,一行命令就可以集成进 Appium,非常方便。
  • 创建完善的插件系统。现在的移动端测试场景多变而复杂,对于特殊场景的测试手段,往往需要一些具备特殊功能的插件,比较典型的是基于图形识别的定位和 diff 机制,Appium 2.0 支持简单易用的插件管理系统,能非常方便的扩展它原有的能力, 越来越多的开发者融入进来,开发各种功能的插件,一定会极快的推动 Appium 的发展。

    • 官方的images插件可以使用图像识别来定位元素。
    • 第三方插件appium-device-farm能够集中管理设备。
  • 严格遵循W3C协议。类似于Selenium 4中引入的W3C协议,Appium V2中严格遵循W3C协议。在Appium V2编写测试脚本时填写capabilities需要指定appium:前缀。

    • 其中platformName是属于标准的W3C协议中的capabilities,不需要添加前缀。
    • 非标准的W3C协议中的capabilities需要添加appium:前缀。
    • 更多capabilities请查看这里
{    "platformName": "Android",
   "appium:automationName": "uiautomator2",
   "appium:deviceName": "emulator-5554",
   "appium:appPackage": "com.lemon.lemonban",
   "appium:appActivity": "com.lemon.lemonban.activity.WelcomeActivity"
}

3、appium原理介绍

(1)设计理念

  • Client 端:将与 Appium 的各种交互封装为可被调用的 API 或工具,如此一来使用者就可以通过 Inspector 或者 Java/Python/其他语言的 Appium 第三库对 Appium Server 进行调用。
  • Server 端:起到了信息中转的作用。启动了一个 HTTP 服务,如此就可以接收Client 客户端的请求信息。除此之外,会将所有的控制命令,比如:Adb 命令,自动化的控制命令等其他命令转发到被测应用的移动端上面。
  • 移动端:真正执行自动化测试的地方。

(2) Appium 工作引擎

server 里面不只有 webDriver「安卓 driver、 iOSdriver」还有各种工作引擎;

Platform Driver Platform Versions Appium Version
iOS XCUITest「推荐」 iOS 9.3+ Appium 1.6+
UIAutomation「弃用」 iOS 9.3- All
Android UiAutomator All Appium 1.14+
UiAutomator2「推荐」 Android5.0+ Appium 1.6+
Espresso Appium 1.9+
Mac appium-mac-driver Mac OS X 10.7 Appium 1.6.4+
Windows windows Windows 10 Appium 1.6+

(3)总结

Appium 原理

Appium 使用 JSON Wire Protocol 来在客户端和服务器之间传递命令和数据。客户端发送 JSON 格式的请求到 Appium 服务器,服务器解析请求并采取相应的操作,然后将响应以 JSON 格式返回给客户端。

  1. Client 端,就是运行编写的自动化项目代码,使用 Appium-client 提供的 API 来进行用例的编写。其中,声明 DesiredCapabilities 对象,指定被测设备及 app 的相关信息。DesiredCapabilities 对象中指定 automationName 的 value 值为 UiAutomator2,这样才可以通过 Appium Server 去创建一个 Android 的 session 会话自动化项目代码中首先请求创建一个 AndroidDriver 实例,需要传入 Appium Server 的 URL 及 DesiredCapabilities 对象。
  2. Appium Server 启动时默认的占用的端口号为 4723,主要作用就是进行 API 请求的监听。接收 Client 端发送的命令,并进行转换,转为移动端可识别的指令,并发送给移动端设备进行操作,再等待移动设备返回操作结果。Appium Server 端接收到移动设备返回的结果再将操作结果发送给 Client 端。其中,Appium Server 可以和自动化项目代码同时放在 Client 端,也可以放在云端。如果与代码同时放在 Client 端上,Appium Server 的 IP 地址为 127.0.0.1;如果放在云端,Appium Server 的 IP 地址为云端服务器的 IP 地址。
  3. Android 移动端,Appium 基于 JSON Wire 协议,通过调用 UIAutomatior 命令,实现 APP 的自动化测试。UIAutomator 测试框架是 Android SDK 自带的 APP UI 自动化测试 Java 库。客户端发送请求给 Appium Server,Appium Server 转换请求给移动端,在移动端操作完成后返回响应内容给 Appium Server,Appium Server 再把结果返回给客户端。

Appium 通信

Appium 的通信过程涉及到客户端和服务器之间的交互。通信过程是基于 WebDriver 协议和 JSON Wire Protocol 的,客户端和服务器之间通过命令和响应进行交互,实现对移动设备的控制和测试操作。

  1. 客户端请求创建 driver 会话,将声明的 capabilities 启动参数通过端口 4723 传递给 Appium Server;
  2. Appium Server 基于 capabilities 中的 automationName 属性,重定向到相应的驱动模块。如果 automationName 是 uiautomator2,Appium Server 重定向到 UIAutomator2 Driver,此时创建 session 会话并生成对应的 sessionID。
  3. 为了在 Android 手机上运行应用程序,Appium 需要有一定的权限来控制系统设置。 Appium 安装了一个小应用程序 io.appium.settings,安装成功后,Appium Settings 在后台运行。 由于使用的是 UIAutomator2 Driver,所以要在 Android 手机上安装 Driver 相关的 apk,即 appium-uiautomator2-server-xx.apk。 安装完成后,Appium Server 的 8200 端口 和 Android 设备端的 6790 端口建立映射,通过该映射的链路进行通讯。
  4. 客户端通过发送命令和请求到 Appium 服务器来执行不同的操作,如启动应用程序、模拟手势、获取元素属性等。这些命令以 JSON 格式发送给服务器。
  5. Appium 服务器解析收到的命令,根据命令的类型和参数,调用相应的驱动程序来执行操作。驱动程序将与设备进行通信,并执行所需的操作。
  6. 执行完成后,Appium 服务器将操作的结果以 JSON 格式返回给客户端。响应包括操作的状态、结果数据和错误信息等。
  7. 测试完成后,客户端可以发送断开连接的请求来结束会话。Appium 服务器会清理相关的资源和环境,并关闭与设备的通信。

4、appium生态工具

三、appium环境安装

1、 Node.js安装

  • 注意:Node.js的版本最好是在V20及以上

  • 下载并安装 Node.js下载链接

    • 一直下一步安装即可
  • 验证是否安装成功

    • node -v
      image

2、java环境- JDK安装

  • 注意:至少jdk11

  • 下载并安装 JDK下载链接

    • 一直下一步安装即可
  • 配置环境变量
    image
    image

  • 验证是否安装配置成功:java -version
    image

3、adb环境- Android SDK安装

  • 下载 SDK下载链接

  • 安装SDK Manager

  • 使用SDK Manager安装sdk

  • 配置环境变量—注意:这里有个坑,appium服务在查找AndroidSDK的时候,环境变量只认%ANDROID_HOME%,用其他的名字要出问题;

    • 系统变量新增ANDROID_HOME
      image
    • path变量中新增:
      • build-tools路径%ANDROID_HOME%\build-tools\29.0.3\lib
      • platform-tools路径%ANDROID_HOME%\platform-tools
      • tools路径%ANDROID_HOME%\tools
        image
  • 通过adb命令验证是否安装成功:adb --version
    image

  • 拓展:ideviceinstaller

    • iOS 系统的命令行控制工具
    • 获取 iOS 端的各种数据和控制
idevice_id -l #显示当前所连接设备的 udid

4、 安装Appium 2.x

  • 在命令提示符(cmd)窗口中,输入命令:npm i --location=global appium

  • 验证是否安装成功:appium -v
    image

  • 说明:如果对上述环境配置没有信心,可以使用appium-doctor进行环境监测;

    • 安装appium-doctornpm install -g appium-doctor
    • 执行检测命令 :appium-doctor

5、 安装驱动程序

  • 安装UIAutomator2,用于安卓设备 的驱动程序。cmd窗口输入:appium driver install uiautomator2
    image

  • 安装XCUITest,用于iOS设备 的驱动程序。cmd窗口输入:appium driver install xcuitest
    image

  • 查看是否安装成功,命令:appium driver list
    image

6、 安装appium-inspector

7、 Appium Inspector 连接Android手机 (获取元素定位)

(1)adb连接Android手机

(2)启动appium服务

(3)通过adb命令获取app包名

  • 先在手机上启动app
  • 通过adb命令获取app包名和页面名

(4)运行 Appium Inspector,按如下添加配置

{
  "platformName": "Android", # 平台类型 (Android、ios)
  "appium:platformVersion": "6.0.1", # 手机操作系统的版本
  "appium:deviceName": "127.0.0.1:7555", # 设备名称
  "appium:appPackage": "com.xueqiu.android", # app的包名
  "appium:appActivity": ".view.WelcomeActivityAlias", # app的启动页面activity
  "appium:automationName": "UiAutomator2", # 自动化测试的引擎
  "appium:unicodeKeyboard": "true", # 使用unicode编码方式键盘发送字符串
  "appium:restKeyboard": "true", # 隐藏键盘
  "appium:noReset": "true" # 控制是否清除app中的缓存信息,比如是否清除登录的session
}
  • 说明:

    • 其中platformName是属于标准的W3C协议中的capabilities,不需要添加前缀。

    • 非标准的W3C协议中的capabilities需要添加appium:前缀。

    • 注意:这个过程中可能会发生各种各样的错误,需要认真查看inspector给出的错误信息,以及去查看appium服务的日志,本人就遇到过以下错误:

      • AndroidSDK的build-tools找不到,导致一直连接超时,所以又重新装了以下AndroidSDK;
      • 需求app的启动页面activity弄错,导致无法打开雪球app;—appActivity参数要的是启动页面的activity,所以先在cmd把命令输好:adb shell dumpsys window windows | findstr mFocusedApp,在手机点击启动app后就快速按下回车执行命令获取启动页面activity;
  • appium inspector中的host、端口和path要注意,path和appium1.x的有点区别,appium1.x的path是/wd/hub,而appium2.x的是:/

    • Remote Host:127.0.0.1
    • Remote Port:4723
    • Remote Path:/

四、appium inspector 功能键

1、顶部工具栏

  • Native App Module:原生app界面模型
    image

  • Web/Hybrid App Module:混合app界面模型
    image

  • SelectElements:查找元素,输入选择器之后查找页面的元素,这个功能很有用,用于验证所写选择器是否正确;
    image

    • 通过选择器Id、XPath、Name、Class Name、Accessibility ID、UIAutomator Selector查找元素;
      image

image

  • Swipe By Coordinates:通过坐标点滑动
    image

  • Tap By Coordinates:通过坐标点点击
    image

  • Back:返回
    image

  • Refresh Source & Screenshot:刷新页面或者截图
    image

  • StartRecording:开始录制脚本
    image

  • Search for element:搜索元素
    image

  • Quit Session & Close Inspector:退出当前 Session
    image

2、类似浏览器的开发者工具

  • 页面右键点击inspect element进入“类似浏览器的开发者工具”定位元素和查看源码等等—很强!

3、中间工具栏

  • Source:页面布局源码
  • Actions:动作链
  • Session Information:inspector连接server的session信息
  • Copy XML Source to Clipboard:复制 xml 结构
    image

4、Selected Element界面

  • 显示控件的基本信息,定位和可操作性属性信息就在这里查看
  • 工具栏,Send_Keys蛮好用,直接给控件进行输入,其他的后续再说吧
    image