序
進入公司後已有一段時間,交手過林林總總的專案,除了新專案的開發之外,免不了會碰到既有服務的維護需求。而這些服務當中,年紀輕則有三、四年歷史,更不用提那些年邁的部分了;這些程式碼本身是沒什麼問題,但剛進入公司的我年少輕狂,天真的以為改動程式碼是件簡單的事情,結果一不小心就落入「依賴」的陷阱之中。
過了一年後,我雖然從依賴的泥沼中(?)爬了出來,但回想身在其中時的過程難免感嘆,一邊思考要怎麼樣才能主動防止這種事情發生呢?與此同時,我正好專注於如何整潔(clean)程式碼、重構(refactor)等等心法與技術的應用,因此迫切的需要一樣東西來保證更動的地方沒有出錯,碰巧從相關的資訊文章中看到了「測試」這個詞彙,稍微搜尋了一下,令人嘆為觀止,剛好它填補了我需要的一切。
因此,我迫不及待地踏上了研究測試的道路,深刻的記得當時我最早是看到了保哥分享不同測試之間差異的文章,慢慢瞭解到原來測試還能面向不同的需要,近而拆分成不同的測試類型,甚至根據測試類型搭配的工具也可能有所不同。
然而,研究的過程不如我一開始所想的那樣簡單,我慢慢地陷入了另一個「泥沼」——關鍵字地獄。「斷言是什麼玩意⋯⋯?」、「Dummy Object 又是什麼⋯⋯?」,為了搞清楚這些東西只好一步一步嗑文章與書籍。從單元測試中會玩到的 Mocha + chai + sinon 或 Jest,甚至透過 Cypress 進行端對端測試與視覺回歸測試,然後又遇到不同設備導致快照上出現差異等等想都沒想過的問題⋯⋯。
而這篇系列文的誕生,主要是希望能幫助到那些也想瞭解測試的讀者,透過文章的引導,有脈絡的從單元測試開始學習,並快速瞭解不同的測試工具各自的用途,提供一個魚竿後續再依照自己的需求去改造它;次要的部分則是藉由系列文重新梳理一下目前研究測試的成果,轉化既有的知識為可保存可閱讀的文字;最後則是想與已經在寫測試的開發者們交流心得。