Go Testing 單元測(cè)試和基準(zhǔn)測(cè)試

單元測(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容