Go 測試單個方法/性能測試

Go 測試單個方法 

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)

Image(6)

顯示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

相關文章
相關標籤/搜索