Go 單元測試和效能測試

2021-09-12 11:09:08 字數 4003 閱讀 3348

測試對於網際網路應用軟體開發來說非常重要,它對軟體可靠性保證具有重要意義,通過測試能夠盡可能發現並改正軟體中的錯誤,提高軟體質量。

這裡我們主要講解go語言如何實現單元測試和效能測試。

go語言中自帶有乙個輕量級的測試框架testing和自帶的go test命令來實現單元測試和效能測試,testing框架和其他語言中的測試框架類似,你可以基於這個框架寫針對相應函式的測試用例,也可以基於該框架寫相應的壓力測試用例,那麼接下來讓我們一一來看一下怎麼寫。

單元測試

建立目錄test,在目錄下建立add.go、add_test.go兩個檔案,add_test.go為單元測試檔案。

add_test.go

package test

import "testing"

func testadd(t *testing.t) else

}func testadd1(t *testing.t)

add.go

package test

func add(a, b int) int

然後在專案目錄下執行go test -v就可以看到測試結果了

=== run   testadd

--- pass: testadd (0.00s)

add_test.go:8: the result is ok

=== run testadd1

--- fail: testadd1 (0.00s)

add_test.go:14: the result is error

fail

exit status 1

fail _/d_/gopath/src/ados/test 0.419s

如果看到pass字樣證明測試通過,fail字樣表示測試失敗。

使用testing庫的測試框架需要遵循以下幾個規則如下:

效能測試或壓力測試

壓力測試用來檢測函式(方法)的效能,和編寫單元功能測試的方法類似,此處不再贅述,但需要注意以下幾點:

在test目錄下建立 reflect_test.go

package test

import (

"reflect"

"testing"

)type student struct

func benchmarkreflect_new(b *testing.b) )

b.resettimer()

for i := 0; i < b.n; i++

_ = s

}func benchmarkdirect_new(b *testing.b)

_ = s

}func benchmarkreflect_set(b *testing.b) )

b.resettimer()

for i := 0; i < b.n; i++

}func benchmarkreflect_setfieldbyname(b *testing.b) )

b.resettimer()

for i := 0; i < b.n; i++

}func benchmarkreflect_setfieldbyindex(b *testing.b) )

b.resettimer()

for i := 0; i < b.n; i++

}func benchmarkdirect_set(b *testing.b)

}

在test目錄下,執行:

go test reflect_test.go -test.bench=".*"

結果如下

goos: windows

goarch: amd64

benchmarkreflect_new-4 20000000 84.9 ns/op

benchmarkdirect_new-4 30000000 50.6 ns/op

benchmarkreflect_set-4 20000000 89.9 ns/op

benchmarkreflect_setfieldbyname-4 3000000 552 ns/op

benchmarkreflect_setfieldbyindex-4 10000000 132 ns/op

benchmarkdirect_set-4 30000000 53.0 ns/op

pass

ok command-line-arguments 10.982s

上面的結果顯示我們沒有執行任何test***的單元測試函式,顯示的結果只執行了壓力測試函式,以第三行為例

benchmarkreflect_new 函式執行了20000000次,每次的執行平均時間是84.9納秒。最後一行 command-line-arguments 10.982s,代表總的執行時間為 10.982s。

如果只想對某個函式測試,以benchmarkreflect_new 為例,執行命令

go test reflect_test.go -test.bench="benchmarkreflect_new"

結果為:

goos: windows

goarch: amd64

benchmarkreflect_new-4 20000000 84.9 ns/op

pass

ok command-line-arguments 2.490s

如果測試整個目錄下的所有測試執行:

go test -test.bench=".*"

如果想顯示記憶體分配的次數和大小新增 -benchmem

go test reflect_test.go -benchmem -test.bench=".*"

goos: windows

goarch: amd64

benchmarkreflect_new-4 20000000 88.3 ns/op 48 b/op 1 allocs/op

benchmarkdirect_new-4 30000000 53.8 ns/op 48 b/op 1 allocs/op

benchmarkreflect_set-4 20000000 90.9 ns/op 48 b/op 1 allocs/op

benchmarkreflect_setfieldbyname-4 3000000 564 ns/op 80 b/op 5 allocs/op

benchmarkreflect_setfieldbyindex-4 10000000 135 ns/op 48 b/op 1 allocs/op

benchmarkdirect_set-4 30000000 52.4 ns/op 48 b/op 1 allocs/op

pass

ok command-line-arguments 12.955s

後兩列代表分配的記憶體大小和次數(48 b/op 1 allocs/op)

推薦gotests

它是編寫go測試的乙個golang命令列工具,可以根據目標原始檔的函式和方法簽名生成表驅動的測試。將自動匯入測試檔案中的任何新依賴項。

參考:

go單元測試

go本身提供了一套輕量級的測試框架。mytest工程下有兩個檔案 main.go package main func main func add a,b int intmain test.go package main import testing func testadd1 t testing.t...

Go單元測試

對包含網路請求和響應的函式進行單元測試需要我們模擬客戶端請求和服務端返回。以乙個登入模組為例,main.go檔案如下 其中的重點是利用 http.newrequest構造乙個虛擬的http get請求,再用httptest.newrecorder 建立http.responesewriter,模擬真...

Go單元測試

go單元測試 1.使用testing框架 1.1.go test 如果執行正確,無日誌.錯誤時,會輸出日誌 1.2.go test v 執行正確或錯誤都會輸出日誌 1.3.當出現錯誤時,可以使用t.fatalf 來格式化輸出錯誤資訊,並退出日誌 1.4.t.logf 方法可以輸出相應的日誌 1.5....