單元測(cè)試
測(cè)試文件命名必須為*_test.go,單元測(cè)試函數(shù)的簽名必須是func TestFoo(t *testing.T) {},基準(zhǔn)測(cè)試函數(shù)簽名必須是 func BenchmarkBar(b *testing.B) {}
testMe.go 為被測(cè)試的源文件 testMe_test.go 為測(cè)試代碼,代碼附在最后
執(zhí)行單元測(cè)試
go test testMe.go testMe_test.go -v
執(zhí)行指定方法的測(cè)試 -test.run TestS2
go test testMe.go testMe_test.go -test.run TestS2 -v
測(cè)試覆蓋率 -cover 覆蓋率 -v 展示詳細(xì)信息 -count 執(zhí)行次數(shù) 等于 1 可以避免測(cè)試緩存 timeout 超時(shí)設(shè)置
go test testMe.go testMe_test.go -cover -v -count=1 -timeout 15s
測(cè)試覆蓋率生成文件
go test testMe.go testMe_test.go -cover -v -coverprofile=coverage.out
測(cè)試覆蓋率生成的文件分析
go tool cover -func=coverage.out
測(cè)試覆蓋率生成的文件網(wǎng)頁分析
go tool cover -html=coverage.out
遞歸測(cè)試文件夾下所有 *_test.go
go test ./...
基準(zhǔn)測(cè)試
benchmarkMe.go 為被測(cè)試的源文件 benchmarkMe_test.go 為測(cè)試代碼,代碼附在最后
執(zhí)行基準(zhǔn)測(cè)試 -bench=. 代表執(zhí)行所有可運(yùn)行的benchmark
go test -bench=. benchmarkMe.go benchmarkMe_test.go
執(zhí)行指定方法的基準(zhǔn)測(cè)試
go test -benchmem -bench=Benchmark30fibo1 benchmarkMe.go benchmarkMe_test.go
顯示內(nèi)存分配信息
go test -benchmem -bench=. benchmarkMe.go benchmarkMe_test.go
代碼:
testMe.go
package testMe
func f1(n int) int {
if n == 0 {
return 0
}
if n == 1 {
return 1
}
return f1(n-1) + f1(n-2)
}
func f2(n int) int {
if n == 0 {
return 0
}
if n == 1 {
return 2
}
return f2(n-1) + f2(n-2)
}
func s1(s string) int {
if s == "" {
return 0
}
n := 1
for range s {
n++
}
return n
}
func s2(s string) int {
return len(s)
}
testMe_test.go
package testMe
import "testing"
func TestS1(t *testing.T) {
if s1("123456789") != 9 {
t.Error(`s1("123456789") != 9`)
}
if s1("") != 0 {
t.Error(`s1("") != 0`)
}
}
func TestS2(t *testing.T) {
if s2("123456789") != 9 {
t.Error(`s2("123456789") != 9`)
}
if s2("") != 0 {
t.Error(`s2("") != 0`)
}
}
func TestF1(t *testing.T) {
if f1(0) != 0 {
t.Error(`f1(0) != 0`)
}
if f1(1) != 1 {
t.Error(`f1(1) != 1`)
}
if f1(2) != 1 {
t.Error(`f1(2) != 1`)
}
if f1(10) != 55 {
t.Error(`f1(10) != 55`)
}
}
func TestF2(t *testing.T) {
if f2(0) != 0 {
t.Error(`f2(0) != 0`)
}
if f2(1) != 1 {
t.Error(`f2(1) != 1`)
}
if f2(2) != 1 {
t.Error(`f2(2) != 1`)
}
if f2(10) != 55 {
t.Error(`f2(10) != 55`)
}
}
benchmarkMe.go
package testMe
import (
"fmt"
)
func fibo1(n int) int {
if n == 0 {
return 0
} else if n == 1 {
return 1
} else {
return fibo1(n-1) + fibo1(n-2)
}
}
func fibo2(n int) int {
if n == 0 || n == 1 {
return n
}
return fibo2(n-1) + fibo2(n-2)
}
func fibo3(n int) int {
fn := make(map[int]int)
for i := 0; i <= n; i++ {
var f int
if i <= 2 {
f = 1
} else {
f = fn[i-1] + fn[i-2]
}
fn[i] = f
}
return fn[n]
}
benchmarkMe_test.go
package testMe
import (
"testing"
)
var result int
func benchmarkfibo1(b *testing.B, n int) {
var r int
for i := 0; i < b.N; i++ {
r = fibo1(n)
}
result = r
}
func benchmarkfibo2(b *testing.B, n int) {
var r int
for i := 0; i < b.N; i++ {
r = fibo2(n)
}
result = r
}
func benchmarkfibo3(b *testing.B, n int) {
var r int
for i := 0; i < b.N; i++ {
r = fibo3(n)
}
result = r
}
func Benchmark30fibo1(b *testing.B) {
benchmarkfibo1(b, 30)
}
func Benchmark30fibo2(b *testing.B) {
benchmarkfibo2(b, 30)
}
func Benchmark30fibo3(b *testing.B) {
benchmarkfibo3(b, 30)
}
func Benchmark50fibo1(b *testing.B) {
benchmarkfibo1(b, 50)
}
func Benchmark50fibo2(b *testing.B) {
benchmarkfibo2(b, 50)
}
func Benchmark50fibo3(b *testing.B) {
benchmarkfibo3(b, 50)
}
Go Mastering 學(xué)習(xí)筆記,把常用命令匯總在一起方便復(fù)習(xí)和日常使用。代碼都是直接參照書上的0.0