作者简介

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报告

五、环境搭建

5.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

5.2 使用脚手架创建项目

flybirds create

六、快速上手

6.1 运行演示

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

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

6.2 项目结构

  • config:配置文件

  • features:测试用例feature文件

  • pscript:自定义扩展

  • report:测试报告

6.3 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

6.4 feature文件

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

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

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

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

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

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

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

以下是中文feature例子:

以下是英文feature例子:

6.5 step语句模板

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

6.6 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)

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

6.7 标签(Tags)

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

下面是一个例子:

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

flybirds run -T tag1,tag2

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

flybirds run -T -tag

七、运行前检查

7.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

7.2 下载安装测试包

  • 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

团队招聘信息

我们是携程机票研发团队,负责携程APP/PC端机票业务开发及创新。机票研发在搜索引擎、数据库、深度学习、高并发等方向持续不断地深入探索,持续优化用户体验,提高效率。

在机票研发,你可以和众多技术顶尖大牛一起,真实的让亿万用户享受你的产品和代码,提升全球旅行者的出行体验和幸福指数。

如果你热爱技术,并渴望不断成长,携程机票研发团队期待与你一起腾飞。目前我们前端/后台/数据/测试开发等领域均有开放职位。

简历投递邮箱:tech@ctrip.com,邮件标题:【姓名】-【携程机票】-【投递职位】。

【推荐阅读】

  • 携程机票前端安卓虚拟机测试集群建设实践

  • 质量保障新手段,携程回归测试平台实践

  • 应用SQL性能风险识别与预警,携程金融支付AppTrace落地实践

  • 携程是如何在测试时做精准流量筛选的

 “携程技术”公众号

  分享,交流,成长

开源 | 携程机票BDD UI Testing框架 - Flybirds相关推荐

  1. 开源 | 携程 Foxpage 前端低代码框架

    作者简介 Jason Wang,携程研发经理,目前主要负责低代码类产品的设计和研发,关注低代码行业的发展及相关解决方案在企业内部的落地. 一.背景 随着低代码开发方式被越来越多的人接受和认可,低代码得 ...

  2. 开源|携程机票 App KMM 跨端 KV 存储库 MMKV-Kotlin

    作者简介 禹昂,携程移动端资深工程师,专注于 Kotlin 移动端跨平台领域,Kotlin 中文社区核心成员,图书<Kotlin 编程实践>译者. 一.背景 携程机票移动端研发团队自 20 ...

  3. 干货 | 携程机票前端安卓虚拟机测试集群建设实践

    作者简介 Liang,携程研发总监,关注DevOps,前端&服务端质量保障.能效提升: Tony,携程资深测试经理,关注自动化测试框架及平台类工具开发. 一.背景 在携程内部业务高频率敏捷迭代 ...

  4. 干货 | 携程机票 App KMM 跨端生产实践

    作者简介 禹昂,携程移动端资深工程师,Kotlin 中文社区核心成员,图书<Kotlin 编程实践>译者. Derek,携程资深研发经理,专注于移动端开发,热衷于各种跨端技术的研究和实践. ...

  5. 干货 | 携程机票大数据架构最佳实践

    本文转载自 携程技术中心(ctriptech) 公众号,本文PPT请点击下面 阅读原文 获取 作者简介 许鹏,携程机票大数据基础平台Leader,负责平台的构建和运维.深度掌握各种大数据开源产品,如S ...

  6. 携程机票 Android Jetpack 与 Kotlin Coroutines 实践 | 开发者说·DTalk

    本文原作者: 禹昂,携程机票移动端资深工程师,Kotlin 中文社区核心成员,图书<Kotlin 编程实践>译者. 原文发布于: 携程技术 https://mp.weixin.qq.com ...

  7. 干货 | 携程机票 Android Jetpack 与 Kotlin Coroutines 实践

    作者简介 禹昂,携程机票移动端资深工程师,Kotlin 中文社区核心成员,图书<Kotlin 编程实践>译者. 一.前言 1.1 技术背景与选型 自 2017年 Google IO 大会以 ...

  8. tkmybatis 子查询_日均20亿流量:携程机票查询系统的架构升级

    携程机票查询系统,日均20亿流量,且要求高吞吐,低延迟的架构设计.于是,提升缓存的效率以及实时计算模块长尾延迟,成为制约机票查询系统性能的关键.本文是携程集团机票业务技术总监宋涛在「云加社区沙龙onl ...

  9. 干货 | 携程机票Sketch插件开发实践

    作者简介 尹正波,携程机票研发部前端工程师,专注设计和开发的交叉领域,用系统和工具改进设计体验和交付. Sketch 是伴随移动应用程序崛起而流行的 UI 设计工具.2014年 Sketch V3 增 ...

最新文章

  1. 童心未泯的 YOLO 之父,小马哥 Joseph Redmon 笑傲 CV 江湖记
  2. boost::math::hyperexponential用法的测试程序
  3. e3 v3服务器芯片组,请问e3 1231 v3搭配下面哪款主板性价比最高?最适合?为什么?
  4. 深度学习(batch,mini-batch,其它算法)
  5. 计算机操作员高级工试题一,计算机操作员高级工操作题复习资料
  6. 如何巧妙的使用pandas结合xlsxwriter实现对表格的读写以及插入图片操作
  7. c语言结构体嵌套 初始化,求大神帮忙看看这个结构体嵌套的初始化怎么改
  8. 图像处理YUV的详解
  9. 2021高考成绩特长生查询,2021高考体育生分数怎么算 体育四项评分标准及分值一览表...
  10. VMware ESXi 扩容后提示“无法打开虚拟机的电源,请确认该虚拟磁盘是适用“厚”选项创建的”等信息,执行VMDK 格式是 zeroedthick 还是 eagerzeroedthick
  11. 百度编辑器抓取微信图片并替换内容
  12. 小程序-视图与逻辑-页面导航
  13. 终端I/O termios属性设置 tcsetattr设置
  14. dpkg 删除软件_Ubuntu安装软件卸载软件的几种方法
  15. 在图片上做标签,图片可放大缩小
  16. 开源,阿里内部Spring Cloud Alibaba微服务神仙文档(全彩版)
  17. Python爬取哔哩哔哩(bilibili)视频
  18. python货币兑换_用python计算货币兑换
  19. 华为设备历史200条命令查询方法
  20. 二维码(QR code)原理解析

热门文章

  1. Ant Design中Form组件重置验证条件resetFields()方法
  2. 一张图让你了解五险一金
  3. D3临摹作业_分词与词云可视化(西安交大国家艺术基金数据可视化培训第28天)
  4. python 正则表达式取反_python_正则表达式
  5. JAVA:正则表达式(入门)
  6. Tampermonkey中文文档
  7. 整理了100个Python精选库,建议收藏
  8. 基于retinex理论改进的低照度图像增强算法
  9. 零基础转行学web前端开发好学吗?爱创课堂告诉你
  10. 用Python做一个超简单的小游戏(一听就懂)