开源测试工具 携程机票 BDD UI Testing 框架 - Flybirds

49875183 · 2022年01月20日 · 最后由 JiCheng 回复于 2022年01月24日 · 1341 次阅读

作者 | Liang,携程研发总监,关注工程效能、DevOps、自动化框架等。

一、背景

携程机票从 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 报告

五、环境搭建

  • 使用 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 ![](/uploads/photo/2022/c180f25f-2bc4-4ef8-9842-87ebe7775550.png!large)

六、快速上手

  • 运行演示

为了帮助使用,项目创建时,会生成中英文的 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” 为例:

执行命令 adb devices , 检查设备列表中是否包含测试设备

开始运行

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 语句模板

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

  • 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

运行前检查

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

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

  • 下载安装测试包

Android:
框架会通过 config 中配置的 packagePath 自动下载测试包并安装(请确保手机已经打开” 允许安装未知来源 “ )。也可手动下载安装:下载地址

iOS:
a. 请手动下载演示 APP 进行安装:下载地址
b. 开启

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 语法,这并不会太难。

使用方法:

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

示例代码如下:

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

十二、自定义框架扩展

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

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

增加 web 端扩展

在 plugins.default 下添加自己的 web 包。

添加 web 对应的实现。比如 page.py,element.py,如果需要增加其他的插件实现类,只需要在 GlobalContext 类中添加对应的名称。

在 plugin.event 下添加自己的 web 包。

在 event.web 包下重写或者新增类,比如重写 run 事件可以在 plugin.event.web 下面添加"run.py",具体实现逻辑可参照已有的 run.py。

在项目配置文件"flybirdes_config.json"配置 device_info.platform 值为"web"。

修改当前 APP 端扩展

可通过配置"plugin_info.json"对已有的 plugins 进行修改(只支持修改不支持新增),比如你希望对 plugins 下面 ios.app 进行修改:

a. 可以在本地创建一个自己 app.py
b. 在 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/flybirds
PyPI 地址:
https://pypi.org/project/flybirds

贡献
1)Fork 仓库
2)创建分支 (git checkout -b my-new-feature)
3)提交修改 (git commit -am 'Add some feature')
4)推送 (git push origin my-new-feature)
5)创建 PR
欢迎在 github issues 区提问

支持邮箱:flybirds_support@trip.com

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 11 条回复 时间 点赞

恕我直言,没什么亮点。。。
” 类自然语言语法 “ --咋看挺高大上,但本质就是方法的封装, 实际作用能有哪些?还是徒增了上手成本?

lazyBoy 回复

BDD 在某些行业还是很流行的,常见的是 java 的 cucumber,和 python 的 robotframework

不过我也想了解,这个框架和上面的两种有什么区别和亮点

ruby+cucumber 是我们公司大概 8 年前用的技术,早在几年前就被淘汰了。
BDD 在测试框架中的使用说真的,就和 RF 的关键字封装一个样,确实没啥亮点,只是换成了中文而已。
如果只是为了不懂技术的人方便编写或者读懂 UI 自动化用例,我建议直接做成 UI 自动化平台会更清晰易懂。
比起这个,我觉得是数据驱动,用例报告管理以及录制调试这些功能的拓展更加重要。

说实话,我看着 BDD 就头疼,无非 把 代码 用中文封装一层而已
现在谁还不会写点代码?
非得搞这么一出

徐汪成 回复

所以,贵司现在用什么技术?

树叶 回复

不知道你对 bdd 是不是有什么误解。
bdd 指的是 behavior driven development, 行为驱动测试,和是不是中文没关系。

树叶 回复

Python 自己封装的框架 ,还有自己开发的 UI 测试平台。

看起来并没有解决大多数 UI 自动化的痛点,这种模式想扩展也是头皮发麻

徐汪成 回复

UI 测试平台,看起来也是个坑

你们的用例流程都这么简单的么?

UI 测试 是不影响软件开发情况下的最后一道关卡 是最容易抓的 也是从公司层面上人员耦合最低的

其实从软件质量上来说 单元测试会更直接的保证, 只不过这种跟开发耦合太高了, 很难推进

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册