Golang測試包小結

2021-08-18 10:53:14 字數 2688 閱讀 9154

golang自帶了測試包(testing),直接可以進行單元測試、效能分析、輸出結果驗證等。簡單看著官方文件試了試,總結一下:

使用golang的測試包,需要遵循簡單的目錄結構

測試**放在待測試**的目錄下(乙個包內),以_test.go結尾,例如如下目錄結構,mytest目錄下有待測試的**檔案mytest.go和測試**mytest_test.go

.

|-- bin

| `-- main

|-- pkg

| `-- darwin_amd64

| `-- mytest.a

`-- src

|-- mytest

| |-- mytest.go

| `-- mytest_test.go

`-- main

`-- main.go

直接在mytest目錄下執行go test命令即可,go test包含很多選項,可以參考golang手冊相關部分

待測試的mytest.go原始碼如下:

package mytest

import (

"fmt"

)type mystruct struct

func getfieldvalue(x *mystruct) string

func setfieldvalue(x *mystruct, value string)

對於mytest_test.go,首先自然是要匯入golang的測試包

package mytest

import testing

基本的測試函式以test開頭,後面接的字串,第乙個字元必須是數字或者大寫,例如:

func testmytest(t *testing.t) 

}

t是testing包裡定義的乙個結構體,其包含了名為common的介面,提供了很多格式化輸出的功能,golang提供了自動檢查與呼叫測試函式的機制,測試函式的執行邏輯則需要編寫者自行完成。

執行go test 結果為:

call setfieldvalue()

pass

ok /go/src/mytest 0.004s

如果寫成testmytest,執行時會直接忽略掉該函式。得到的結果仍然為pass,但是不會列印「call setfieldvalue()」,也就是說測試函式實際沒有執行。

修改一下判斷條件:

func testmytest(t *testing.t) 

}

這個測試用例不會通過, 而error函式的入參就是測試不通過時列印的資訊:

setfieldvalue()

--- fail: testmytest (0.00s)

mytest_test.go:15: set field

fail

exit status 1

fail _/users/ronghuihe/documents/code/golang/my/go/src/mytest 0.004s

這並不會中斷測試程式,這個函式後面的部分仍然會執行,其他的測試函式也會執行。

testing包還自帶了效能分析功能,可評估**執行效能。效能分析函式也可以放到前面的***_test.go檔案內,命名以benchmark開頭,如:

func benchmarkgetfieldvalue(b *testing.b) 

}

其中b.n的值在執行過程中會自動調整,使得迴圈可以執行足夠多次,以便得到較為準確的單次結果:

效能分析加-bench引數執行,即go test -bench . (不能漏了最後這個點,它表示執行所有的效能測試函式)

benchmarkgetfieldvalue	setfieldvalue()

setfieldvalue()

setfieldvalue()

setfieldvalue()

setfieldvalue()

setfieldvalue()

2000000000 0.55 ns/op

每次迴圈大約需要0.55ns。這裡setfieldvalue()列印了多次,是因為benchmarkgetfieldvalue被呼叫了多次。

分析testing包的原始碼benchmark.go裡的launch函式和runn函式,可以看到golang會自行調節效能分析函式的呼叫次數。每次執行runn都會執行一次效能測試函式,而後根據執行時間,會確定後續的內部迴圈執行次數b.n,直到總的執行時間達到go test -benchtime指定的時間(如果沒指定預設為1s)

注意統計時間時,執行的是使用者編寫的效能分析函式,如上例中的benchmarkgetfieldvalue,而最後輸出的結果,表達的是for迴圈裡函式的效能,因此for迴圈之前的**執行時間很長的話,可能導致統計誤差比較大,如果需要剔除for之前**的影響,可以在for迴圈之前呼叫resettimer()介面重置本次統計的時間值:

func benchmarkgetfieldvalue(b *testing.b) 

}

golang基礎小結

無符號整型 uint8 uint16 uint32 uint64 帶符號整型 int8int16int32int64 uint和int具體是32位還是64位看作業系統 型別描述 uint8 無符號 8位整型 0 到 255 uint16 無符號 16位整型 0 到 65535 uint32 無符號 ...

GoLang 併發小結

006.併發 1 概念 1.1 goroutine是go並行設計的核心,goroutine的本質是輕量級執行緒 1.2 golang的runtime實現了對輕量級執行緒即goroutine的智慧型排程管理 1.3 p m g原理 1.3.1 runtime有p m g三個概念,p對應作業系統程序 對...

golang學習渠道小結

區塊鏈的底層研究和基於區塊鏈的應用開發已經越來越火熱了。一直想找找這個領域的門,目前我也在進行學習區塊鏈方面的開發,希望能和大家一起分享學習區塊鏈開發中的酸甜苦辣。今天我先來對收藏區塊鏈 以太坊中一些不錯的 資料做乙個彙總,作為入門和高階,個人感覺這些資料都是還還不錯。1.以太坊 中文版 2.go學...