對功能描述之後,我們需要將詳細的步驟寫下來,讓 Cucumber 知道該怎麼做來檢查這個功能是否符合預期,因此我們可以使用 Given、When、Then 來進行描述。
Given
Given 的用途是用來提供背景資訊,通常就是建立假資料的處理,讓我們可以繼續後續的處理。
1Feature: 喜歡文章
2 Scenario: 當 John 第一次點選「測試好棒」喜歡按鈕時時,喜歡次數增加
3 Given 這裡有一篇文章 "測試好棒"
4 # ...
如果要建立多筆資料 Cucumber 提供了 Table(表格)的機制,可以改寫為這樣的描述。
1Feature: 喜歡文章
2 Scenario: 當 John 第一次點選「測試好棒」喜歡按鈕時時,喜歡次數增加
3 Given 這裡有幾篇文章
4 | title | author |
5 | 測試好棒 | 蒼時 |
6 | 好用密技 | 蒼時 |
7 # ...
可以根據需求提供單數或者複數的描述,為了確保背景資訊是完善被提供的,盡可能的把完整資訊寫下來會有更好的效果。
When
When 用來指定進行的動作,也就是這個測試的行為,但不一定是只限一個,我們可以有複數的操作來進行動作的對應。
1Feature: 喜歡文章
2 Background:
3 When John 打開文章列表
4
5 Scenario: 當 John 第一次點選「測試好棒」喜歡按鈕時時,喜歡次數增加
6 Given 有一個作者叫做 "蒼時"
7 And 這裡有幾篇文章
8 | title | author |
9 | 測試好棒 | 蒼時 |
10 | 好用密技 | 蒼時 |
11 When John 點選 "測試好棒"
12 And John 點選 "喜歡"
13 # ...
以上面的 Cucumber 測試當作範例,我們可以看到 John 會先點選「測試好棒」這篇文章,並且再去點選「喜歡」完成我們預期的動作,他會是複數的操作來完成,這樣也更能清楚的說明完整的使用者操作。
在 Gherkin 的語法裡面,如果跟前一個動作是相同的類型,可以用 And 來連接,而不需要寫兩次 Given 或者 When 會更接近人類閱讀的習慣。
假設所有操作都是以文章列表為起點,我們還可以在背景資訊預先放好一些 When 的動作
Then
Then 是用來進行斷言(Assertion)的方法,跟大多數測試框架一樣,可以在一個測試中做多次斷言,也可以只使用一個,我們也可以在需要多次斷言時使用 And 來連接。
1Feature: 喜歡文章
2 Background:
3 When John 打開文章列表
4
5 Scenario: 當 John 第一次點選「測試好棒」喜歡按鈕時時,喜歡次數增加
6 Given 有一個作者叫做 "蒼時"
7 And 這裡有幾篇文章
8 | title | author | like_count |
9 | 測試好棒 | 蒼時 | 0 |
10 | 好用密技 | 蒼時 | 0 |
11 When John 點選 "測試好棒"
12 And John 點選 "喜歡"
13 Then John 會看到 "感謝你的支持"
14 And John 會看到喜歡統計變成 1
在 Cucumber 的測試中,因為不太會有執行兩次比較前後差異的情境,因此在撰寫 Then 類型的斷言時,比起用「增加 1」我會使用更明確的「變成 1」來描述,如果想要表現出每次點選都是增加 1 的意圖,我們可以用多個測試案例來呈現這樣的意圖。
目前我們有了完整的測試,然而還是無法運行的,現階段我們會先熟悉 Gherikn 相關的語法後,再針對 Ruby 和 TypeScript 是如何將這些句子轉換成真實的行為進行說明。
如果對這篇文章有興趣,可以透過以下連結繼續閱讀這系列的其他文章。
- 同時完成測試與文件 - 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 的文件測試法