V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
cmxpapa
V2EX  ›  Python

一款好用的开源 UI 自动化测试框架 --- 口语化做 Android、iOS 测试

  •  
  •   cmxpapa · 2022-04-01 13:08:34 +08:00 · 2636 次点击
    这是一个创建于 999 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景

    携程机票从 2018 年年中正式引入 BDD ,至今已 3 年多,成为内部首选的敏捷开发技术。

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

    为什么开源

    • 分享我们的 BDD 技术方案
    • 期待业内使用 BDD 技术的同行通过开源社区与我们进行更深入的交流

    本文将从特性介绍、环境搭建、使用帮助、自定义扩展、持续集成、发版计划这几个方面对框架进行介绍。

    Flybirds

    • 基于 Behave ,实现 BDD 中“自然语言测试用例文档”和“自动化测试代码”关联需要用到支持 BDD 工具。
    • 基于 Airtest ,实现 BDD 中“测试用例能在自动化测试平台上执行”需要用到 UI 自动化测试框架。
    • 基于 Multiple-cucumber-html-reporter ,实现可视化的测试报告

    architecture

    特性

    使用Flybirds你能够完成大部分的手机端自动化操作,以下是一些帮助入门的特性描述:

    • 基于 BDD 模式,类自然语言语法
    • 支持自动化 APP 操作、表单提交、UI 元素校验、键盘输入、Deeplink 跳转等
    • 默认支持英文、中文两种语言,支持更多语言扩展
    • 插件式设计,支持用户自定义自动化扩展
    • 提供 cli 脚手架,快速搭建项目
    • 提供 html 报告

    环境搭建

    1. 使用pip安装 flybirds 框架,过程中会自动安装所需的 依赖包
    pip3 install flybirds
    

    在 Mac/Linux 系统下,需要手动赋予 adb 可执行权限

    • for mac
    cd {your_python_path}/site-packages/airtest/core/android/static/adb/mac
    chmod +x adb
    
    • for linux
    cd {your_python_path}/site-packages/airtest/core/android/static/adb/linux
    chmod +x adb
    
    1. 使用脚手架创建项目
    flybirds create 
    

    clicreate

    快速上手

    运行演示

    为了帮助使用,项目创建时,会生成中英文的 Android 、iOS 演示 feature ,方便用户参考。

    features/test/
    features/test/android
    features/test/android/cn/everything.feature
    features/test/android/en/everything.feature
    features/test/ios
    features/test/ios/cn/everything.feature
    features/test/ios/en/everything.feature
    

    以“Android”为例

    1. 执行命令 adb devices , 检查设备列表中是否包含测试设备
    2. 开始运行
    cd {PATH_TO_PROJECT_FOLDER}
    flybirds run -P features/test/android
    

    框架会通过flybirds_config中配置的packagePath自动下载测试包并安装(请确保手机已经打开”允许安装未知来源“ )
    运行结果如下

    11 features passed, 0 failed, 0 skipped, 0 untested
    23 scenarios passed, 0 failed, 0 skipped, 0 untested
    117 steps passed, 0 failed, 0 skipped, 0 undefined, 0 untested
    Took 5m21.300s
    =====================================================================================
        Multiple Cucumber HTML report generated in:
    
        /Users/test/my_first_project/report/7eb9162a-9d42-4fde-a5d7-d8d4bca7a8d8/index.html
    =====================================================================================
    

    接下来,了解下更多项目细节

    项目结构

    • config:配置文件
    • features:测试用例 feature 文件
    • pscript:自定义扩展
    • report:测试报告

    features 目录

    基础目录结构如下

    • test:存放 feature 文件,这些文件使用自然语言编写,最好由软件项目中的非技术业务、产品人员参与者编写。
    • steps:存放场景中使用的 step 语句实现,“steps.py”中加载了所有的 step 语句模版
    features/
    features/test/
    features/test/everything.feature
    features/steps/
    features/steps/steps.py
    

    复杂些的目录结构参考如下

    features/
    features/test/
    features/test/list.feature
    features/test/buy.feature
    features/test/detail.feature
    features/steps/
    features/steps/steps.py
    

    feature 文件

    feature 文件包含用户动作,行为特征描述及预期结果的文本,行为特征部分使用 Gherkin 语言编写。

    feature 文件,也称为功能文件,有两个目的:文档和自动化测试。

    以关键字开头(“功能”、“场景”、“场景大纲”、“当”、“而且”、“那么”……), 文件中的任何位置都允许使用注释行。

    功能(Feature) 是被测试功能的一些合理的描述性标题,由场景组成。他们可以选择有一个描述、一个背景和一组标签。

    背景(Background) 由一系列类似于场景的步骤组成。它允许您向功能的场景添加一些上下文。在此功能的每个场景之前执行。

    场景(Senario) 标题应该是被测试场景的合理描述性标题,由一系列给定条件的步骤组成

    场景大纲(Senario Outline) 包含功能的详细描述,可以有一组预期条件和结果来配合您的场景步骤

    以下是中文 feature 例子 featureCN

    以下是英文 feature 例子 feature_en

    step 语句模板

    以下列出了部分模版 | 更多模版查阅

    语句模板 语义
    跳转到 [] 跳转到指定的 url 地址
    等待 [] 秒 等待一段时间
    页面渲染完成出现元素 [] 进入新的页面时检查指定元素是否渲染完成
    点击 [] 点击指定属性的元素
    在 [] 中输入 [] 在指定选择器中输入字符串
    向 [] 查找 [] 的元素 向指定方向查找指定属性的元素
    全屏向 [] 滑动 [] 全屏向指定方向滑动指定距离
    存在 [] 的文案 检查页面中存在指定的字符串
    存在 [] 的元素 检查页面中存在指定属性的元素
    元素 [] 消失 检查页面中指定属性的元素在指定时间内消失
    全屏截图 保存当前屏幕图像
    开始录屏 开始录制视频
    结束录屏 结束录制视频
    安装 APP [] 安装 APP
    启动 APP [] 启动 APP
    ----- -----

    Hooks

    用户可在以下文件中定义 hooks

    pscript/dsl/step/hook.py
    
    • before_step(context, step), after_step(context, step)

      在每个步骤(step)之前和之后运行

    • before_scenario(context, scenario), after_scenario(context, scenario)

      在每个场景(senario)之前和之后运行

    • before_feature(context, feature), after_feature(context, feature)

      在每个功能文件(feature)之前和之后运行

    • before_tag(context, tag), after_tag(context, tag)

      在用给定名称标记(tag)的部分之前和之后运行

    • before_all(context), after_all(context)

      在所有执行之前和之后运行

    标签(Tags)

    可以使用 tag 标记不同的场景,方便有选择性的运行。

    下面是一个例子 tag

    运行有特定 tag 的场景,多个用逗号隔开

    flybirds run -T tag1,tag2
    

    ‘-’开头表示运行不包含某 tag 的场景

    flybirds run -T -tag
    

    运行前检查

    1. 请确保配置的测试设备能够正常连接

      • Android: 执行命令 adb devices , 检查设备列表中是否包含测试设备
      • iOS:以tidevice库举例,执行命令 tidevice list,检查设备列表中是否包含测试设备

      Android 设备连接 Q&A

      • 请先安装手机对应品牌的官方驱动,确保能使用电脑对手机进行 USB 调试
      • 确保已经打开了手机中的"开发者选项",并且打开"开发者选项"内的"允许 USB 调试"
      • 部分手机需要打开"允许模拟位置"、"允许通过 USB 安装应用"
      • 关闭电脑上已经安装的手机助手软件,能避免绝大多数问题,请务必在任务管理器中手工结束手机助手进程

      iOS 设备连接 Q&A

      • 请先准备一台 macOS ,使用 xcode 部署 iOS-Tagent 成功后,能够在 mac 或 windows 机器上连接到 iOS 手机。请点击链接下载项目代码到本地进行部署。
      • mac 环境通过 Homebrew 安装 iproxy brew install libimobiledevice
      • windows 环境安装itunes
    2. 下载安装测试包

      • Android:框架会通过config中配置的packagePath自动下载测试包并安装(请确保手机已经打开”允许安装未知来源“ )。也可手动下载安装:下载地址
      • iOS:
        1. 请手动下载演示 APP 进行安装:下载地址
        2. 开启 wdaproxy: shell tidevice --udid $udid wdaproxy -B $web_driver_angnt_bundle_id -p $port

    运行参数

    在终端输入以下内容来查看flybirds运行项目时支持的操作

    flybirds run --help
    
    • run

      执行 features 目录下所有的 feature 文件

    • --path, -P

      指定需要执行的 feature 集合,可以是目录,也可以指定到具体 feature 文件,默认是 ‘features’ 目录.

      示例:

      flybirds run -P ./features/test/demo.feature
      
    • --tag, -T

      运行有特定 tag 的场景,多个用逗号隔开,‘-’开头表示不运行包含此 tag 的场景

      flybirds run -T tag1,tag2,-tag3,tag4
      
    • --format, -F

      指定生成测试结果的格式,默认是 json.

      示例:

      #默认
      flybirds run --format=json
      

    配置参数

    提供了丰富的配置项 | 帮助文档

    必须配置项:deviceId packageName 。

    连接 IOS 设备时,需要额外配置 webDriverAgent 、platform 。

    image

    报告(report)

    报告包含汇总 Summary 和功能(feature)、场景(senario)的执行结果,对于失败的场景(senario),报告中会展示当时的屏幕图像和视频, 下面是一个例子。 report

    自定义 step 语句模板

    在编写 Feature 的过程中,可能会遇到提供的公共语句不能满足自身项目的需求,需要自定义语句。比如:需要对接某个内部工具 API ,此时需要用到自定义语句功能。

    自定义语句功能会用到 python ,如果你不了解这门编程语言,也不必要太担心,因为只会使用到最基础的 python 语法,这并不会太难。

    使用方法

    1. 进入项目目录"psscript/dsl/steps"
    2. 新建.py 文件来编写自定义语句
    3. 在 feature/steps/steps.py 中 import 该.py 文件

    示例代码如下 dsl_extend

    对于团队内部通用的自定义功能,可以考虑创建一个 extend package ,flybirds 支持动态加载,package 命名包含“-flybirds-plugin”即可。

    自定义框架扩展

    理论上 BDD-UI-Testing 可以适用在所有端,比如:APP 、Web 、小程序。

    框架的插件式设计模式,保留了良好的扩展,当前版本只开放了 APP 端支持,未来会逐步开放更多,下面是两个例子供大家参考。

    增加 web 端扩展

    1. plugins.default下添加自己的 web 包
    2. 添加 web 对应的实现。比如page.py,element.py,如果需要增加其他的插件实现类,只需要在GlobalContext类中添加对应的名称。
    3. plugin.event下添加自己的 web 包。
    4. event.web包下重写或者新增类,比如重写run事件可以在plugin.event.web下面添加"run.py",具体实现逻辑可参照已有的run.py
    5. 在项目配置文件"flybirdes_config.json"配置 device_info.platform值为"web"。

    修改当前 APP 端扩展

    • 可通过配置"plugin_info.json"对已有的 plugins 进行修改(只支持修改不支持新增),比如你希望对 plugins 下面ios.app进行修改:
      1. 可以在本地创建一个自己 app.py
      2. 在 plugin_info.json 对应平台中添加如下配置:
         "app": {
            "path": "{local_path}/app.py",
            "ns": "app.plugin"
          }
      

      {local_path} 为本地路径,"ns"为包名,注意包名的唯一性

    其他语种支持

    flybirds 可以支持 40 几种语言,在以下文件中增加公共方法的语言配置即可。

    flybirds/core/dsl/globalization/i18n.py
    

    示例代码如下 lang

    持续集成

    cli 提供的命令行执行模式,可以非常方便加入各种持续集成工具.

    以 Jenkins 为例:

    # Inside the jenkins shell command
    cd {PATH_TO_PROJECT_FOLDER}
    # Run
    flybirds run -P ./features/test/everything.feature
    cp -R reports $WORKSPACE
    

    发版计划

    我们将按照 SemVer 版本控制规范进行发版。逐步新增功能和代码优化,非常欢迎您加入到我们的共建计划中,在 GitHub 上提出您的宝贵建议,以及在使用时遇到的一切问题,我们也会对此每周进行一次小版本的迭代。您也可以在这里给我们精神支持。给仓库点上一颗 Star

    第 1 条附言  ·  2022-04-02 11:43:14 +08:00

    补充一下环境要求

    • python(3.7-3.9)
    • nodejs(12+)

    nodejs只在最终Html报告生成时使用,python3.10暂不支持。

    1 条回复    2022-04-15 15:16:54 +08:00
    cmxpapa
        1
    cmxpapa  
    OP
       2022-04-15 15:16:54 +08:00
    flybirds v0.2 版本发布: https://github.com/ctripcorp/flybirds/releases/edit/v0.2
    新增了 web BDD UI 测试支持,欢迎试用
    1. Web 语法与 APP 端保持一致
    2. 支持无头、有头浏览器模式
    3. 支持多种浏览器内核:chrome 、firefox 、webkit
    4. 支持并发执行模式
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1392 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 17:31 · PVG 01:31 · LAX 09:31 · JFK 12:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.