Go Testing 单元测试和基准测试

单元测试

测试文件命名必须为*_test.go,单元测试函数的签名必须是func TestFoo(t *testing.T) {},基准测试函数签名必须是 func BenchmarkBar(b *testing.B) {}

testMe.go 为被测试的源文件 testMe_test.go 为测试代码,代码附在最后

执行单元测试

go test testMe.go testMe_test.go -v

执行指定方法的测试 -test.run TestS2

go test testMe.go testMe_test.go -test.run TestS2 -v

测试覆盖率 -cover 覆盖率 -v 展示详细信息 -count 执行次数 等于 1 可以避免测试缓存 timeout 超时设置

go test testMe.go testMe_test.go -cover -v -count=1 -timeout 15s

测试覆盖率生成文件

go test testMe.go testMe_test.go -cover -v -coverprofile=coverage.out

测试覆盖率生成的文件分析

go tool cover -func=coverage.out

测试覆盖率生成的文件网页分析

go tool cover -html=coverage.out

递归测试文件夹下所有 *_test.go

go test ./...

基准测试

benchmarkMe.go 为被测试的源文件 benchmarkMe_test.go 为测试代码,代码附在最后

执行基准测试 -bench=. 代表执行所有可运行的benchmark

go test -bench=. benchmarkMe.go benchmarkMe_test.go

执行指定方法的基准测试

go test -benchmem -bench=Benchmark30fibo1 benchmarkMe.go benchmarkMe_test.go

显示内存分配信息

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 学习笔记,把常用命令汇总在一起方便复习和日常使用。代码都是直接参照书上的0.0

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容