# Day 8 : Golang unit test ## 為什麼要寫單元測試 測試有很多種,像是整合測試、壓力測試、回歸測試等等,而這次主要想說明自己如何在個人專案寫簡單的單元測試。雖然現在自己開發個人專案,寫單元測試有點浪費時間,但仔細想想開發過程中是不是有可能在新增功能的同時,不小心對影響到原本的功能,更不用說三不五時可能手x不小心按到delete之類,且日後加入公司難免都要為自己開發的功能寫單元測試,減少同事review的時間,在彭彭的建議下先針對密碼和信箱的驗證練習撰寫單元測試。 ## Testing in Go 在Go裡面要進行測試,有些重要的事情,列舉如下 + 撰寫測試文件,且該測試文件要以_test.go結尾 + 必須import "testing" 這個package + 測試函式必須要Test開頭 + 如果要執行package裡面所有的測試,執行 `go test` 指令 <br> 以下面測試信箱驗證為例,我在同一個models package,存有emailValidation()這個驗證信箱是否有效的函式。一開始先建立測試案例的struct並進行初始化,接下來在第20行要建立測試函式時,注意到必須以Test開頭,然後加上已有的函式名字,如此執行`go test` 才會有效。 此外函式名稱可以直接接在Test後面並將現有函式第一個字母轉成大寫`TestEmailValidation(t *testing.T)`,或是透過底線都可以執行`Test_emailValidation(t *testing.T)`。 其中測試函式唯一的參數t用來記錄錯誤或是測試的狀態,如果要記錄可以用`t.log`,在這裡的第24行我則是透過`t.Errorf`紀錄失敗訊息。 ```go= package models import ( "testing" ) var emailTestCases = []struct { email string result bool }{ {"example123@gmail.com", true}, {"example@com", false}, {"example-email", false}, {"@example.com", false}, {"example$@gmail.com", false}, {"example.com", false}, {"example+email@gmail.com", false}, } func TestEmailValidation(t *testing.T) { for _, eachCase := range emailTestCases { eachResult := emailValidation(eachCase.email) if eachResult != eachCase.result { t.Errorf("Expected %v, but got %v for email %s", eachCase.result, eachResult, eachCase.email) } } } ``` ## References 1. [Go 怎麼寫測試案例](https://willh.gitbook.io/build-web-application-with-golang-zhtw/11.0/11.3) 2. [[Note] Golang Test 測試筆記](https://pjchender.dev/golang/note-golang-test/) ###### tags: `About Go`