1. 概述
單元測(cè)試(unit testing)
是指對(duì)軟件 中的 最小可測(cè)試單元進(jìn)行檢查和驗(yàn)證Go語(yǔ)言自身提供了一套輕量級(jí)的單元測(cè)試和性能測(cè)試系統(tǒng),符合規(guī)則的測(cè)試代碼會(huì)在運(yùn)行測(cè)試時(shí)被自動(dòng)識(shí)別執(zhí)行
2. 基礎(chǔ)測(cè)試
看看一個(gè)基本的測(cè)試案例是怎么寫(xiě)的
文件結(jié)構(gòu)如下
| |_main.go |_utils |___func1.go |___func1_test.go |___sham_test.go
func1.go
package utils
func AddTwoNums(x, y int) (sum int) {
sum = x + y
return
}
func AddUp(x int) int {
if x < 2 {
return x
}
sum := 0
for i := 0; i <= x; i++ {
sum += i
}
return sum
}
main.go
package main
import (
"utils"
"fmt"
)
func main(){
// 調(diào)用函數(shù)AddtwoNums
sum := utils.AddTwoNums(9,8)
fmt.Println(sum) // 17
// 調(diào)用函數(shù)AddUp
sum1 := utils.AddUp(100)
fmt.Println(sum1) // 5050
}
接下來(lái)我們看看測(cè)試用例怎么寫(xiě)
func1_test.go
package utils
import (
"testing" // 導(dǎo)入testing包
)
// AddTwoNums的測(cè)試用例1
// 測(cè)試AddTwoNums函數(shù) 結(jié)果正確
func TestAddTwoNums1(t *testing.T) {
sum := AddTwoNums(9,8)
if sum != 17{
t.Error("AddTwoNums is failed",sum)
}
}
// AddTwoNums的測(cè)試用例2
// 測(cè)試AddTwoNums函數(shù) 結(jié)果錯(cuò)誤
func TestAddTwoNums2(t *testing.T) {
sum := AddTwoNums(100,100)
if sum != 2000{
t.Error("AddTwoNums is failed",sum)
}
}
// AddUp的測(cè)試用例
// 測(cè)試AddUp函數(shù)
func TestAddUp(t *testing.T) {
sum := AddUp(100)
if sum != 5050{
t.Error("AddUp is failed",sum)
}
}
sham_test.go
package utils
import "testing"
func TestFunc1(t *testing.T) {
t.Log("TestFunc1 run")
}
func TestFunc2(t *testing.T) {
info := "TestFunc12 run"
t.Log(info + "===test log the method name `Log`")
t.Logf("output : %s", info+"===test log the method name `Logf`")
t.Error(info + "===test log the method name `Error`")
t.Errorf("output : %s", info+"===test log the method name `Errorf`")
t.Fatal(info + "===test log the method name `Fatal`")
t.Fatalf("output : %s", info+"===test log the method name `Fatalf`")
}
我們啟動(dòng)單元測(cè)試
使用的命令是 go test
PS:要查看這個(gè)命令這么使用 ,可以查看幫助文檔 在命令行中執(zhí)行
go help testflag
執(zhí)行該目錄下的所有測(cè)試用例
-v
顯示詳細(xì)的流程
go test -v
=== RUN TestAddTwoNums1
--- PASS: TestAddTwoNums1 (0.00s)
=== RUN TestAddTwoNums2
--- FAIL: TestAddTwoNums2 (0.00s)
func1_test.go:20: AddTwoNums is failed 200
=== RUN TestAddUp
--- PASS: TestAddUp (0.00s)
=== RUN TestFunc1
--- PASS: TestFunc1 (0.00s)
sham_test.go:6: TestFunc1 run
=== RUN TestFunc2
--- PASS: TestFunc2 (0.00s)
sham_test.go:9: TestFunc12 run
FAIL
exit status 1
FAIL GoNote/chapter10/demo3/utils 0.386s
執(zhí)行指定的單元測(cè)試用例
-run
運(yùn)行需要單獨(dú)執(zhí)行的測(cè)試用例
go test -v -run TestAddUp
=== RUN TestAddUp
--- PASS: TestAddUp (0.00s)
PASS
ok GoNote/chapter10/demo3/utils 0.392s
執(zhí)行測(cè)試文件中的所有測(cè)試用例
go test -v sham.go
=== RUN TestFunc1
--- PASS: TestFunc1 (0.00s)
sham_test.go:6: TestFunc1 run
=== RUN TestFunc2
--- FAIL: TestFunc2 (0.00s)
sham_test.go:10: TestFunc12 run===test log the method name `Log`
sham_test.go:11: output : TestFunc12 run===test log the method name `Logf`
sham_test.go:12: TestFunc12 run===test log the method name `Error`
sham_test.go:13: output : TestFunc12 run===test log the method name `Errorf`
sham_test.go:14: TestFunc12 run===test log the method name `Fatal`
FAIL
FAIL command-line-arguments 0.383s
通過(guò)上面的例子,總結(jié)如下
- 測(cè)試用例文件名必須以
_test
結(jié)尾- 測(cè)試用例函數(shù)名必須以
Test
開(kāi)頭- 測(cè)試用例函數(shù)的形參必須是
*testing.T
類型- 單個(gè)測(cè)試文件中可以有多個(gè)測(cè)試用例
- 可以使用多個(gè)測(cè)試用例測(cè)試同一個(gè)內(nèi)容
- 測(cè)試用例函數(shù)不需要放在
main
函數(shù)也能執(zhí)行PASS
表示測(cè)試用例運(yùn)行成功 ,FAIL
表示測(cè)試用例運(yùn)行失敗
單元測(cè)試框架提供的日志方法
方法名 | 含義 |
---|---|
Log | 打印日志 |
Logf | 格式化打印日志 |
Error | 打印錯(cuò)誤日志, 將測(cè)試函數(shù)標(biāo)記為失敗,但是繼續(xù)運(yùn)行 |
Errorf | 格式化打印錯(cuò)誤日志 ,將測(cè)試函數(shù)標(biāo)記為失敗,但是繼續(xù)運(yùn)行 |
Fatal | 打印致命錯(cuò)誤日志,將測(cè)試函數(shù)標(biāo)記為失敗并停止執(zhí)行 |
Fatalf | 格式化打印致命錯(cuò)誤日志,將測(cè)試函數(shù)標(biāo)記為失敗并停止執(zhí)行 |
2.1 提示 build failed
?
PS : 在執(zhí)行測(cè)試文件的時(shí)候可能會(huì)出現(xiàn)類似下面的情況
$ go test func1_test.go # command-line-arguments [command-line-arguments.test] .\func1_test.go:10:9: undefined: AddTwoNums .\func1_test.go:19:9: undefined: AddTwoNums .\func1_test.go:28:9: undefined: AddUp FAIL command-line-arguments [build failed]
我們測(cè)試的兩個(gè)函數(shù)
AddTwoNums
和AddUp
提示未定義, 最后提示命令行參數(shù)處理 構(gòu)建失敗
如何解決呢?
執(zhí)行測(cè)試命令帶上原文件即可
$ go test -v func1_test.go func1.go === RUN TestAddTwoNums1 --- PASS: TestAddTwoNums1 (0.00s) === RUN TestAddTwoNums2 --- FAIL: TestAddTwoNums2 (0.00s) func1_test.go:21: AddTwoNums is failed 200 === RUN TestAddUp --- PASS: TestAddUp (0.00s) FAIL FAIL command-line-arguments 0.336s
3. 基準(zhǔn)測(cè)試
基準(zhǔn)測(cè)可以測(cè)試一段程序的運(yùn)行性能及耗費(fèi)CPU的程度
寫(xiě)法上和測(cè)試用例的類似
package utils
import (
"fmt"
"testing"
)
// 基準(zhǔn)測(cè)試 demo
func BenchmarkDemo1(b *testing.B) {
var n int
// b.N 是測(cè)試框架提供
for i := 0; i < b.N; i++ {
n++
}
}
func BenchmarkDemo2(b *testing.B) {
}
// 基準(zhǔn)測(cè)試 測(cè)試函數(shù)AddTwoNums
func BenchmarkAddTwoNums(b *testing.B) {
for i := 0; i < b.N; i++ {
sum := AddTwoNums(i, i)
fmt.Sprintf("%d",sum)
}
}
執(zhí)行測(cè)試文件
$ go test -v -bench=. -benchmem -benchtime=10s bm_test.go func1.go
goos: windows
goarch: amd64
BenchmarkDemo1-4 10000000000 0.28 ns/op 0 B/op 0 allocs/op
BenchmarkDemo2-4 10000000000 0.00 ns/op 0 B/op 0 allocs/op
BenchmarkAddTwoNums-4 100000000 112 ns/op 20 B/op 2 allocs/op
PASS
ok command-line-arguments 14.575s
命令說(shuō)明
-bench=.
參數(shù)表示運(yùn)行 bm_test.go 文件中所有的基準(zhǔn)測(cè)試 ,如果想單獨(dú)運(yùn)行某個(gè)基準(zhǔn)測(cè)試帶上對(duì)應(yīng)的名稱即可,例如-bench=BenchmarkAddTwoNums
-benchmem
參數(shù)表示顯示內(nèi)存分配情況
-benchtime=
參數(shù)表示自定義測(cè)試時(shí)間測(cè)試結(jié)果說(shuō)明
-4
表示4個(gè)CPU線程執(zhí)行
ns/op
表示每一個(gè)操作消耗多少時(shí)間,單位是 納秒ns
B/op
表示每一次操作需要分配的字節(jié)數(shù)
allocs/op
表示每次執(zhí)行分配了多少次