Cucumber 的 Gherkin 語法本身並不複雜,然而除了步驟定義(Step Definition)之外,我們還可以加入輔助方法、標籤等等設定,讓我們的測試案例更加容易維護。
標籤
標籤功能在 Cucumber 中預設會用來標記「處理中(Work In Progress)」的功能,這樣就可以避免還沒實作的功能因為已經撰寫好文件,而破壞持續整合(Continuous Integration)的運作,而中斷整個開發流程。
1@wip
2Feature: 按讚功能
3 @wip
4 Scenario: 單次點選可以增加一個讚
標籤可以針對 Feature
或者 Scenario
來做標記,如果是部分完成的功能可以針對還沒實現的場景標記就可以確保已經實作的功能被測試。
除此之外,我們也可以針對這些標籤進行特定的操作,像是「切換功能開關(Feature Flag)」之類的處置。
1@pre-release
2Feature: 按讚功能
接下來只需要在 features/support/env.rb
或者 features/support/env.js
裡面,利用掛鉤(Hook),描述這個標籤要做的事情。
1Before('@pre-release') do
2 # 啟用功能
3end
1const { Before } = require('@cucumber/cucumber')
2
3Before({ tags: '@pre-release' }, async () => {
4 // 啟用功能
5})
這樣我們就可以針對尚未釋出的新功能也進行測試,而不用擔心被使用者實際使用到這些功能。
輔助方法
在步驟定義的時候,我們可能經常要建立使用者,或者產生一些測試資料。然而當類似的步驟增加時,我們會有許多的重複實現,假設這些行為都是類似的,我們可以透過輔助法(Helper)來彙整這些重複的動作。
1module UserTestHelpers
2 def create_user(name:)
3 # ...
4 end
5end
6
7World(UserTestHelpers)
在 Ruby 的環境中,我們像這樣定義一個模組,就會被加入到 Cucumber 運行的測試環境中,然而在 JavaScript 的環境中,要加入輔助方法比較複雜一些,會需要使用自訂世界(Custom World)的機制,也算是受限於語言特性。
正因如此 Ruby 會使用
World
這個語法去擴充原有世界。
世界
在 Cucumber 的觀點下,測試是在一個世界中運作的,因此我們實際上描述的是一個世界發生的事件與產生的變化。在這樣的前提下,我們在前面步驟做的所有改變,都能在後續的步驟存取到。
1Given('開始計數') do
2 @count = 1
3end
4
5When('增加計數') do
6 @count += 1
7end
1When('增加計數', async function (this: World, user: string text: string) {
2 this.count += 1
3})
那麼,當我們想加入新的輔助方法或者全域狀態時,在 JavaScript 的環境就需要自訂一個世界,對這些資訊進行描述。
1const { setWorldConstructor, World, When } = require('@cucumber/cucumber')
2
3class CustomWorld extends World {
4 count = 0
5
6 constructor(options) {
7 super(options)
8 }
9
10 createUser(name: string) {
11 // ...
12 }
13}
14
15setWorldConstructor(CustomWorld)
像這樣子,我們就能夠讓 Cucumber 意識到 this.count
的存在,以及可以使用 this.creaetUser()
來進行一些處理。
這些會是我們在使用 Cucumber 撰寫測試會使用到的常見語法,接下來我們就會實際的以開發簡單的小功能來實際感受用 Cucumber 來撰寫文件並且同步進行測試的效果如何。
如果對這篇文章有興趣,可以透過以下連結繼續閱讀這系列的其他文章。
- 同時完成測試與文件 - Cucumber 的文件測試法
- 基本語法:功能描述 - Cucumber 的文件測試法
- 基本語法:驗證行為 - Cucumber 的文件測試法
- 基本語法:步驟定義 - Cucumber 的文件測試法
- 基本語法:輔助設定 - Cucumber 的文件測試法
- 前端環境:Vite 與 Cucumber - Cucumber 的文件測試法
- 商品列表與加入購物車 - Cucumber 的文件測試法
- 重構與移出購物車 - Cucumber 的文件測試法
- 商品資料與總價 - Cucumber 的文件測試法
- 結帳與結果 - Cucumber 的文件測試法
- 整理前端實作 - Cucumber 的文件測試法
- 初始化後端專案 - Cucumber 的文件測試法
- 商品資料 API - Cucumber 的文件測試法
- 更新購物車 API - Cucumber 的文件測試法
- 加入資料模型 - Cucumber 的文件測試法
- 持久化保存 - Cucumber 的文件測試法
- 結帳處理 - Cucumber 的文件測試法
- 在 Rails 的前後端分離 - Cucumber 的文件測試法
- 匯入前端實作 - Cucumber 的文件測試法
- 重現後端實作 - Cucumber 的文件測試法
- 累積價值 - Cucumber 的文件測試法