平常開發中, 測試是不能缺乏的,每次手動測試很是費時費力,經過單元測試能夠達到一次實現屢次利用;框架
單元測試主要是經過模擬業務中的參數,調用咱們的函數,而後獲取執行結果,再判斷結果是否符合規則;同時還能夠對某一個方法進行性能分析函數
在Go 標準庫中有一個叫作 testing
的測試框架, 能夠用於單元測試和性能測試. 它是和命令 go test
集成使用的,測試文件是之後綴 _test.go
命名的, 一般和被測試的文件放在同一個包中.工具
單元測試咱們大部分狀況下無需增長或修改業務代碼,只需增長單元測試代碼便可,在這個實驗過程當中,咱們簡單編寫一個簡單的業務代碼,用來模擬項目中的業務代碼;而後再添加單元測試代碼進行測試。性能
咱們找一個空文件夾,新建一個main.go文件,在文件中將一下代碼複製進去並保存單元測試
package main func Sum(count int) int { count-- return count }
接着咱們繼續在當前文件夾下新建單元測試代碼,按照簡介中的規則,咱們須要新建一個名爲main_test.go
的文件,而後在文件中編寫測試代碼,示例代碼以下測試
package main import ( "testing" ) //單元測試 func TestSum(t *testing.T) { //準備參數 param := 10 //執行函數 ret := Sum(param) //判斷結果是否符合預期 if ret != 9 { t.Error("Sum result failed") } } //性能測試 func BenchmarkSum(b *testing.B) { //準備參數 param := 10 //執行函數 for i := 0; i < b.N; i++ { Sum(param) } }
普通測試主要是驗證返回的結果是否符合預期,執行的命令以下所示spa
go test -v main_test.go main.go
命令執行後,返回的結果以下所示翻譯
從上圖中能夠看到,單元測試提示測試經過,說明咱們程序符合預期指針
性能測試主要是經過屢次調用程序,總耗時來分析程序的性能,相似於AB壓力測試,執行命令以下所示code
go test -v -bench="BenchmarkSum$" --run=none main_test.go main.go
命令中的-bench="BenchmarkSum$"
參數表明要窒息哪個方法,執行結果以下所示
在上圖中能夠看到程序被調用了1000000000次,平均耗時0.254ns
性能分析主要是查看方法中具體的瓶頸,好比A方法調用了C、B、D多個方法,具體耗時在什麼位置,咱們能夠在上一條性能測試的命令中加入-cpuprofile cpu.out
參數(文章附錄有多種分析指標類型)加入到性能測試中的具體信息保存
go test -v -bench="BenchmarkSum$" --run=none -cpuprofile cpu.out main_test.go main.go
經過go 自帶工具分析保存的文件
go tool pprof cpu.out
命令執行以後返回信息以下圖所示
經過第三方工具視圖分析
apt install graphviz && go tool pprof -http=":" cpu.out
命令執行以後,會返回一個localhost域名加隨機端口的網址,打開網址以後,能看到以下信息,由於我測試的方法比較簡單
各參數含義翻譯
-blockprofile block.out
將goroutine阻塞配置文件寫入指定文件 當全部測試完成時。 按照-c的方式編寫測試二進制文件。
-blockprofilerate n
控制細節提供的goroutine阻塞配置文件 調用運行時。SetBlockProfileRate與n。 參見" go doc run . setblockprofilerate " 剖析器的目標是平均每一個阻塞事件採樣一次 n納秒的程序花費被阻塞。默認狀況下, 若是以及。塊配置文件沒有設置這個標誌,全部的阻塞事件 ,至關於-test.blockprofilerate=1。
-coverprofile cover.out
在全部測試經過後,向文件寫入覆蓋率配置文件。 設置覆蓋。
-cpuprofile cpu.out
退出前將CPU配置文件寫入指定文件。 按照-c的方式編寫測試二進制文件。
-memprofile mem.out
經過全部測試後,將分配配置文件寫入該文件。 按照-c的方式編寫測試二進制文件。
-memprofilerate n
啓用更精確(和昂貴)的內存分配配置文件 設置runtime.MemProfileRate。參見" go doc run . memprofilerate "。 要配置全部內存分配,使用-test.memprofilerate=1。
-mutexprofile mutex.out
將互斥鎖爭用配置文件寫入指定文件 當全部測試完成時。 按照-c的方式編寫測試二進制文件。
-mutexprofilefraction n
樣本1在n堆棧的蹤影goroutines持有a 爭用互斥鎖。
做者:湯青松
日期:2020-08-11