app自动化测试

项目实战目录

1.自动化测试

2.iOS UI自动化测试

3.Flybirds 介绍

4.MacOS运行flybirds工程环境检查与配置

5.MacOS 配置全局环境变量

6.Flybirds 安装运行环境注意点

7.Flybirds 组成

8.Flybirds 分析

9.AirtestIDE

10.Appium

自动化测试

自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。通常,在设计了测试用例并通过评审之后,由测试人员根据测试用例中描述的规程一步步执行测试,得到实际结果与期望结果的比较。在此过程中,为了节省人力、时间或硬件资源,提高测试效率,便引入了自动化测试的概念。

定义 :人为驱动测试为转为机器执行过程

iOS 自动化测试 XCTest

从Xcode 7开始,苹果提供了UI Testing框架,也就是我们在APP test工程中使用的XCTest的那一套东西。UI Testing包含几个重要的类,分别是XCUIApplication、XCUIElement、XCUIElementQuery。

XCUIApplication
代表正在测试的应用程序的实例,可以对APP进行启动、终止、传入参数等操作。

XCUIElement
表示界面上显示的UI元素。

XCUIElementQuery
用于定位UI元素的查询对象。

以下是iOS利用XCTest编写的 按钮点击的自动化测试代码

 
  func testExample() throws {
        // UI tests must launch the application that they test.
        let app = XCUIApplication()
        app.launch()
        guard app.buttons["List"].exists
        else {
            fatalError("error")
        }
        sleep(2)
        app.buttons["List"].tap()
        guard app.buttons["Silver Salmon Creek"].exists
        else {
            fatalError("error")
        }
        sleep(2)
        app.buttons["Silver Salmon Creek"].tap()
        
        guard app.buttons["Toggle Favorite"].exists
        else {
            fatalError("error")
        }
        sleep(2)
        app.buttons["Landmarks"].tap()
        sleep(2)
        app.buttons["Featured"].tap()
        sleep(2)
        guard app.buttons["Silver Salmon Creek"].exists
        else {
            fatalError("error")
        }
        app.buttons["Silver Salmon Creek"].tap()
        sleep(2)
        app.buttons["Toggle Favorite"].tap()
        sleep(2)
        app.terminate()
        // Use recording to get started writing UI tests.
        // Use XCTAssert and related functions to verify your tests produce the correct results.
    }
 

Flybirds 资料

