Ch4 單元測試 (Unit Tests) | 可測試的 JavaScript (Testable JavaScript)
08 May 2021框架
- 每個測試套件 (test suite) 測試單一模組;每個測試案例 (test case) 只測試模組的一小部份。
- 斷言 (assertion) 用於判斷預期值與實際值的結果,意即判斷哪些測試成功或失敗。
- 好的測試框架,應具備
- 非同步測試 (asynchronous testing)
- 強制失敗 (forced failures)
- 可忽略性測試 (ignorable tests)
- mock 物件
- 測試執行期間丟出事件
- 測試結果可支援多種格式輸出結果
寫出好的測試程式的秘訣
獨立 (Isolation)
- 每次只測試單一方法 (method)
- 避免相依,要鬆散耦合;使用 test double (即 mock、stub) 來抽出相依性。
範疇 (Scope)
測試範疇盡可能的小,最好只測試一個方法 (method)。
定義函式
- 用註解定義規格,意即要測試的目的和結果。
- 因為測試程式一定會更新,否則運作失敗,因此可用測試程式取代註解。
正面測試 (Positive Testing)
- 第一個要寫的測試程式。
- 測試函式正確的案例,意即實際上如何被呼叫、常見的案例之排列組合。
- 例如:
sum (1, 2)
負面測試 (Negative Testing)
- 測試函式傳入不預期值,函式是否可適當處理?
- 例如:
sum (null, 2)
、sum (1, undefined)
補充:寫負面測試的時機
try...catch
的 error case 可在開發中寫這樣的 test case- 產品上線後在不同環境中遇到的狀況,可在上線後再補 test case
程式碼涵蓋率 (Code Coverage)
- 程式碼涵蓋率是表示已執行程式碼行數相對於為執行程式碼行數的量測。
- 程式碼涵蓋率 70-80%,單元測試的效益最大。
現實環境的測試
相依性 (Dependencies)
- 使用 test double (即 mock、stub) 來抽出相依性。
- mock:驗證函式正確的呼叫外部的 API。例如:.toHaveBeenCalledWith、toBeCalledWith
- stub:用來回傳假造值 (canned value) 到被測試的物件。例如:mockFn.mockReturnValue(value)
- double:用於替代相依物件的總稱,可以是 mock 或 stub。
- spy:記錄與捕捉方法被呼叫的資訊。例如:jest.spyOn(object, methodName)
非同步測試 (Asynchronous Testing)
- 單元測試有其限制,建議用整合測試 (integration testing)。
- 使用 Async / Await 寫非同步測試