【干货分享】Go Testing 单元测试和基准测试

1436 篇文章 61 订阅
273 篇文章 20 订阅

单元测试

测试文件命名必须为*_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

 最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

还包括软件学习路线图,50多天的上课视频、16个突击实战项目,80余个软件测试用软件,37份测试文档,70个软件测试相关问题,40篇测试经验级文章,上千份测试真题分享,还有2020软件测试面试宝典,还有软件测试求职的各类精选简历,希望对大家有所帮助…..

在我的QQ技术交流群里(技术交流和资源共享,广告勿扰)

可以自助拿走,群号:175317069 群里的免费资料都是笔者十多年测试生涯的精华。还有同行大神一起交流技术哦

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值