攜程機票 BDD UI Testing 框架 - Flybirds
作者簡介
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,檢查設備列表中是否包含測試設備
-
請先安裝手機對應品牌的官方驅動,確保能使用電腦對手機進行 USB 調試
-
確保已經打開了手機中的 "開發者選項",並且打開 "開發者選項" 內的 "允許 USB 調試"
-
部分手機需要打開 "允許模擬位置"、"允許通過 USB 安裝應用"
-
關閉電腦上已經安裝的手機助手軟件,能避免絕大多數問題,請務必在任務管理器中手工結束手機助手進程
-
請先準備一臺 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 地址:
-
PyPI 地址:
-
貢獻
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
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/YEJ920vswzvVgLFCyt0K2Q