乐趣区

关于测试自动化:推荐这个UI自动化测试框架像口语化一样写用例

背景

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

Flybirds 是一套基于 BDD 模式的前端 UI 自动化测试框架,提供了一系列开箱即用的工具和欠缺的文档,当初逐渐稳固,成为机票外部首选的 BDD-UI-Testing 测试框架。

为什么开源

  • 分享咱们的 BDD 技术计划
  • 期待业内应用 BDD 技术的同行通过开源社区与咱们进行更深刻的交换

本文将从个性介绍、环境搭建、应用帮忙、自定义扩大、继续集成、发版打算这几个方面对框架进行介绍。

Flybirds

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

个性

应用 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
  • 应用脚手架创立我的项目
flybirds create 

疾速上手

运行演示

为了帮忙应用,我的项目创立时,会生成中英文的 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 例子

以下是英文 feature 例子

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 的场景,多个用逗号隔开

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。

报告(report)

报告蕴含汇总 Summary 和性能 (feature)、场景(senario) 的执行后果,对于失败的场景(senario),报告中会展现过后的屏幕图像和视频, 上面是一个例子。

自定义 step 语句模板

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

自定义语句性能会用到 python,如果你不理解这门编程语言,也不必要太放心,因为只会应用到最根底的 python 语法,这并不会太难。

应用办法

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

示例代码如下

对于团队外部通用的自定义性能,能够思考创立一个 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

示例代码如下

继续集成

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。

  • GitHub 地址:https://github.com/ctripcorp/…
  • PyPI 地址:https://pypi.org/project/flyb…
退出移动版