耶,寫兩天測試剛好為三十天做結尾,讚讚
常常寫程式遇到很多問題,最常見的應該是寫起來沒問題,跑下去發現直接壞掉,或是有時改一小部分覺得沒事,結果跑沒多久還是炸了,問題一大堆。沒事,測試可以幫忙解決大部分的問題。
程式的品質要好,測試是不可少的,測試多花了一半的時間在寫重複的東西,不過重要的是可以省去未來更多維護的時間,是投資報酬率極高極高的一件事,就用這個當作鐵人賽的結尾吧ˊˇˋ
Unit test,針對程式最小單位測試的一種方法,以程式來說就是method,在單元測試中基本上就是以最小單位測試每個method的正確性,確保整個系統能順利運作。
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套件進行測試。
有幾個要注意的事項
被測試檔_test.go
,要以_test.go
結尾。TestXxxx
,後面Xxx為大寫開頭命名。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提供許多方法,這邊介紹三種就好,
到終端機輸入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/
Golang