Run Cycle 運行週期
Mocha.js 在執行測試時,會遵循它的運行週期,只要瞭解了它的運行週期,我們便能快速掌握撰寫測試程式碼的基本架構:
- 執行 Mocha 主程式
- 生成並進入子處理程序。
- 處理並執行 Mocha options 選項內容。
- 依序單筆地執行所有 spec 檔案。
- 在 spec 檔案中,依序執行所有的測試套件
describe()
中的 callback function。 - 第一筆測試案例開始前,執行
before()
週期鉤子。 - 在執行每個測試案例前,都各別觸發一次
beforeEach()
週期鉤子。 - 執行測試案例
it()
中的 callback function。 - 在執行每個測試案例後,都各別觸發一次
afterEach()
週期鉤子。 - 最後一筆測試案例結束後,執行
after()
週期鉤子。 - 執行完所有 spec 檔案。
- 結束子處理程序。
而整個週期最重要的概念在於每個 spec 檔案被執行的時候,會觸發測試套件(Test suit)與測試案例(Test case)的 callback function 以及週期鉤子(Hook),而我們最主要的撰寫測試程式碼的邏輯都會集中在個週期內。接下來要來介紹這些 API 大致上在做什麼。
Test suit 測試套件
每個 spec 檔案中可以允許有多個測試套件,可用來劃分每種測試情境。
- describe(‘test suit name’, callback function()):
第一個參數主要用來描述該測試套件中的整體環境,而第二個參數則是用來呼叫測試案例以及週期鉤子。1
2
3describe('App router test',function () {
// 放入 it() 或其他週期鉤子 before()、beforeEach()、after()、afterEach()
})
Test case 測試案例
每個測試套件中可以允許有多個測試案例,可用來釐清該筆案例所測試的內容。
- it(‘test case name’, callback function())
第一個參數主要用來描述該筆測試案例(Test Case)的情境,而第二個參數則是用來呼叫斷言(assertion)的內容。1
2
3it('App router test',function () {
// 放入斷言內容
})
Hook
運行週期裡面最主要的概念在於每個 spec 檔案被執行的時候,會依序觸發的 callback function 與週期鉤子(Hook),接下來來介紹與週期有關的 API:
before()
進入測試套件時便會執行一次,主要用來放入執行測試案例前的測前資料。1
2
3before(function () {
// 測前資料
})beforeEach()
每個測試案例(Test Case)開始前都會執行一次,用來更新每筆測試案例的測前資料。1
2
3beforeEach(function () {
// 更新測前資料
})afterEach()
每個測試案例(Test Case)結束後都會執行一次,用來更新每筆測試案例的結束後的資料。1
2
3afterEach(function () {
// 更新測後資料
})after()
離開測試套件時便會執行一次,用來更新整個測試套件結束後的資料,以避免測試時汙染到原先的資料,影響到下一個測試套件。1
2
3after(function () {
// 測後資料
})
總結
釐清了上述的週期、測試套件、測試案例、與鉤子後,現在我們可以嘗試來寫一個跟週期鉤子有關的測試 spec 檔(建置的部分可參考之前的 Mocha 環境建置 文章)。
sum.js
1 | function sum (a,b) { |
minus.js
1 | function minus (a,b) { |
function.spec.js
1 | // 引入 Mocha 的斷言庫。 |
執行測試後秀出結果:
1 | 函式測試 |
以上便是一個簡單搭配週期鉤子的範例。當然,這比起真正的測試還有段距離,得隨著不斷的練習才能寫出快速有效率的測試程式碼!