前兩天我們討論了 Clean Code 跟 The Clean Coder,這兩本書都要提到一件很重要的事情,但前兩天沒有討論到,就是關於「測試」。
所以我們今天會花一點時間聊聊測試的種類、流程,當然還有最重要的 - 「為什麼要做測試?」
但如你所見,今天已經是 29 天了,我的餘日不多了(笑),所以我們會將焦點放在概念與原因,如果想要偏向實作方面的需求,歡迎到我隊友的系列文 - React 前端工程師的兩把刷子,有足足 30 天陪你度過歡樂測試生活!
要了解測試是什麼,可以先來看看軟體開發生命週期(Software Development Lifecycles),簡稱 SDLC:
其實不一定是五塊,有的會把兩塊合在一起,或者多一個 maintenance,你可以 google
SDLC
看很多不同版本
雖然圖上沒有標示順序,但是起點通常都是 Planning,所以循環的順序會是這樣:
從這張圖你可以得知幾件事:
透過這張圖,你也能更能夠理解公司或專案內其它同事,只要屬於產品開發的,分別都在做什麼事。
扯遠了,今天的主題是測試,它是介於「程式開發之後」與「程式交付之前」的一個步驟。
在這個步驟,最重要的就是要把,程式中會出現 bug 的,或者不符合規格需求的東西抓出來。
所以,今天如果是一個老師,要盡最大善意讓他的學生成績可以合格,所以寫了一個程式,幫所有同學的分數開根號乘以 10 ((佛
如果有學生缺考沒分數,程式會算出錯誤的答案:
程式沒有 crash,但同學你的新成績是 NaN
const students = [
{ name: 'Jack', grade: 25 },
{ name: 'Allen', grade: 49 },
{ name: 'Alice' },
{ name: 'Susan', grade: 81 }
];
const newStudents = students.map(student => {
const newGrade = Math.sqrt(student.grade) * 10;
return { ...student, grade: newGrade };
});
console.log(newStudents);
執行結果
[
{ name: "Jack", grade: 50 },
{ name: "Allen", grade: 70 },
{ name: "Alice", grade: NaN },
{ name: "Susan", grade: 90 }
]
下面這段 code 不會有程式方面的 bug,但是沒有照著規格寫:
佛心到直接幫你調成 60 分!太佛了全部的學生都哭了
const students = [
{ name: 'Jack', grade: 25 },
{ name: 'Allen', grade: 49 },
{ name: 'Alice' },
{ name: 'Susan', grade: 81 }
];
const newStudents = students.map(student => {
const newGrade = 60;
return { ...student, grade: newGrade };
});
console.log(newStudents);
執行結果
[
{ name: "Jack", grade: 60 },
{ name: "Allen", grade: 60 },
{ name: "Alice", grade: 60 },
{ name: "Susan", grade: 60 }
]
也就是說,測試的重點在這兩項:
根據測試的範圍來區分的話,最主要分成三塊,可以用這張「測試金字塔」來表示:
由下而上分別是:
從上面的範圍可以看到,測試其實沒有一個非常清楚的分野,有的是 developer 負責,有的是 QA 負責,甚至也要看公司/專案內人力的調配,也有可能 developer 會包辦 QA 的工作。
對於寫 code 的人來說,最不希望聽到的,就是 QA 走向你的聲音...
但我們自己都知道,在時間有限的情況下,開發出來的程式一定都會有 bug(不然 QA 就失業了),所以才要寫測試,目的就是要確保程式「穩定」。
蛤?穩定?測試不就是要抓錯誤嗎?
是的,正是因為測試可以「很穩定地把某個情境的錯誤抓出來」,所以當我們想要修改程式,提升效能或重構架構時,在不影響商業邏輯的前提下,我們可以透過測試,保障那些已經寫好測試的情境,都能夠正常運作(因為如果不正常就會立刻被抓出來)。
聽起來很讚啊!那為什麼不是大家都在寫測試?
寫測試雖然看起來像是寫 code 之後的事情,但事實上,testing code 應該被視為產品的一部分。
因為當產品本身的商業邏輯,因為客戶要求被改動了,測試的部分也要同步跟上,不然測試舊的 case 就沒意義了。
如果把一個功能寫完要 10 天,那加上測試大約會需要 1.5 ~ 2 倍的時間,也就是這個「產品」需要 15 ~ 20 天才算是完成。
如果站在 PM 的角度,心裡肯定是五味雜陳,因為你很清楚測試是重要的,但居然要花這麼多時間!很容易就會因為時程壓力,選擇放棄測試,或者沒有太多時間測試。
因此這部分也是 trade-off,做為 developer 的角色能做的,除了提升對於測試框架的熟練度,不然就是先針對重點、複雜功能,先寫測試,用 20% 的時間測 80% 的 bug(或者應該說嚴重度 80%)。
測試是對一個產品成熟度的指標,雖然不是說測試寫得多就一定穩,但起碼可以確保主要的功能都有被保護到,經過測試之後再交付出去的程式,更能夠提升客戶對於產品的信任度。
但很可惜的是,目前台灣看到的軟體專案/公司,有滿多地方其實都沒有在寫測試的,一來 PM 有時程壓力,二來 developer 寫測試的熟練度,也還沒有到能夠跟 PM 報告「請給我時間寫測試!」的地步。
所以,如果公司有機會練習,請好好把握!如果沒機會,就創造機會吧!
邊境的沙漠與極地的雪
在熠熠星光的守護下
前行
測試一定要寫好寫滿?時間有限怎麼辦?
Clean Code
The Clean Coder