博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
golang 单元测试
阅读量:5344 次
发布时间:2019-06-15

本文共 2665 字,大约阅读时间需要 8 分钟。

单元测试是质量保证十分重要的一环,好的单元测试不仅能及时地发现问题,更能够方便地调试,提高生产效率,所以很多人认为写单元测试是需要额外的时间,会降低生产效率,是对单元测试最大的偏见和误解

go 语言原生支持了单元测试,使用上非常简单,测试代码只需要放到以 _test.go 结尾的文件中即可。golang的测试分为单元测试和性能测试,单元测试的测试用例以 Test 开头,性能测试以 Benchmark 开头

举个例子

实现排列组合函数对应的单元测试和性能测试

实现排列组合函数

// combination.gopackage hmathfunc combination(m, n int) int {    if n > m-n {        n = m - n    }    c := 1    for i := 0; i < n; i++ {        c *= m - i        c /= i + 1    }    return c}

实现单元测试和性能测试

// combination_test.gopackage hmathimport (    "math/rand"    "testing")// 单元测试// 测试全局函数,以TestFunction命名// 测试类成员函数,以TestClass_Function命名func TestCombination(t *testing.T) {    // 这里定义一个临时的结构体来存储测试case的参数以及期望的返回值    for _, unit := range []struct {        m        int        n        int        expected int    }{        {1, 0, 1},        {4, 1, 4},        {4, 2, 6},        {4, 3, 4},        {4, 4, 1},        {10, 1, 10},        {10, 3, 120},        {10, 7, 120},    } {        // 调用排列组合函数,与期望的结果比对,如果不一致输出错误        if actually := combination(unit.m, unit.n); actually != unit.expected {            t.Errorf("combination: [%v], actually: [%v]", unit, actually)        }    }}// 性能测试func BenchmarkCombination(b *testing.B) {    // b.N会根据函数的运行时间取一个合适的值    for i := 0; i < b.N; i++ {        combination(i+1, rand.Intn(i+1))    }}// 并发性能测试func BenchmarkCombinationParallel(b *testing.B) {    // 测试一个对象或者函数在多线程的场景下面是否安全    b.RunParallel(func(pb *testing.PB) {        for pb.Next() {            m := rand.Intn(100) + 1            n := rand.Intn(m)            combination(m, n)        }    })}

运行测试

go test combination_test.go combination.go           # 单元测试go test --cover combination_test.go combination.go   # 单元测试覆盖率go test -bench=. combination_test.go combination.go  # 性能测试

setup 和 teardown

setup 和 teardown 是在每个 case 执行前后都需要执行的操作,golang 没有直接的实现,可以通过下面这个方法实现全局的 setup 和 teardown,具体每个 case 的 setup 和 teardown 需要自己实现

func TestMain(m *testing.M) {    // setup code...    os.Exit(m.Run())    // teardown code...}

goconvey

这个第三方工具会自动帮我们跑测试,并且以非常友好的可视化界面帮我们展示测试的结果,包括测试失败的原因,测试覆盖率等等,内部还提供了很多友好的断言,能提高测试代码的可读性

使用方法

go get github.com/smartystreets/goconvey

然后用终端在测试代码的目录下运行 goconvey 命令即可

测试例子

package package_nameimport (    "testing"    . "github.com/smartystreets/goconvey/convey")func TestIntegerStuff(t *testing.T) {    Convey("Given some integer with a starting value", t, func() {        x := 1        Convey("When the integer is incremented", func() {            x++            Convey("The value should be greater by one", func() {                So(x, ShouldEqual, 2)            })        })    })}

参考链接

  • go testing:
  • goconvey:
  • goconvey 文档:
  • goconvey 标准断言:

转载请注明出处

本文链接:

转载于:https://www.cnblogs.com/hatlonely/p/8395167.html

你可能感兴趣的文章
组合数学 UVa 11538 Chess Queen
查看>>
oracle job
查看>>
Redis常用命令
查看>>
[转载]电脑小绝技
查看>>
windos系统定时执行批处理文件(bat文件)
查看>>
thinkphp如何实现伪静态
查看>>
BZOJ 2243: [SDOI2011]染色( 树链剖分 )
查看>>
BZOJ 1925: [Sdoi2010]地精部落( dp )
查看>>
c++中的string常用函数用法总结!
查看>>
[DLX精确覆盖+打表] hdu 2518 Dominoes
查看>>
SuperMap iServerJava 6R扩展领域开发及压力测试---判断点在那个面内(1)
查看>>
Week03-面向对象入门
查看>>
一个控制台程序,模拟机器人对话
查看>>
web.xml 中加载顺序
查看>>
pycharm激活地址
查看>>
hdu 1207 四柱汉诺塔
查看>>
Vue 2.x + Webpack 3.x + Nodejs 多页面项目框架(上篇——纯前端多页面)
查看>>
我的PHP学习之路
查看>>
【题解】luogu p2340 奶牛会展
查看>>
对PostgreSQL的 SPI_prepare 的理解。
查看>>