測試二三事|還記得你說,要和我寫測試

更新 發佈閱讀 7 分鐘
raw-image

A. 前言

過去在程式導師實驗課程中,整理過這兩篇筆記探討「測試」是怎麼回事:

在轉職後的第一家公司,組內曾嘗試在既有專案中撰寫測試,卻因時程緊湊而不了了之。但或許是一聽到測試就浮現「好麻煩⋯⋯」的想法吧?與其花這個時間去寫程式來進行測試,還不如多修幾個 BUG 來得有效益,打從心底想逃避這件事情,只覺得測試是理想,讓這項 TODO 一直被延宕。

而在求職過程中,時常被問是否有過測試經驗;到了現在第二間公司,寫測試這議題又再次浮現。回想起過去在專案中,時不時發生「改 A 壞 B」 的情況,如果透過測試來事先預期結果,或許就能減少這類錯誤的發生。

於是乎,這篇文章就誕生了ಠ_ಠ

在實作過程中,試著統整過去所學並且記錄下來,文章大致會分成四個段落,在正式介紹 Cypress 這套測試框架之前,會先在上篇補充測試相關的知識:

  • Why we need test?
  • What is Testing?
  • Why Cypress?
  • How to start?

那麼就開始吧!

B. Why we need test?

所以說,為何我們需要測試?

誠如前言提到,透過測試我們能夠先預期結果,找出非預期的錯誤情境。在轉體開發過程中,隨著需求日漸複雜化,多人協作開發不易維護,再加上時程壓力,若沒有制定流程規範,實在很難透過手動測試一次到位。

讓自動化測試取代人工測試,除了能降低成本,也有助於快速驗證程式是否能正常運作,並透過測試報告找出問題所在,不至於在茫茫程式海中迷失方向。

總歸而言,測試能夠確保程式碼的可靠性,避免人為錯誤,提升程式碼的質量、重用性與可維護性。

C. What is Testing?

說了這麼多,到底怎樣才是測試呢?

從我們最熟悉的人工測試,到寫程式來測試程式,其實都是基於同樣的道理:「測試是藉由程式來模擬現實,比較『預期結果』和『實際結果』是否相同的過程」。

C-1. 自動化測試金字塔 Test Automation Pyramid

簡單來說,測試依規模大致可分成三個層次,構成自動化測試金字塔,如下圖所示:

raw-image

在測試金字塔中,越靠上方所耗費成本越高、執行時間越長;反之,越靠底下所耗費成本低,執行時間越短。

而依照測試方法不同,又可分為黑箱測試與白箱測試:

# 黑箱測試(Black-box Testing)/ 功能測試

  • 以使用者的角度,針對程式的功能面進行測試
  • 應用於整合測試和系統測試
  • 舉例:在表格欄位輸入錯誤的資料格式,檢測系統是否存在漏洞

# 白箱測試(White-box Testing)/ 結構測試

  • 以程式語言的角度,測試內部結構或流程
  • 應用於單元測試
  • 舉例:使用訂單系統,依使用者的情境模擬操作
raw-image

C-2. 單元測試 Unit Testing

  • 以程式碼的最小單位(function、method 等)進行測試,也是自動測試化的基礎
  • 驗證單一行為、執行快速、具獨立性
  • 常用套件:Jestmochajs & chai
  • 常見開發模式:TDD & BDD

這裡介紹兩種與單元測試(Unit Test)相關的開發流程:

# TDD(Test-Deriven Development)測試驅動開發

  • 先寫測試,後實作功能
  • 專注功能的實現
  • 開發流程會在「單元測試 ⇒ 撰寫能通過測試的程式碼 ⇒ 重構」三者之間循環

# BDD (Behavior-Deriven Development)行為驅動開發

  • 為 TDD 的進化版,但會先寫測試規格書,再寫測試,後實作功能
  • 專注系統的行為,較貼近使用者的角度進行測試
  • 使用 `describe()` 和 `it()` 需求為導向的設計語意化
raw-image

C-3. 整合測試 Integration Testing

  • 整合兩個以上的元件(Component)或模組(Module)之間的互動測
  • 使用 Mock Data 模擬 Mock API 回傳內容,檢測 render DOM 是否呈現預期結果
  • 常用套件:TestBedTesting LibraryEnzyme

為什麼需要整合測試?單元測試都通過不就代表都 OK 了?下圖提供非常好的例子:

raw-image

根據不同情境所需,有時即使單元測試沒測出問題,一旦跨模組整合就出事了,因此這個階段更重視不同元件或環境之間的整合互動,也更貼近使用者實際行為。

