[Go 06] 寫測試並產出一目瞭然的網頁版覆蓋率報告 再也不用怕遺漏

本章介紹:

  • 為上一篇 Gin 框架的 User & PostName func.寫個簡單測試
  • 跑測試並瞭解 coverage 覆蓋率,產生測試報告(20210702 有新增 vsocde 用法補充)

說明:新建一個檔案XX_test.go,並為 func 取名 Test XXX(t *testing.T)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
//測試打GET /api/v1/user 去跑User() 會拿到“OK”
func TestUser(t *testing.T) {
engine := gin.New()
initRoutes(engine)//你的路由邏輯
uri := "/api/v1/user"

body := Get(uri, engine)
fmt.Printf("response:%v\n", string(body))
if !reflect.DeepEqual(string(body), "\"OK\"") {
//利用 t.Errorf 觸發錯誤
t.Errorf("Get user name need to be ok!")
}
}
//同理測試 Post 去跑PostName() 會拿到回復的名字等於打的內容(body)
func TestPostName(t *testing.T) {
engine := gin.New()
initRoutes(engine)
uri := "/api/v1/user"
user := structs.User{Name: "user", Age: 18}
body := PostUser(uri, user, engine)
fmt.Printf("response:%v\n", string(body))

response := &structs.User{}
if err := json.Unmarshal(body, response); err != nil {
t.Errorf("Unmarshal,err:%v\n", err)
}
if response.Name != "user" {
t.Errorf("response different,user:%v\n", response.Name)
}
}

// GET HTTP Request
func Get(uri string, router *gin.Engine) []byte {
req := httptest.NewRequest("GET", uri, nil)
w := httptest.NewRecorder()

router.ServeHTTP(w, req)
result := w.Result()
defer result.Body.Close()
body, _ := ioutil.ReadAll(result.Body)
return body
}
// POST HTTP Request
func PostUser(uri string, param structs.User, router *gin.Engine) []byte {
jsonByte, _ := json.Marshal(param)
req := httptest.NewRequest("POST", uri, bytes.NewReader(jsonByte))
w := httptest.NewRecorder()
router.ServeHTTP(w, req)
result := w.Result()
defer result.Body.Close()
body, _ := ioutil.ReadAll(result.Body)
return body
}


測試單一個 function

如果用 VS code,可以在上方看到 run test | debug test 按鈕可以按,十分方便

測試單一檔案內所有測試

cover 有帶的話會算出覆蓋率,並要在該目錄下去執行,這邊跑出來結果大約有 57.1% 的覆蓋

1
2
3
4
$go test -v -cover=true user_test.go user.go
PASS
coverage: 57.1% of statements
ok command-line-arguments 0.297s coverage: 57.1% of statements

測試整個專案

1
2
如果是在main的目錄要往子目錄找
$go test -v ./…

產生測試覆蓋(coverage)報表-gotest

1
2
3
4
go test -coverprofile=coverage.out ./...
用gool tool
go tool cover -func=coverage.out
go tool cover -html=coverage.out

這個真的很酷,用網頁產生報告,而且非常視覺化,
可以看出剛剛沒有寫到的 UserName()測試為紅色


20210702 補充 :
其實後來發現 vscode 在跑完 package test 後,右邊側欄就會跑出覆蓋的條線了
如果只是要在測試時查看可以直接用IDE的便利性即可.

vscode

當然寫測試還有很多判斷的條件等等,是否等於,是否不等於,各種輸出可能.

寫完之後,可以為下一次更動後確認邏輯,看跑過測試真的很有療癒的感覺!!!:grin:


覺得有疑問嗎?可以再進一步看看參考文章:


[Go 06] 寫測試並產出一目瞭然的網頁版覆蓋率報告 再也不用怕遺漏

https://minilabmemo.github.io/2020/05/08/05-go-test-coverage/

作者

Mini Lab Memo

發表於

2020-05-08

更新於

2023-07-09

許可協議

評論