iT邦幫忙

2022 iThome 鐵人賽

DAY 28
0
Software Development

你知道Go是什麼嗎?系列 第 28

Day28 - Test(上) - Golang

  • 分享至 

  • xImage
  •  

耶,寫兩天測試剛好為三十天做結尾,讚讚

常常寫程式遇到很多問題,最常見的應該是寫起來沒問題,跑下去發現直接壞掉,或是有時改一小部分覺得沒事,結果跑沒多久還是炸了,問題一大堆。沒事,測試可以幫忙解決大部分的問題。

程式的品質要好,測試是不可少的,測試多花了一半的時間在寫重複的東西,不過重要的是可以省去未來更多維護的時間,是投資報酬率極高極高的一件事,就用這個當作鐵人賽的結尾吧ˊˇˋ

單元測試

Unit test,針對程式最小單位測試的一種方法,以程式來說就是method,在單元測試中基本上就是以最小單位測試每個method的正確性,確保整個系統能順利運作。

Go的測試

Go語言中有自帶測試框架testing與go test命令幫忙測試,對Go而言導入測試並不是一件複雜的事,下面就來介紹如何寫基本的測試

編寫測試案例

要測試首先要有個東西給他測嘛,我們先寫個階乘程式,在名為count的package包著Factorial方法,檔名為count.go

package count

func Factorial(a int) int {
	switch {
	case a < 0:
		return 0
	case a == 0:
		return 1
	default:
		ans := 1
		for i:=1; i<=a; i++{
			ans *= i
		}
		return ans
	}
}

撰寫測試檔

對Factorial這個方法撰寫測試檔案,首先先建立count_test.go,並運用testing套件進行測試。

有幾個要注意的事項

  1. 測試檔的檔名為被測試檔_test.go,要以_test.go結尾。
  2. 測試檔內的函式命名為TestXxxx,後面Xxx為大寫開頭命名。
  3. TestXxxx內帶有參數testing.T,該參數可幫忙記錄錯誤及測試狀態。
package count

import "testing"

// 預計的輸入與輸出
var(
	input = []int{
		-1,0,1,3,10,
	}
	output = []int{0,1,1,6,3628800}
)

// 測試檔,逐個比對給予的輸入與輸出
func TestFactorial(t *testing.T) {
	for i, v := range input {
		result := Factorial(v)
		if output[i] == result {
			t.Log("Pass")
		} else {
			t.Error("input", i, "is failed")
		}
	}
}

testing.T提供許多方法,這邊介紹三種就好,

  • t.Log: 幫忙輸出訊息
  • t.Fatal: 告知測試不過,並會中止測試
  • t.Error: 告知測試不過,但不會終止測試

測試

到終端機輸入go test -v,就會幫忙跑測試檔。

output:

=== RUN TestFactorial
count_test.go:16: Pass
count_test.go:16: Pass
count_test.go:16: Pass
count_test.go:16: Pass
count_test.go:16: Pass
--- PASS: TestFactorial (0.00s)
PASS
ok test/count 0.230s


覆蓋率

測試覆蓋率(Test coverage)是在軟體測試或是軟體工程中的軟體度量,表示軟體程式中被測試到的比例。

Go的testing中有內建函式可以直接觀看測試覆蓋率,只要測試時多加個-cover就能觀看到,以剛剛的測試為例。
go test -v -cover

output:

=== RUN TestFactorial
count_test.go:16: Pass
count_test.go:16: Pass
count_test.go:16: Pass
count_test.go:16: Pass
count_test.go:16: Pass
--- PASS: TestFactorial (0.00s)
PASS
coverage: 100.0% of statements
ok test/count 0.226s

測試沒過

給一個測試沒過的案例好了,不然都是過關的,修正一下上面var內的參數,把其中一個答案調錯再進行測試。

output:

=== RUN TestFactorial
count_test.go:16: Pass
count_test.go:16: Pass
count_test.go:16: Pass
count_test.go:16: Pass
count_test.go:18: input 10 is failed
--- FAIL: TestFactorial (0.00s)
FAIL
exit status 1
FAIL test/count 0.218s

這樣對與錯的都看過,基礎的測試就到這邊ˊˇˋ

參考資料

建立第一個單元測試(golang)-2(Day21)
https://ithelp.ithome.com.tw/articles/10282642

[Note] Golang Test 測試筆記
https://pjchender.dev/golang/note-golang-test/

如何在 Go 專案內寫測試
https://blog.wu-boy.com/2018/05/how-to-write-testing-in-golang/

tags: Golang

上一篇
Day27 - GraphQL - Golang
下一篇
Day29 - Test(下) - Golang
系列文
你知道Go是什麼嗎?30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言