前言
作為這個系列的第一篇,先介紹一下大綱:
- 《Run Calabash》簡單介紹Calabash環境搭建及基本執行,然你給對Calabash有一個基礎認識
- 《Calabash用法詳解》認識Calabash後介紹Calabash的基礎用法,從而可以快速上手
- 《Calabash進階》介紹一些特殊或不常用到的技巧,對Calabash有更深的認識
- 《Calabash踩坑》為不影響文章閱讀的連貫性,相關異常解決的內容單列一章
看了一些Calabash入門的文章,便準備開始實踐。但在最開始時,真的好氣啊。 從來沒人告訴我Mac安裝Calabash需要xcode支援! 大部分的入門demo止步於一個簡單的case,從來沒人告訴我後續的case需要怎麼繼續執行!!! 一條怎麼看怎麼沒毛病的語句,怎麼就無腦報錯呢? ...
其實這些都是開發中的一些意外情況,但就是這些意外情況,讓好多人就此止步了。其實如果耐心一點,在官方文件深挖一下,把十幾篇幾十篇部落格參照著一起看,再或者辛苦一點,多多試錯,這些坑其實都能踩平。 但是這種方法代價太大了,作為一個教程部落格,我想把我從最開始一直到最後經歷所有,以初學者的角度記下來,讓後來者可以更輕鬆一點。
OK,下面我們就從零Run起來!
Calabash環境搭建
(之後環境搭建及使用均為Mac環境下,且基於Calabash-Android)
環境及依賴配置
這一部分有大量的入門文章進行了詳細的講解,這裡就不在重複敘述了,我們直接引用官方說明:
You need to have Ruby installed. Verify your installation by running ruby -v in a terminal - it should print “ruby 2.0.0” (or higher). We recommend using a managed version of Ruby like rbenv or rvm. If you are on Windows you can get Ruby from RubyInstaller.org You’ll also need to have the Java Development Kit (JDK) installed and available. Calabash will attempt to automatically find this from registry keys on windows, or monodroid config elsewhere, but you can also specify it explicitly by setting the JAVA_HOME environment variable to its location (e.g. C:\Program Files\Java\jdk1.8.0_20), or having the JDK binaries themselves (i.e. C:\Program Files\Java\jdk1.8.0_20\bin) in your path. You should have the Android SDK installed. You can download it from here. Create an environment variable with the name : ANDROID_HOME and its value pointing to the location of the unzipped downloaded SDK. To compile Calabash-Android from source, you will also need to have Ant installed and added to your path. It can be downloaded from here.
簡單來說,就是首先你需要保證你的電腦安裝了Ruby,這個大部分Mac電腦都已經安裝,可以在終端中使用命令ruby -v
檢查是否已成功安裝。
然後你還需要保證電腦中安裝了JDK,並且配置好java環境變數。 再然後你需要保證電腦中安裝了Android SDK和 Ant,並且成功配置了環境變數。
如此,依照官網所說,你的Calabash的環境依賴配置基本已經完成。 (關於Ruby安裝、JDK SDK ANT的安裝及環境變數配置,網上有很多資料哦~)
Calabash安裝
依照官網步驟安裝Calabash可能稍有繁瑣,這裡我們直接使用一行命令搞定:
執行命令:
sudo gem install calabash-android
複製程式碼
然後按照提示,輸入開機密碼即可。
如果你的網路沒有翻牆,且出現很長時間都安裝不了,參照別的部落格給出的提示,可以切換到淘寶源,在終端下執行如下的三句命令即可:
gem sources --remove https://rubygems.org/
gem sources -a http://ruby.taobao.org/
gem sources -l
複製程式碼
然後重新執行命令:
sudo gem install calabash-android
複製程式碼
就此,如無意外,Calabash安裝成功。也有可能你遇到了我曾遇到的問題: 坑1:Calabash安裝時Ruby報錯(因為這次分享的特殊性,超鏈無法使用,關於踩坑內容在第四篇文章)
建立Cucumber專案結構
Calabash安裝成功後,使用終端切換到你準備寫測試case的目錄執行命令:
calabash-android gen
複製程式碼
執行成功後,將會在該目錄下生成如下檔案:
features
|_support
| |_app_installation_hooks.rb
| |_app_life_cycle_hooks.rb
| |_env.rb
| |_hooks.rb
|_step_definitions
| |_calabash_steps.rb
|_my_first.feature
複製程式碼
features主資料夾
features 是主資料夾,一般情況,你的自動化指令碼執行,都是在這個資料夾下編寫操作的了。
.feature檔案
my_first.feature 是預設生成的第一個測試指令碼檔案。通常每一個.feature檔案中只能寫一個Feature,所以每一個Feature檔案都是一個測試用例集,在不指定具體的.feature資料夾的情況下,Calabash會按照隨機順序執行所有.feature檔案。(.feature檔案並不是必須在features根目錄下,為了便於管理,你可以在根目錄下隨意建立資料夾存放.feature檔案,Calabash會自動進行查詢並執行)
step_definitions資料夾
step_definitions資料夾裡存放著自定義的step,之前我們看到的大白話,就是在這裡定義的,裡面已經有一個預設生成的calabash_steps.rb 檔案,它引用了Calabash預定義的Steps,以讓我們直接使用:
require 'calabash-android/calabash_steps'
複製程式碼
我們也可以在這個資料夾下建立自己的.rb檔案來自定義steps。這是後續我們會深入講解的一個部分。App自動化測試探索3-Calabash語法及策略詳解
support資料夾
support資料夾存放著一些依賴檔案 先看env.rb:
require 'calabash-android/cucumber'
複製程式碼
所以為什麼說cucumber是Calabash的核心呢~ Cucumber-github 上一篇我們看的指令碼的幾個關鍵字:Feature,Scenario,When,Then,在Calabash的官方文件並沒有對他們著重進行介紹,因為它們其實是屬於cucumber的部分,Calabash的資料稀少,所以很多資料我們需要去看cucumber。不過沒關係,一些基礎的,必然會用到的內容後續部落格會講到。
app_installation_hooks.rb 和 app_life_cycle_hooks.rb 兩個檔案所起到的作用分別是 對app安裝hooks,和對app生命週期進行hooks。簡單來說就是在app安裝過程中和生命週期過程中的某些階段做些什麼事情。
所以到這裡你也發現了,Calabash其實是一個很輕量級,透明的框架,這些檔案你完全可以自己進行修改,新增自己想要的操作。
還有一個hooks.rb檔案: 這是一個空檔案,你可以在這裡新增自己想要的hooks操作,我們在下一章會簡單介紹一下。
上面說了很多可以自定義的資料夾,所有以.rb為檔案字尾的檔案,使用的語言都是Ruby,對Ruby陌生沒關係,Ruby其實很簡單的,這裡安利一個Ruby教程。
執行你的第一個自動化測試用例
環境配置結束,檔案結構也介紹完了。按照我一直以來的習慣,不管三七二十一,我們先把demo跑起來,中間細節通通忽略,先看看是怎麼回事,有了成就感我們再逐步深入!
修改my_first.feature
Feature: Welcome feature
Scenario: 歡迎頁面測試用例
#左劃
Then I drag from 90:50 to 20:50 moving with 20 steps
Then I drag from 90:50 to 20:50 moving with 20 steps
Then I drag from 90:50 to 20:50 moving with 20 steps
Then I wait for 5 seconds
Then I take a screenshot
複製程式碼
(這裡我已蜂鳥眾包App為例進行測試,你也可以選擇從應用市場下載蜂鳥眾包進行同步測試,或修改指令碼在自己的app進行測試,反正指令碼很簡單的啦)
簡單解釋一下 第一行Feature 表示功能測試的名稱 第二行Scenario 表示應用場景 內容完全是給人看,所以寫什麼都無所謂,但這兩個關鍵字可不簡單,它們是你搭建自動化測試功能的重要策略。當然我們先賣個關子繼續往後看。
第三到第五行 從座標90:50 移動到座標 20:50,做左劃操作,20表示拖動速度,翻過三個頁面後等待5秒然後截圖。
執行命令
calabash-android run test.apk
複製程式碼
按照正常情況應用程式會安裝到手機上或虛擬機器上,啟動並執行指令碼命令。但你也可能會遇到問題:坑2:Could not find an Android SDK please make it is install 坑3:App did not start 或 WARN:Did not find 'android.jar'... 坑4:**.apk is not signed with any of the available keystores
最終截圖圖片儲存在當前目錄下,也可以自定義儲存目錄,這個我們後面的文章會講到。
指令碼執行過程中控制檯會輸出如下內容和結果:
Crowdsource-android git:(feature/testing) ✗ calabash-android run debug.apk
Feature: Welcome feature
Scenario: 歡迎頁面測試用例
#左劃
Then I drag from 90:50 to 20:50 moving with 20 steps
Then I drag from 90:50 to 20:50 moving with 20 steps
Then I drag from 90:50 to 20:50 moving with 20 steps
Then I wait for 5 seconds
Then I take a screenshot
1 scenario (1 passed)
5 steps (5 passed)
複製程式碼
每執行一個Step就會在控制檯上輸出,包括註釋內容,所以這裡你完全可以在指令碼中新增一些說明性的註釋或在自定義的Steps中使用ruby輸出語句來增強提示。這些後面我們也會詳細講。
上一篇文章我們也提到過Calabash支援三種不同程度的自定義Steps,按照實際的業務需求,自定義一些更簡潔的更符合自然語言的Steps。 比如,我們使用ruby重新自定義一個Step,將上面三個左劃操作集合成一句命令:在step_definitions資料夾中建立一個drag_steps.rb檔案,分別修改drag_steps.rb檔案和my_first.feature檔案:
drag_steps.rb:
Then /^I through welcomePages$/ do
perform_action('drag', 90, 20, 50, 50, 20)
perform_action('drag', 90, 20, 50, 50, 20)
perform_action('drag', 90, 20, 50, 50, 20)
end
複製程式碼
my_first.feature:
Feature: Welcome feature
Scenario: 歡迎頁面測試用例
Then I through welcomePages
Then I wait for 5 seconds
Then I take a screenshot
複製程式碼
這就是自定義setp,但是!當然,這只是Demo,我們為了方便這樣去寫,在實際開發中,這個Steps開發應該更規範嚴謹,我們會在下一章詳細對這個問題進行說明。
總結
總結下來,Calabash真的是一個非常輕量級,且指令碼維護成本很低的一個自動化測試框架。後面幾章我們將從以下幾個方面對Calabash深入:
- Feature、Scenario等關鍵字使用策略。
- Calabash預定義Steps的使用。
- 自定義Steps
- 使用Ruby語法編寫帶邏輯判斷的Steps。
- 自定義Steps的使用策略。
- Ruby Query的使用。
- view定位技巧。
進階
- 在自定義的Steps中使用Query語句。
- 自定義Steps支援環境變數擴充套件。
- Hooks。
- Calabash原始碼修改與擴充套件。
恩,這麼看下來,是不感覺Calabash雖然很輕量,但還是很強大的吧?
《Calabash探索1-Run Calabash》