携程机票从 2018 年年中正式引入 BDD ,至今已 3 年多,成为内部首选的敏捷开发技术。
Flybirds 是一套基于 BDD 模式的前端 UI 自动化测试框架,提供了一系列开箱即用的工具和完善的文档,现在逐步稳定,成为机票内部首选的 BDD-UI-Testing 测试框架。
本文将从特性介绍、环境搭建、使用帮助、自定义扩展、持续集成、发版计划这几个方面对框架进行介绍。
使用Flybirds你能够完成大部分的手机端自动化操作,以下是一些帮助入门的特性描述:
pip
安装 flybirds 框架,过程中会自动安装所需的 依赖包pip3 install flybirds
在 Mac/Linux 系统下,需要手动赋予 adb 可执行权限
cd {your_python_path}/site-packages/airtest/core/android/static/adb/mac
chmod +x adb
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”为例
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
=====================================================================================
接下来,了解下更多项目细节
基础目录结构如下
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 文件包含用户动作,行为特征描述及预期结果的文本,行为特征部分使用 Gherkin 语言编写。
feature 文件,也称为功能文件,有两个目的:文档和自动化测试。
以关键字开头(“功能”、“场景”、“场景大纲”、“当”、“而且”、“那么”……), 文件中的任何位置都允许使用注释行。
功能(Feature) 是被测试功能的一些合理的描述性标题,由场景组成。他们可以选择有一个描述、一个背景和一组标签。
背景(Background) 由一系列类似于场景的步骤组成。它允许您向功能的场景添加一些上下文。在此功能的每个场景之前执行。
场景(Senario) 标题应该是被测试场景的合理描述性标题,由一系列给定条件的步骤组成
场景大纲(Senario Outline) 包含功能的详细描述,可以有一组预期条件和结果来配合您的场景步骤
以下是中文 feature 例子
以下是英文 feature 例子
以下列出了部分模版 | 更多模版查阅
语句模板 | 语义 |
---|---|
跳转到 [] | 跳转到指定的 url 地址 |
等待 [] 秒 | 等待一段时间 |
页面渲染完成出现元素 [] | 进入新的页面时检查指定元素是否渲染完成 |
点击 [] | 点击指定属性的元素 |
在 [] 中输入 [] | 在指定选择器中输入字符串 |
向 [] 查找 [] 的元素 | 向指定方向查找指定属性的元素 |
全屏向 [] 滑动 [] | 全屏向指定方向滑动指定距离 |
存在 [] 的文案 | 检查页面中存在指定的字符串 |
存在 [] 的元素 | 检查页面中存在指定属性的元素 |
元素 [] 消失 | 检查页面中指定属性的元素在指定时间内消失 |
全屏截图 | 保存当前屏幕图像 |
开始录屏 | 开始录制视频 |
结束录屏 | 结束录制视频 |
安装 APP [] | 安装 APP |
启动 APP [] | 启动 APP |
----- | ----- |
用户可在以下文件中定义 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)
在所有执行之前和之后运行
可以使用 tag 标记不同的场景,方便有选择性的运行。
下面是一个例子
运行有特定 tag 的场景,多个用逗号隔开
flybirds run -T tag1,tag2
‘-’开头表示运行不包含某 tag 的场景
flybirds run -T -tag
请确保配置的测试设备能够正常连接
adb devices
, 检查设备列表中是否包含测试设备tidevice
库举例,执行命令 tidevice list
,检查设备列表中是否包含测试设备 下载安装测试包
在终端输入以下内容来查看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 。
报告包含汇总 Summary 和功能(feature)、场景(senario)的执行结果,对于失败的场景(senario),报告中会展示当时的屏幕图像和视频, 下面是一个例子。
在编写 Feature 的过程中,可能会遇到提供的公共语句不能满足自身项目的需求,需要自定义语句。比如:需要对接某个内部工具 API ,此时需要用到自定义语句功能。
自定义语句功能会用到 python ,如果你不了解这门编程语言,也不必要太担心,因为只会使用到最基础的 python 语法,这并不会太难。
使用方法
示例代码如下
对于团队内部通用的自定义功能,可以考虑创建一个 extend package ,flybirds 支持动态加载,package 命名包含“-flybirds-plugin”即可。
理论上 BDD-UI-Testing 可以适用在所有端,比如:APP 、Web 、小程序。
框架的插件式设计模式,保留了良好的扩展,当前版本只开放了 APP 端支持,未来会逐步开放更多,下面是两个例子供大家参考。
增加 web 端扩展
plugins.default
下添加自己的 web 包 page.py,element.py
,如果需要增加其他的插件实现类,只需要在GlobalContext
类中添加对应的名称。plugin.event
下添加自己的 web 包。event.web
包下重写或者新增类,比如重写run
事件可以在plugin.event.web
下面添加"run.py",具体实现逻辑可参照已有的run.py
。device_info.platform
值为"web"。修改当前 APP 端扩展
ios.app
进行修改: "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
贡献
git checkout -b my-new-feature
)git commit -am 'Add some feature'
)git push origin my-new-feature
)欢迎在 GitHub issues 区提问
支持邮箱:[email protected]
补充一下环境要求
nodejs只在最终Html报告生成时使用,python3.10暂不支持。
1
cmxpapa OP flybirds v0.2 版本发布: https://github.com/ctripcorp/flybirds/releases/edit/v0.2
新增了 web BDD UI 测试支持,欢迎试用 1. Web 语法与 APP 端保持一致 2. 支持无头、有头浏览器模式 3. 支持多种浏览器内核:chrome 、firefox 、webkit 4. 支持并发执行模式 |