# 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`