作者简介
Liang,携程研发总监,关注工程效能、DevOps、自动化框架等。
一、背景
携程机票从2018年年中正式引入BDD,至今已3年多,成为内部首选的敏捷开发技术。
Flybirds 是一套基于BDD模式的前端UI自动化测试框架,提供了一系列开箱即用的工具和完善的文档,现在逐步稳定,成为机票内部首选的BDD-UI-Testing测试框架。
二、为什么开源
本文将从特性介绍、环境搭建、使用帮助、自定义扩展、持续集成、发版计划这几个方面对框架进行介绍。
三、Flybirds
四、特性
使用Flybirds你能够完成大部分的手机端自动化操作,以下是一些帮助入门的特性描述:
五、环境搭建
5.1 使用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
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”为例:
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 项目结构
6.3 features目录
基础目录结构如下:
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例子:
以下是英文feature例子:
6.5 step语句模板
以下列出了部分模版 | 更多模版查阅
6.6 Hooks
用户可在以下文件中定义hooks:
pscript/dsl/step/hook.py
在每个步骤(step)之前和之后运行
在每个场景(senario)之前和之后运行
在每个功能文件(feature)之前和之后运行
在用给定名称标记(tag)的部分之前和之后运行
在所有执行之前和之后运行
6.7 标签(Tags)
可以使用tag标记不同的场景,方便有选择性的运行。
下面是一个例子:
运行有特定tag的场景,多个用逗号隔开:
flybirds run -T tag1,tag2
‘-’开头表示运行不包含某tag的场景:
flybirds run -T -tag
七、运行前检查
7.1 请确保配置的测试设备能够正常连接
7.2 下载安装测试包
a. 请手动下载演示APP进行安装:下载地址
b. 开启wdaproxy:shell tidevice --udid
$udid wdaproxy -B $web_driver_angnt_bundle_id -p $port
八、运行参数
在终端输入以下内容来查看flybirds运行项目时支持的操作
flybirds run --help
执行features目录下所有的feature文件
指定需要执行的feature集合,可以是目录,也可以指定到具体feature文件,默认是 ‘features’ 目录.
示例:
flybirds run -P ./features/test/demo.feature
运行有特定tag的场景,多个用逗号隔开,‘-’开头表示不运行包含此tag的场景
flybirds run -T tag1,tag2,-tag3,tag4
指定生成测试结果的格式,默认是 json.
示例:
#默认
flybirds run --format=json
九、配置参数
提供了丰富的配置项 | 帮助文档
必须配置项:deviceId packageName。
连接iOS设备时,需要额外配置webDriverAgent、platform。
十、报告(report)
报告包含汇总Summary和功能 (feature) 、场景 (senario) 的执行结果,对于失败的场景 (senario),报告中会展示当时的屏幕图像和视频,下面是一个例子。
十一、自定义step语句模板
在编写Feature的过程中,可能会遇到提供的公共语句不能满足自身项目的需求,需要自定义语句。比如:需要对接某个内部工具API,此时需要用到自定义语句功能。
自定义语句功能会用到python,如果你不了解这门编程语言,也不必要太担心,因为只会使用到最基础的python语法,这并不会太难。
使用方法
示例代码如下:
对于团队内部通用的自定义功能,可以考虑创建一个extend package,flybirds支持动态加载,package命名包含“-flybirds-plugin”即可。
十二、自定义框架扩展
理论上BDD-UI-Testing 可以适用在所有端,比如:APP、Web、小程序。
框架的插件式设计模式,保留了良好的扩展,当前版本只开放了APP端支持,未来会逐步开放更多,下面是两个例子供大家参考。
增加web端扩展
修改当前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。
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