Calabash 簡介
Calabash 是一個(gè)開源的,能夠使用自然語言描述的測試用例,支持行為驅(qū)動(dòng)開發(fā)(BDD)的跨平臺(tái)自動(dòng)化測試工具,支持 iOS,Android 和 Hybrid 。類似的測試框架還有 Kiwi,Specta,Appium 等。但 Calabash 最讓人眼前一亮的它能夠使用漢語來描述測試用例,這對(duì)中國開發(fā)者來說真是太爽歪歪了。它使用 Ruby 來編寫具體測試用例代碼,用 Cucumber 作為測試核心。
這有什么意義呢?在基于 Scrum 的敏捷開發(fā)管理模式中十分流行使用 Calabash 來做自動(dòng)化測試框架(可持續(xù)交付的一部分),想象一下:產(chǎn)品負(fù)責(zé)人(Product Owner)使用自然語言來編寫用戶故事(相當(dāng)于編寫測試用例),然后開發(fā)團(tuán)隊(duì)(Scrum Team)則根據(jù)用戶故事翻譯成相應(yīng)的 Ruby 測試腳本,最后產(chǎn)品負(fù)責(zé)人根據(jù)用戶故事來驗(yàn)收成果。這對(duì)大多數(shù)移動(dòng)端測試人員來說太爽了,終于可以專注于代碼能力提高而把繁瑣的編寫測試用例甩鍋給產(chǎn)品人員了。(產(chǎn)品經(jīng)理們不會(huì)劃圈圈詛咒我吧,哈哈哈,其實(shí)是移動(dòng)端實(shí)現(xiàn)自動(dòng)化測試的價(jià)值很大)
Calabash-iOS 架構(gòu)
Calabash-iOS 是包含 Ruby 編寫一個(gè) API 庫和用 Objective-C 編寫的一個(gè)服務(wù)框架 calabash.framework。測試框架主要由三部分組成:目標(biāo) App,calabash.framework,Calabash API,Steps 和 feature 文件。該架構(gòu)如下圖:
Calabash 環(huán)境搭建
本文以 iOS 為例,開發(fā)環(huán)境要求:
1、MacOS 10.10 or 以上
2、Xcode 6 or 以上
3、iOS Devices >= 7.1
4、iOS Simulators >= 8.0
5、ruby >= 2.0
安裝步驟:
安裝 Ruby gem
// 安裝 Homebrew
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)”// 安裝 ruby\curl -sSL https://get.rvm.io | bash -s stablervm install 2.3.0// 更新 gemgem update
安裝 calabash-cucumber,calabash-cucumber-ios-cn
brew install calabash-cucumber
brew install calabash-cucumber-ios-cn
配置iOS工程
進(jìn)入工程目錄,執(zhí)行
gem install bundler
bundle update // 安裝需要更新的gems包
calabash-ios setup // 初始化calabash
calabash-ios gen // 生成features目錄
到這步生成一個(gè)新的 features 目錄,如下
features // 特性目錄
|_support
| |_01_launch.rb
| |_dry_run.rb
| |_env.rb
| |_patches
| | |_cucumber.rb
|_steps // 用例腳本定義目錄
| |_sample_steps.rb
|_sample.feature // 用例描述文件TC
編譯測試工程源碼
上一步配置中會(huì)為 iOS 工程添加一個(gè)名為 <app_bundle_name>_cal
的測試 target 。為了能夠讓 Ruby 腳本獲取到各種 UI 控件,我們還需要在代碼中添加一些標(biāo)記,具體做法:把用例涉及到所有 UI 控件都設(shè)置一行代碼,如下:
// 可使用中文,也可使用英文,對(duì)應(yīng)用例描述文件中的自然語言
<控件實(shí)例>.accessibilityLabel = @"輸入用戶名";
在 iOS 中90%的控件都是可以直接設(shè)置 accessibilityLabel 屬性,但是有些控件就沒有,像常見的 UICollectionViewCell 就沒有,這樣就需要自己實(shí)現(xiàn)了,實(shí)現(xiàn)如下:
選中新生成的 target 編譯,運(yùn)行,如果能看到控制臺(tái)輸出如下信息,iOS 工程即配置完畢。
執(zhí)行cucumber
執(zhí)行 cucumber 命令,順利地話我們就完成了整個(gè)環(huán)境的搭建。
更詳細(xì)的信息,參見 https://github.com/calabash/calabash-ios
Calabash 語法
首先學(xué)習(xí)行為驅(qū)動(dòng)(BBD)語法,之前生成的 feature 文件就是 Cucumber 自帶的通過自然語言來編寫的用例文件,也就是最終的測試用例代碼文件,標(biāo)準(zhǔn)格式如下:
steps 目錄中對(duì)應(yīng)的 rb 文件用來定義測試用例的步驟,其實(shí)就是把用例翻譯成 Ruby 腳本的過程,每一個(gè)步驟包含:一個(gè)正則表達(dá)式(匹配 feature 中的文本)和一個(gè) Ruby 代碼塊(執(zhí)行操作)。
常見的匹配關(guān)鍵字如下:
至于 Ruby 語法這里就不詳細(xì)說明,參見官網(wǎng) https://github.com/calabash/calabash-ios/wiki/Calabash-iOS-Ruby-API
還是很抽象,舉個(gè)實(shí)戰(zhàn)例子,customerLogin.feature 和 customerLogin_steps.rb 文件。
注意規(guī)則:
1、文件命名必須用英文,單詞間可用下劃線分隔,也可用駝峰法則;
2、每一個(gè) feature 文件都對(duì)應(yīng)一個(gè) rb 文件,一般命名相同;
3、feature 文件中編寫的每一個(gè)步驟,都需要在 rb 文件中定義
如下圖示:
然后執(zhí)行 cucumber,看看測試結(jié)果
還可以生成測試報(bào)告集成到 Jenkins 中
cucumber –format html –out test-report.html
Calabash 的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
1、Calabash 是 BDD 驅(qū)動(dòng)開發(fā),自然語言的處理屬于人工智能領(lǐng)域(未來很可能發(fā)展成為語音測試,米國某牛逼公司已經(jīng)在嘗試使用 OpenCV 圖像識(shí)別來做 UI 測試,驗(yàn)收標(biāo)準(zhǔn)使用 UI 交互設(shè)計(jì)稿做匹配)
2、Calabash 是測試腳本與用例設(shè)計(jì),在業(yè)務(wù)變化的情況下,只要功能存在基本只需要修改用例,在業(yè)務(wù)不變,功能變化的情況下,基本只需要修改腳本
3、Calabash 免費(fèi)是支持?jǐn)U展的,而且非常容易擴(kuò)展
4、Calabash 開源免費(fèi),由 Xamarin 公司技術(shù)支持,很多敏捷團(tuán)隊(duì)在使用
5、Calabash 運(yùn)行速度快,真機(jī)
缺點(diǎn):
1、測試用例無法斷點(diǎn)調(diào)試
2、需要配置工程,修改相應(yīng)代碼
3、每個(gè)測試用例都需要重啟 APP
對(duì)測試人員的技術(shù)棧要求:
1、能看懂 iOS,Android 代碼,可以給控件設(shè)置屬性。最好全棧,Java,JavaScript 一塊測試
2、會(huì) Ruby 基礎(chǔ),能寫腳本
3、能看的懂錯(cuò)誤,解得了 bug
結(jié)語
測試用例(用戶故事)的編寫是個(gè)逐步修煉完善的過程,僅憑一篇文章很難完全掌握 Calabash 的精髓。?iOS自動(dòng)化測試一直很神秘,很多人都在探索和找尋最強(qiáng)大的那一款自動(dòng)化測試工具,事實(shí)上沒有最強(qiáng)大只有最適合,適合以后使用熟練了自然功能強(qiáng)大了。