golang自帶了testing測試包,使用該包可以進行自動化的單元測試,輸出結果驗證,並且可以測試性能。
建議安裝gotests插件自動生成測試代碼:
go get -u -v github.com/cweill/gotests/...
測試文件及目錄
使用testing測試包的測試文件名稱需要以_test.go
結尾,並且該測試文件需要與待測試的文件置於同一目錄下。比如如下目錄:
這里需要測試的是service目錄中各個文件中的函數,則在該目錄中創建一個名為service_test.go的文件,即可在該文件中調用其他文件的函數進行測試。
測試函數
在_test.go中通過編寫測試函數來進行測試。
首先引入testing包
import (
"testing"
)
對於測試函數,其命名需要以“Test”開頭,並且其后的字符串的第一個字符必須是大寫,或者是數字。如果沒有按照此規則進行命名,則該函數在測試時不會被執行。
其次,測試函數的參數必須為(t *testing.T),該參數包含有Log和Error等方法,用於輸出測試結果,其中Log用於測試通過的情況,Error則用於測試出錯的情況。
比如如下測試函數:
func TestUserLogin_normal(t *testing.T) { err := User().Login("test1", "321") if err == nil { t.Log("Login test1 success") } else { t.Error(err) } }
該函數負責測試User().Login()
方法的功能,當其功能正常執行時返回nil
,則調用t.Log()
輸出測試通過的信息,否則測試不通過,調用t.Error()
輸出錯誤信息。
執行測試
在測試文件的目錄下使用命令go test
即可進行測試。
當直接執行go test時,會默認執行所有"Test"開頭的函數,並且執行的順序與函數定義的順序相同。
如果需要指定某個函數進行測試,可以在命令后加上-run參數,該參數用於匹配要執行的測試函數的函數名(通過正則表達式來匹配)
比如要單獨執行TestUserRegister_normal測試函數時,用以下命令:
go test -run=TestUserRegister_normal
當要執行所有名稱前綴為TestUserRegister的測試函數時,用以下命令:
go test -run=TestUserRegister
前置條件:
1、文件名須以"_test.go"結尾
2、方法名須以"Test"打頭,並且形參為 (t *testing.T)
go語言對測試函數的名稱和簽名規定:
功能測試函數: 名稱必須以 Test為前綴、並且唯一參數的類型必須是 *testing.T 類型的參數聲明
性能測試函數: 名稱必須以Benchmark為前綴、並且唯一參數的類型必須是 *testing.B
示例測試函數: 名稱必須以Example為前綴、但對參數列表沒有強制規定
測試log:
t.Log、t.Logf方法的作用,常規打印日志,測試通過 則不會打印 如果想查看常規測試日志 可以用go test -v 如果想讓某個測試函數執行過程中 立即失敗 可以調用t.FailNow方法 t.Fail() 表示測試失敗,但是后續代碼可執行 t.FailNow() 表示 當前函數立即停止,后續代碼不再執行 想在測試失敗的同時打印失敗測試日志 直接調用t.Error方法或者t.Errorf方法 t.Fatal方法和t.Fatalf方法,它們的作用是在打印失敗錯誤日志之后立即終止當前測試函數的執行並宣告測試失敗。 更具體地說,這相當於它們在最后都調用了t.FailNow方法。
性能測試:benchmark
命令
命令 go.exe test -v -bench=. -run=^$ ./... goos: windows goarch: amd64 BenchmarkGetPrimes-4 500000 3242 ns/op PASS ok _/D_/Golang_Puzzlers-master/src/puzzlers/article20/q3 5.835s 測試命令 及結果 解釋 (./... 當前目錄下所有的測試) 第一個標記及其值為-bench=. 只有有了這個標記,命令才會進行性能測試 *該標記的值.表明需要執行任意名稱的性能測試函數 第二個標記及其值是-run=^$ 這個標記用於表明需要執行哪些功能測試函數,這同樣也是以函數名稱為依據的。 *該標記的值^$意味着:只執行名稱為空的功能測試函數,換句話說,不執行任何功能測試函數。只執行Benchmark的函數