一款好用的开源 UI 自动化测试框架 --- 口语化做 Android、iOS 测试 - V2EX
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 年 4 月 1 日 3046 次点击
    这是一个创建于 1380 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景

    携程机票从 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 年 4 月 2 日

    补充一下环境要求

    • 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 年 4 月 15 日
    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     Solana     2263 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 01:16 PVG 09:16 LAX 17:16 JFK 20:16
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86