Flybirds 官方文档 [https://flybirds.readthedocs.io/zh_CN/latest/BDD-UI-Testing-Flybirds.html ]

Flybirds github [https://github.com/ctripcorp/flybirds ]

Flybirds 介绍

携程机票BDD-UI-Testing框架Flybirds 是一套基于BDD模式的前端UI自动化测试框架,提供了一系列开箱即用的工具和完善的文档,现在逐步稳定。

在MacOS运行flybirds工程环境检查与配置

Python 3.7- Python 3.9

在MacOS环境下,如果安装多个python版本的话,需要将python 3.7x或8x或9x 版本设置为默认版本!

$ python --version

pip

pip是Python的包管理器 ,python3.4以后都自带pip

flybirds需要使用pip3进行安装Python相关包

$ pip3 install {包名}

tidevice

tidevice 是阿里的内部的一个小组用来做 iOS 自动化用的工具

  1. 安装
$ pip3 install tidevice -i https://pypi.douban.com/simple

  1. 查看
$ tidevice version

homebrew

homebrew是macOS的一个包管理工具,我们需要通过homebrew去下载其他工具.

1.安装homebrew,输入以下脚本根据提示进行安装

$ /bin/bash -c "$(curl -fsSL https://gitee.com/qqlcx5/homebrew/raw/master/install.sh)"

2.查看是否安装成功

$ brew -v

node

1.homebrew安装node

$ brew install node

2.查看是否安装成功

$ node -v

adb

全称Android Debug Bridge,是Android SDK中的一个工具, 使用adb可以直接操作管理Android模拟器或者真实的Andriod设备,就是起到调试桥的作用.

1、安装adb

$ brew cask install android-platform-tools

2、运行adb

$ adb devices

iOS-Tagent

iOS-Tagent是一个基于facebook WebDriverAgent的项目,旨在适应Airtest项目这个很久没更新有适配问题

运行iOS项目需要配置iOS-Tagent 环境,但是我下载官方给的链接地址 iOS-Tagent 这个很久没更新有适配问题 去下载 **[WebDriverAgent](https://github.com/appium/WebDriverAgent)** 
按照官网提示配置

WebDriverAgent

WebDriverAgent是用于iOS的WebDriver服务器实现,可用于远程控制iOS设备。它允许您启动和终止应用程序,点击并滚动视图或确认屏幕上是否存在视图。这使其成为用于应用程序端到端测试或通用设备自动化的理想工具。它通过链接XCTest.framework和调用Apple的API来直接在设备上执行命令来工作。WebDriverAgent是Facebook开发和用于端到端测试的,并已被Appium成功采用。
对WebDriverAgent的分析 [https://www.jianshu.com/p/cf0b4f0d48fd]

wdaproxy

wdaproxy 将 iPhone 端口映射到 Mac 端口,因此您可以通过访问 Mac 来访问手机。

$ brew install openatx/tap/wdaproxy

环境检查之后再按照官网进行配置

地址 : [https://flybirds.readthedocs.io/zh_CN/latest/BDD-UI-Testing-Flybirds.html]

快速配置全局环境变量

在按照以上工具如果遇到配置环境变量的问题可参看以下 :

MacOS配置需知:
macOS Mojave 或 Mojave 之前的系统里,是默认使用 Bash 的,所以需要修改 HOME/.zshrc 文件。

下面例子以使用zshrc为例

1.通过打开文件方式

如果通过打开文件方式去修改全局环境变量,那么需要找到 .zshrc 或 .bashrc文件,但是两个文件是隐藏文件所以需要在终端中输入以下命令:

defaults write com.apple.finder AppleShowAllFiles TRUE(回车)
killall Finder(回车)

另附不显示隐藏文件终端命令

defaults write com.apple.finder AppleShowAllFiles FALSE(回车)
killall Finder(回车)

显示之后去home文件目录查找.zshrc文件

  1. 快捷键 “command+shift+G” --> 搜索框输入 “~/” --> 回车

  1. 找到.zshrc文件 打开

  2. 需要配置的环境变量进行添加

2.通过终端命令

  1. 打开Mac 终端,配置全局环境变量
$ vim .bash_profile

``

2. 打开之后添加一行以下代码

```java   
$  PATH=$PATH:{需要配置的可执行文件路径}

  1. 保存并退出 键盘输入 :wq 保存并退出
$ :wq

Flybirds 安装运行环境注意点

因为官网文档写的很全面,所以我只说一下命令以及注意点:

1. python环境变量

在MacOS环境下,如果安装多个python版本的话, 需要将python 3.7x或8x或9x 版本设置为默认版本!

终端输入 : python

输出结果 :

xxxxxx ~ % python  
Python 3.8.9 (default, Aug 21 2021, 15:53:23) 
[Clang 13.0.0 (clang-1300.0.29.3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 

然后再使用pip3 进行环境安装。

2. 配置文件不要忘记,我就是忘记配置了某个地方耽误了些时间.

必须配置项:deviceId packageName。
连接IOS设备时,必须额外配置webDriverAgent、platform。

3. iOS-Tagent 环境

运行iOS项目需要配置iOS-Tagent 环境,但是我下载官方给的链接地址 iOS-Tagent 运行是有错误的,我当前环境是Xcode13,可能是环境问题.于是乎我去找啊找耽误了些时间,说是要修改代码,我一看 iOS-Tagent 中要修改代码的位置是个 framework,我又找到了appium 还在维护的 WebDriverAgent ,这是可以使用的.

 ### 最后执行:
```java   
$ tidevice --udid 1xxxxxxxxxxx wdaproxy -B  2xxxxxxxxxxx --port 8100 

1xxxxxxxxxxx 手机的 udid。
2xxxxxxxxxxx WebDriverAgent的 bundleID。

顺带说一句使用 tidevice查询链接手机查询安装应用的 bounldID 的时候,如果多设备连接 tidevice applist 无法查询 , 我连接就一台设配但是查看的时候多出来两个不知道在什么地方挂起的设备后边标记为 network 而不是USB连接,所以需要添加设备的 udid 来查看所以应用的bundleID如下:

 $ tidevice --udid 1xxxxxxxxxxx applist

在项目目录下运行

$ flybirds run -P features/test/ios

最后iOS和Android的 feature文件运行起来了。

2022-03-10 15:15:29,873 - flybirds_log - INFO - 
2022-03-10 15:15:29,873 - flybirds_log - INFO - run step:not exist element[label=机票]
2022-03-10 15:15:29,873 - flybirds_log - INFO - result_dic: {'selector': 'label=机票'}
2022-03-10 15:15:32,941 - flybirds_log - INFO - 
2022-03-10 15:15:32,941 - flybirds_log - INFO - run step:not exist text[升级攻略]
2022-03-10 15:15:32,942 - flybirds_log - INFO - result_dic: {'selector': '升级攻略'}
2022-03-10 15:15:35,525 - flybirds_log - INFO - 
2022-03-10 15:15:35,525 - flybirds_log - INFO - run step:element[label=机票]disappear
2022-03-10 15:15:35,526 - flybirds_log - INFO - result_dic: {'selector': 'label=机票'}
2022-03-10 15:15:38,201 - flybirds_log - INFO - 
2022-03-10 15:15:38,201 - flybirds_log - INFO - run step:text[搜索]disappear
2022-03-10 15:15:38,201 - flybirds_log - INFO - result_dic: {'selector': '搜索'}
2022-03-10 15:15:40,965 - flybirds_log - INFO - device_id:00008020-001651AE3A88003A,
2022-03-10 15:15:40,965 - flybirds_log - INFO - page_name:scenario_success_page,
2022-03-10 15:15:40,965 - flybirds_log - INFO - package_name:com.ctrip.inner.wireless
2022-03-10 15:15:40,966 - flybirds_log - INFO - running feature:flybirds test feature-android verify element scenario:Element Step Test verify text, location: features/test/ios/en/verify.feature:2
2022-03-10 15:15:40,966 - flybirds_log - INFO - device_id:00008020-001651AE3A88003A,
2022-03-10 15:15:40,966 - flybirds_log - INFO - page_name:before_run_page,

Flybirds

中文案例

 # language: zh-CN
功能: flybirds自定义测试步骤功能测试-ios verify element

   场景: 主页面全部按钮测试
     当 启动APP[io.dcloud.HBuilder]
     那么 页面渲染完成出现元素[label=直播列表]
     而且 等待[1]秒
     那么 点击[label=开始直播]
     而且 等待[1]秒
     那么 点击[label=直播列表]
     那么 等待[1]秒
     那么 点击[label=我的]
     那么 等待[2]秒
     那么 返回上一页
     那么 点击[label=直播列表]
     那么 等待[2]秒
     那么 点击[label=开始直播]
     那么 等待[2]秒
     那么 页面渲染完成出现元素[label=开启直播]
     那么 点击[label=开启直播]
     那么 等待[2]秒
     那么 点击[label=返回]
     那么 等待[2]秒
     那么 点击[label=开启直播]
     那么 页面渲染完成出现元素[text=开启摄像头预览]
     那么 点击[text=开启摄像头预览]
   

英文案例

    # language: en
Feature: flybirds test feature-ios click

  Scenario: test click--click position
      When start app[io.dcloud.HBuilder]
      And  wait[2]seconds
      And  page rendering complete appears element[label=直播列表]
      And  click[label=开始直播]
      And  wait[1]seconds
      And  click[label=我的]
      And  wait[1]seconds
      And  click[label=开始直播]
      And  wait[1]seconds
      And  click[label=开启直播]
      And  wait[2]seconds
      And  exist text[开启摄像头预览]
      And click text[开启摄像头预览]
      Then  close app

Flybirds 是由多个工具组成

  1. airtest

  2. behave

  3. multiple-cucumber-html-reporter

airtest

Airtest 是网易出品的一款基于图像识别和poco控件识别的一款UI自动化测试工具。

  1. Airtest提供了跨平台的API,包括安装应用、模拟输入、断言等。 基于图像识别技术定位UI元素,你无需嵌入任何代码即可进行自动化。

  2. Poco是一款跨平台的自动化测试框架,基于UI控件搜索原理 ,适用于Android、iOS原生和各种主流的游戏引擎应用。

目前看来,Flybirds 使用的是 poco这种技术来获取UI控件元素.

airtest 与 Flybirds关系

flybirds是基于airtest进行获取试图结构, 而airtest 里面基于 airtest 框架与 Poco框架.

airtest 框架是基于图像识别,获取界面元素.
Poco,基于UI控件搜索原理 ,获取界面元素.

其中 Poco 获取视图层级的方式
  1. android:是采用 PocoHierarchyViewer 工具获取

  2. iOS :是采用 iOS-Tagent, iOS-Tagent, 基于 Facebook 开源 WebDriverAgent的项目

behave

 使用以自然语言风格编写的测试,并由Python代码支持.
 行为驱动开发(或BDD)是一种敏捷的软件开发技术,鼓励开发人员、QA和软件项目中的非技术或业务参与者之间的合作。

multiple-cucumber-html-reporter

 将JSON输出解析为漂亮报告的报告模块。

Flybirds 实现思路

通过behave框架识别自然语言与Poco里api进行关联 ,最后用生成的json数据利用 multiple-cucumber-html-reporter 生成可视化报告.

Flybirds 对app的不足

Flybirds针对原生应用比较友好可识别元素较多,但是针对flutter应用以及uniapp应用识别率较低,原因是内部集成的是 Poco,Poco本身未对flutter应用以及uniapp做过多处理.

可优化实施方案

  1. Flybirds 添加图像识别技术
  2. 修改 WDA(WebDriverAgent)对 flutter应用以及uniapp的元素获取

其他工具 AirtestIDE

AirtestIDE 是一个跨平台、多端(Windows、web、android、ios、游戏)的UI自动化测试编辑器,支持自动化脚本录制、一键回放、报告查看。

Game:通过图像识别和UI层次结构,支持所有游戏引擎和应用程序,使用方便。

Android:通过访问Android原生应用程序,可以发挥重要作用,即插即用。

IOS:通过poco可以访问iOS原生元素并找出它们的位置和属性,这使得iOS测试过程变得简单方便。

Windows:支持Windows应用程序,可以编写代码并在平台上运行它。

Web:基于Chrome Devtools协议,记录并生成selenium脚本,准确访问Web元素。

你可能感兴趣的:(app自动化测试)