C-4. 端對端測試 End-to-end Testing / E2E Testing

如下所示,為 Cypress 使用範例,能夠看到使用者實際操作頁面的過程:

raw-image

D. Consolusion

雖說寫測試很重要,但並非寫好寫滿就是最好作法,畢竟需求情境百百種,仍需考慮使用時機與情境,才不會本末導致,花費更多時間維護測試腳本。

透過撰寫測試,(強迫)讓開發者寫出容易被測試的程式碼,並在有限的資源中,以有效的測試來確保程式的品質。

然而,這些測試的道理我都懂,但到底該如何開始呢?下篇會繼續探討,如何透過 Cypress 這套工具進行 E2E Testing,並且實際應用到專案中!

E. Reference

留言
avatar-img
Heidi Liu的沙龍
0會員
7內容數
Heidi Liu的沙龍的其他內容
2023/02/09
這次專案開發是針對 iOS 系統,需要解決畫面縮放的問題,有些關鍵字來回搜尋好多遍,卻還是容易搞混,於是乎乾脆記錄下來,日後如果遇到這類型問題,也會直接更新在這篇。
Thumbnail
2023/02/09
這次專案開發是針對 iOS 系統,需要解決畫面縮放的問題,有些關鍵字來回搜尋好多遍,卻還是容易搞混,於是乎乾脆記錄下來,日後如果遇到這類型問題,也會直接更新在這篇。
Thumbnail
2022/12/23
What is WebSocket? WebSocket 是 HTML5 提供的一種網路傳輸協定,是瀏覽器(Client)與伺服器(Server)交換資料的方式之一。 與我們較為熟知的 HTTP 或 HTTPS 協定,同樣位於 OSI 模型的應用層,且基於傳輸層的 TCP 協定。
Thumbnail
2022/12/23
What is WebSocket? WebSocket 是 HTML5 提供的一種網路傳輸協定,是瀏覽器(Client)與伺服器(Server)交換資料的方式之一。 與我們較為熟知的 HTTP 或 HTTPS 協定,同樣位於 OSI 模型的應用層,且基於傳輸層的 TCP 協定。
Thumbnail
2021/04/04
「平凡的我啊,哪有時間低頭回望?」 — — 《排球少年 264 話》 各位安安,我是 Heidi,從年前就一直思考,應該如何總結這一年來的學習心得,結果又拖到現在,不知不覺都已經入職快兩個月了XD 這篇是記錄我在 Lidemy 學習半年的結業心得,也會稍微帶到多人協作和求職總結。
Thumbnail
2021/04/04
「平凡的我啊,哪有時間低頭回望?」 — — 《排球少年 264 話》 各位安安,我是 Heidi,從年前就一直思考,應該如何總結這一年來的學習心得,結果又拖到現在,不知不覺都已經入職快兩個月了XD 這篇是記錄我在 Lidemy 學習半年的結業心得,也會稍微帶到多人協作和求職總結。
Thumbnail
看更多
你可能也想看
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
最近在研讀單元測試的藝術這本書,也剛好因為自己對單元測試的撰寫還沒有很游刃有餘XD,但由於我是挑重點看,簡單做個內容讀後感的整理
Thumbnail
最近在研讀單元測試的藝術這本書,也剛好因為自己對單元測試的撰寫還沒有很游刃有餘XD,但由於我是挑重點看,簡單做個內容讀後感的整理
Thumbnail
過去在程式導師實驗課程中,整理過這兩篇筆記探討「測試」是怎麼回事: [week 3] 初探 Jest:如何測試程式? [week 22] React:用 SPA 架構實作一個部落格(三)- 淺談測試 在轉職後的第一家公司,組內曾嘗試在既有專案中撰寫測試,卻因時程緊湊而不了了之。
Thumbnail
過去在程式導師實驗課程中,整理過這兩篇筆記探討「測試」是怎麼回事: [week 3] 初探 Jest:如何測試程式? [week 22] React:用 SPA 架構實作一個部落格(三)- 淺談測試 在轉職後的第一家公司,組內曾嘗試在既有專案中撰寫測試,卻因時程緊湊而不了了之。
Thumbnail
介紹 通常我們程式寫完之後,要確保程式沒問題我們就會進行測試 在這裡我們將測試分兩大類: 單元測試(Unit Test,UT):對程式碼的最小單位所進行的測試 整合測試(Integration Test):系統/模組之間的測試,通常會接觸到真實系統 在這裡只會簡單介紹一下單元測試的概念 這裡在將單元
Thumbnail
介紹 通常我們程式寫完之後,要確保程式沒問題我們就會進行測試 在這裡我們將測試分兩大類: 單元測試(Unit Test,UT):對程式碼的最小單位所進行的測試 整合測試(Integration Test):系統/模組之間的測試,通常會接觸到真實系統 在這裡只會簡單介紹一下單元測試的概念 這裡在將單元
Thumbnail
最近負責的專案還在發散摸索期,有很多待確認待驗證的題目,討論過程中不停來回。在跟其他 UX 設計師討論過後,推薦閱讀《商業思維構想》這本書,思考新創公司或 MVP 推出時的商業模式思考。 以下紀錄我在書中獲得的啟發。 跨職能的驗證團隊,讓實驗不只發生在某個部門 實驗與驗證,不只有在 UX 可以做
Thumbnail
最近負責的專案還在發散摸索期,有很多待確認待驗證的題目,討論過程中不停來回。在跟其他 UX 設計師討論過後,推薦閱讀《商業思維構想》這本書,思考新創公司或 MVP 推出時的商業模式思考。 以下紀錄我在書中獲得的啟發。 跨職能的驗證團隊,讓實驗不只發生在某個部門 實驗與驗證,不只有在 UX 可以做
Thumbnail
完成對功能的了解之後,我們就要開始進入實現功能的開發階段。跟以往的開發流程不同的是,我們在敏捷開發中注重的是製作有價值的東西。也就是在計畫中,我們獲取的資訊都是對使用者有用、可以被看見以及操作和跨團隊協作的性質。
Thumbnail
完成對功能的了解之後,我們就要開始進入實現功能的開發階段。跟以往的開發流程不同的是,我們在敏捷開發中注重的是製作有價值的東西。也就是在計畫中,我們獲取的資訊都是對使用者有用、可以被看見以及操作和跨團隊協作的性質。
Thumbnail
從測試方法的名字中可以很輕鬆的了解到,TDD(測試驅動開發)的前提就是先寫測試,然後再去開發我們的系統。要達成這樣的條件,就會需要有明確的規格才能夠實行。
Thumbnail
從測試方法的名字中可以很輕鬆的了解到,TDD(測試驅動開發)的前提就是先寫測試,然後再去開發我們的系統。要達成這樣的條件,就會需要有明確的規格才能夠實行。
Thumbnail
大多數的工程師常常會有一個疑問,就是「測試」應該要怎麼測試才是正確的?在過去,軟體測試大多還是以人工為主,在這幾年逐漸的出現自動化測試之後,實際上我們是不清楚應該要怎麼寫測試。
Thumbnail
大多數的工程師常常會有一個疑問,就是「測試」應該要怎麼測試才是正確的?在過去,軟體測試大多還是以人工為主,在這幾年逐漸的出現自動化測試之後,實際上我們是不清楚應該要怎麼寫測試。
Thumbnail
「測試」在桌遊開發中,扮演著非常重要的角色。從過去到現在,隨著桌遊產業的成熟與進步,測試的方法和觀念也有所轉變。疫情與電商轉型,更令出版社必須找出更好的測試方法。今天就來跟大家分享我在擔任編輯時,所使用的測試方法吧!
Thumbnail
「測試」在桌遊開發中,扮演著非常重要的角色。從過去到現在,隨著桌遊產業的成熟與進步,測試的方法和觀念也有所轉變。疫情與電商轉型,更令出版社必須找出更好的測試方法。今天就來跟大家分享我在擔任編輯時,所使用的測試方法吧!
Thumbnail
tl;dr, 沒有測試談不上好軟件! 軟件編碼的質素和一間公司發展的關係,在之前的文章《Code 寫得好對公司有用嗎?》已有討論,那麼有什麼因素會左右編碼的質素?其中一樣就是軟件測試。
Thumbnail
tl;dr, 沒有測試談不上好軟件! 軟件編碼的質素和一間公司發展的關係,在之前的文章《Code 寫得好對公司有用嗎?》已有討論,那麼有什麼因素會左右編碼的質素?其中一樣就是軟件測試。
Thumbnail
測試驅動開發(Test-Driven Development, TDD)或是行為驅動開發(Behavioral-Driven Developement)是當代軟體工程裡面常見的方法論,然而以資料科學或是數據分析的專案來說,通常主要的「測試」會以模型的準確性或是資料分布的模式為核心
Thumbnail
測試驅動開發(Test-Driven Development, TDD)或是行為驅動開發(Behavioral-Driven Developement)是當代軟體工程裡面常見的方法論,然而以資料科學或是數據分析的專案來說,通常主要的「測試」會以模型的準確性或是資料分布的模式為核心
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News