gotest.gomysql
package mytest import ( "errors" ) func Division(a, b float64) (float64, error) { if b == 0 { return 0, errors.New("除數不能爲0") } return a / b, nil }
gotest_test.gonginx
package mytest import ( "testing" ) func Test_Division_1(t *testing.T) { if i, e := Division(6, 2); i != 3 || e != nil { //try a unit test on function t.Error("除法函數測試沒經過") // 若是不是如預期的那麼就報錯 } else { t.Log("第一個測試經過了") //記錄一些你指望記錄的信息 } } func Test_Division_2(t *testing.T) { if _, e := Division(6, 0); e == nil { //try a unit test on function t.Error("Division did not work as expected.") // 若是不是如預期的那麼就報錯 } else { t.Log("one test passed.", e) //記錄一些你指望記錄的信息 } }
gotest_b_test.gogit
package mytest import ( "testing" ) func Benchmark_Division_1(b *testing.B) { if i, e := Division(6, 2); i != 3 || e != nil { //try a unit test on function b.Error("除法函數測試沒經過") // 若是不是如預期的那麼就報錯 } else { b.Log("第一個測試經過了") //記錄一些你指望記錄的信息 } } func Benchmark_Division_2(b *testing.B) { if _, e := Division(6, 0); e == nil { //try a unit test on function b.Error("Division did not work as expected.") // 若是不是如預期的那麼就報錯 } else { b.Log("one test passed.", e) //記錄一些你指望記錄的信息 } }
1. 在目錄下執行 go test 是測試目錄全部以XXX_test.go 結尾的文件。github
2.測試單個方法 下面2種寫法。golang
go test -test.v -test.run="Test_Division_1" -test.count 5
go test -v -run="Test_Division_1" -count 5web
go test -v #測試目錄下全部*_test方法。sql
go test -v gotest_test.go gotest.go //測試整個文件,要帶上依賴文件ide
go test -v gotest.go gotest_test.go -test.run Test_Division_1 //測試單個函數svg
go test -v -bench=. //性能測試,測全部方法, 函數
go test -v -bench=Division_2 //性能測試,測單個方法,
go test -v -bench=".*" //性能測試,返回結果表示這個測試用例在1s中內運行了2000次,每次調用大約用了891898ns
-v參數,若是不加這個參數的話,只會顯示錯誤的測試用例,不然就顯示全部的測試用例(成功 + 錯誤)
3.查看幫助 go test -help
用性能測試生成CPU狀態圖
使用命令:
go test -bench=".*" -cpuprofile=cpu.prof -c
cpuprofile是表示生成的cpu profile文件, -c是生成可執行的二進制文件,這個是生成狀態圖必須的,它會在本目錄下生成可執行文件mymysql.test
而後使用go tool pprof工具: go tool pprof test0528.test cpu.prof
調用web(須要安裝graphviz)
顯示svg文件已經生成了
1.建立測試文件夾mysql,文件夾下的go文件的package必須與文件夾名一致(否則會識別不到)
2.建立須要測試的文件mysql.go(使用github.com/go-sql-driver/mysql包)
3.建立單元測試用例文件mysql_test.go(文件名必須是*_test.go的類型,*表明要測試的文件名,函數名必須以Test開頭如:TestXxx或Test_xxx)
4.建立benchmark性能測試用例文件mysql_b_test.go(文件名必須是*_b_test.go的類型,*表明要測試的文件名,函數名必須以Benchmark開頭如:BenchmarkXxx或Benchmark_xxx)
golang profile
go test是go語言自帶的測試工具,其中包含的是兩類,單元測試和性能測試
經過go help test能夠看到go test的使用說明:
格式形如:
go test [-c] [-i] [build flags] [packages] [flags for test binary]
參數解讀:
-c : 編譯go test成爲可執行的二進制文件,可是不運行測試。
-i : 安裝測試包依賴的package,可是不運行測試。
關於build flags,調用go help build,這些是編譯運行過程當中須要使用到的參數,通常設置爲空
關於packages,調用go help packages,這些是關於包的管理,通常設置爲空
關於flags for test binary,調用go help testflag,這些是go test過程當中常常使用到的參數
-test.v : 是否輸出所有的單元測試用例(無論成功或者失敗),默認沒有加上,因此只輸出失敗的單元測試用例。
-test.run pattern: 只跑哪些單元測試用例
-test.bench patten: 只跑那些性能測試用例
-test.benchmem : 是否在性能測試的時候輸出內存狀況
-test.benchtime t : 性能測試運行的時間,默認是1s
-test.cpuprofile cpu.out : 是否輸出cpu性能分析文件
-test.memprofile mem.out : 是否輸出內存性能分析文件
-test.blockprofile block.out : 是否輸出內部goroutine阻塞的性能分析文件
-test.memprofilerate n : 內存性能分析的時候有一個分配了多少的時候纔打點記錄的問題。這個參數就是設置打點的內存分配間隔,也就是profile中一個sample表明的內存大小。默認是設置爲512 * 1024的。若是你將它設置爲1,則每分配一個內存塊就會在profile中有個打點,那麼生成的profile的sample就會很是多。若是你設置爲0,那就是不作打點了。
你能夠經過設置memprofilerate=1和GOGC=off來關閉內存回收,而且對每一個內存塊的分配進行觀察。
-test.blockprofilerate n: 基本同上,控制的是goroutine阻塞時候打點的納秒數。默認不設置就至關於-test.blockprofilerate=1,每一納秒都打點記錄一下
-test.parallel n : 性能測試的程序並行cpu數,默認等於GOMAXPROCS。
-test.timeout t : 若是測試用例運行時間超過t,則拋出panic
-test.cpu 1,2,4 : 程序運行在哪些CPU上面,使用二進制的1所在位表明,和nginx的nginx_worker_cpu_affinity是一個道理
-test.short : 將那些運行時間較長的測試用例運行時間縮短
未測試:
https://studygolang.com/articles/5428
Go 中的 5 種高級測試方法 https://studygolang.com/articles/12135?fr=sidebar