go 基准测试 找不到函数_golang系列——单元测试

55b73157bf20a9a973b1ae28a2ecced0.png

在golang语言中,通过go test和一些特殊的规则能快速实现单元测试。再正式介绍之前,先说一个坑。

坑:相同package中不同文件里的函数调用

在如下所示的目录结构中,我希望从main中调用add.go里的Add函数实现加法功能。

- 

然而通过go run main.go后,一直提示add函数未定义,而Add的确是定义过了。

# 

排查后才发现这种目录结构和场景时,不能使用go run main.go进行编译执行,而应该使用:

go 

所以建议大家使用类似如下所示的目录结构进行项目开发,main.go文件单独放在主目录下,其他文件放在utils等新的目录中,使用import关键词导入包。

- 

下面我们正式讲解golang项目的测试代码。优秀的开发团队会针对重要的函数进行单元测试,同时良好的单元测试能够保证代码稳定性,为今后添加新功能提供便利。

逻辑测试

golang语言提供go test命令进行功能测试,即测试函数的正确性。下面用一个简单的示例带领大家逐步熟悉。假设我们写了一个utils的工具库,里面包含一个int型加法函数,需要我们进行测试。加法函数如下:

package 

那如何对这个函数进行测试呢?需要编写测试程序,同时该测试程序需要按照一定的规则,以便于利用go test进行自动化编译运行。

1、在add.go的同级目录下心间add_test.go测试文件;测试文件的名称必须是源文件加上 “_test.go” 的文件,go test能够自动识别。即

- 

2、在add_test.go中编写TestAdd测试函数;测试函数名必须是“Test”前缀加上源函数名

package 

在utils目录下执行

go 

如果一个文件里有很多个函数都需要测试,那可以按照上述1和2规则完成测试函数后进行测试。同学们可是尝试添加一个AddFloat函数并完成测试函数。

往往一组测试用例是不够的,所以针对每个函数需要多组测试用例进行测试。golang提供测试组以批量完成测试,同时也支持测试单个用例。简单的说就是对将测试用例分成组,同时起名。遍历完成批量测试,制定名称完成单个测试。

package 

上述代码是批量测试,而如果需要单独测试某个示例,则只需要通过map的name进行控制即可。通过执行go test -v,得到如下结果。

➜  utils go test -v
=== RUN   TestAddInt
=== RUN   TestAddInt/case3
=== RUN   TestAddInt/case1
=== RUN   TestAddInt/case2
--- PASS: TestAddInt (0.00s)
    --- PASS: TestAddInt/case3 (0.00s)
    --- PASS: TestAddInt/case1 (0.00s)
    --- PASS: TestAddInt/case2 (0.00s)
PASS
ok      day1/common/utils       0.006s

如果测试全部通过,则说明函数功能没有问题;反之需要检查函数逻辑。

性能测试

同逻辑测试类似,我们只需要在测试文件中加上对应的基准测试函数即可,基准函数名称以Benchmark开头,则在本例中为BenchmarkAddInt,具体函数如下:

func 

其中N是testing.B结构体中的一个变量,可以认为是测试函数AddInt在固定时间内可执行的次数。例如如下命令完成测试:

go 

输出结果为:

如上所示,在12核的机器上,执行1000000000次AddInt,每次操作耗费时间0.261纳秒,空间0B,每次不分配空间,因为我们使用的是内置的int型,不需要分配内存。同时本次测试PASS。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值