使用 XCUITest 玩 Cucumber — XCUITest with Cucumberish

Jersey Su
7 min readMay 17, 2018

--

Dan North’s twitter

這是今年 Dan NorthCukenFest 期間發的 Twitter, 很喜歡他這麼簡單的解釋 BDD. 因此, 讓我想到在 BDD 的流程裡面, 有一個很重要的因子: 可執行化的文件 (Executable specifications). 其中包含 High-Level, Low-Level 的可執行化文件. 今天先不探討流程及 Low-Level 的部分. 我們來思考, 有沒有一個可能是在 iOS 的原生的 UI 測試工具上 (XCUITest) 也套用 High-Level 的 BDD 實踐.

BDD in Action. P18.

於是乎, 我把這個問題丟給我的好朋友 谷哥, 問問看它有什麼特別的看法, 大概過了一陣子, 他説: 「試試這個專案吧!」

Cucumberish 簡介

Cucumberish 是一個整合 XCode 的自動化測試工具, 它的靈感來自於 Cucumber 這類支援 Gherkin 語法及可執行化文件的 BDD Framework. 那麼它有什麼有趣的功能呢?

  1. 可以很簡單的用 CocoaPods 安裝. (當然也支援 Carthage 安裝)
  2. 可以在 XCode 裡面執行 BDD 的 Feature 檔, 跟 Gherkin Parser 有很好的整合, 同時也支援 Cucumber 的 Data Tables.
  3. 不需要像 AppiumCalabash 塞一個 Server 在 App 裡面.
  4. 會在 Feature 檔裡面標記失敗的測試.
  5. 同時支援 Objective-C 跟 Swift.

安裝

用 CocoaPods 安裝:

把下列資訊填好 Podfile, 然後使用 pod install 安裝.

use_frameworks!
platform:ios, '11.0'
target 'FoodTrackerUITests' do
pod 'Cucumberish'
end

細節可以參考下列文件:

用 Carthage 安裝:

把下列資訊填好 Cartfile:

github "Ahmed-Ali/Cucumberish"

然後使用下列指令安裝.

carthage update --platform ios

細節可以參考下列文件:

需要注意的是, 文件有點年久失修. 如果使用 Carthage 安裝的話, 有幾點需要注意:

  1. 記得到 Build Phase -> Copy File 填入 Framework 資訊.
  2. 確保 Build Settings -> Frameworks Search Paths 有指到正確的地方.

假設上述安裝及設定的工作告一段落後, 你/妳應該已經有一個 UI Test 的 Targets, 如果你/妳剛好又很熟悉 Cucumber 的架構, 那… 我們就直接來寫個測試範例吧! 接下來將使用 FoodTracker 為範例.

範例

  1. 首先寫一個 Features 檔放在 Features 資料夾下面:

Cucumberish 對於 Scenario / Scenario Outline 支援度還蠻高的, 如果你/妳已經熟悉 Cucumber 這一段的實作, 那麼上述的寫法, 對你/妳來說絕對不陌生.

2. 緊接著開始定義 Step Definition:

Cucumberish 目前支援的 Step Definition 除了 (Given / When / Then) 之外, And / But 都有支援. 如果想要更彈性的話, 也可以使用 MatchAll 來寫成 Step.

3. 接下來設定 Hook:

基本上, before / after / beforeStart / afterFinish 這類的 Hook 都有支援. 更多資訊可以參考這裡.

但… 如果想要單獨執行幾個 Scenarios, 要怎麼做呢? 你/妳必須透過 tags 的方式來執行. 你/妳可以在 includeTags 這個屬性下填上想要執行的 tags, 如: RAT, 就能像 cucumber -t 這個指令一樣了.

Cucumberish.executeFeatures(inDirectory: "Features", from: bundle, includeTags: ["RAT"], excludeTags: nil)

為什麼會這樣呢? 我想應該跟 Framework 本身 Workflow 有關吧, 就等待有緣人來解這個問題了.

4. 除此之外, 你/妳也可以導入 Page Object Pattern 讓測試更好維護. 這邊就不多做闡述了. (細節可以直接看 Sample Project)

5. 當一切都完成之後, 我們就按下 Cmd + U 來執行測試吧!

https://www.quickcompany.in/trademarks/2906253-happy-testing/

Cucumberish 是怎麼動作的?

  1. 當 Cucumberish.executeFeatures 這個 Function 被 Trigger 的時候, XCTestCase Class 會自動去定義剛才你在 Features 資料夾下面寫的 Feature 檔.
  2. 每個在 Feature 檔裡的 Scenario 會被 Cucumberish 的 Gherkin Parser 轉換成 XCTestCase 的 Function. 至於 Gherkin Parser 是怎麼動作. (可以參考 Sample Project 下面這個 Ruby 的範例)
  3. 每個 Scenario 的 Step 會對應到上述定義的 Step Definition.
  4. 最後測試就這麼被執行起來了.

當測試失敗時會發生什麼事?

當測試失敗時, Cucumberish 會標記失敗的 Steps, 並且把錯誤的訊息也一併的顯示在 Feature 檔上面.

Failure Steps

經過這一番努力後, 得到一個結論 :

原生工具整合 Cucumber 還蠻好玩的 , 只是要花比較多的力氣. :D

Sample Project:

https://github.com/jerseysu/xcuitest_cucumberish

--

--

Jersey Su

我是哲西, 熱愛測試 I am Jersey, I love Software Testing!!!