[Unit Test] 1.4 - 如何做好測試? - 可維護篇
前言
關於可維護性的部分,雖然在 AOUT(Art of Unit Testing) 中提到非常多點,但我覺得最受用的一點就是:
避免測試中帶著邏輯 (avoid any logic in your tests)
這裡說的邏輯 是指實現結果的產品程式碼邏輯,而非常多業界權威也都提倡這點,像是
- 單元測試的藝術 - Section 8.12 避免測試中帶著邏輯
- Software engineering at Google - Ch 12 - Don't Put Logic in Tests
- React Testing Library Author - Kent C Dodds - Why I Never Use Shallow Rendering
如果我們利用邏輯去做測試,就會發生:
- ❌ 測試很脆弱 (brittle),重構 (refactor) 就會使其壞掉
- ❌ 無法給予我們信心,因為跟使用者行為沒有太大關係
- ❌ 不夠直接,難以閱讀
以下我會提供一些案例,就會有上述的問題,並且會提到如何改善
情境一:不要用邏輯運算產出動態結果,使用靜態結果
❌ 在期望結果中使用運算邏輯,使預期結果動態產生
describe('helloFunction', () => {
test('by default, should return user name and greeting words', () => {
const user = 'USER';
const greeting = 'GREETING';
const sentence = helloFunction(user, greeting);
expect(sentence).toBe(user + greeting);
});
});
儘管使用的邏輯簡單,但是還是有帶著邏輯,就是 + 的部分,,這個測試很可能重複了產品程式碼的邏輯,也可能包含這個邏輯中的 bug
(而且此產品程式碼邏輯和測試程式碼邏輯可能都是由同一個人撰寫,導致對該需求有同樣的錯誤觀念)
例如,預期結果少了一個空格,產品程式碼也少回傳一個空格,測試卻通過了