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

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

举个例子

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

实现排列组合函数

// combination.go
package hmath
func combination(m, n int) int {if n > m-n {n = m - n}c := 1for i := 0; i < n; i++ {c *= m - ic /= i + 1}return c
}

实现单元测试和性能测试

// combination_test.go
package hmath
import ("math/rand""testing"
)
// 单元测试
// 测试全局函数,以TestFunction命名
// 测试类成员函数,以TestClass_Function命名
func TestCombination(t *testing.T) {// 这里定义一个临时的结构体来存储测试case的参数以及期望的返回值for _, unit := range []struct {m        intn        intexpected 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) + 1n := 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

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

使用方法

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

goconvey

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

使用方法

go get github.com/smartystreets/goconvey

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

测试例子

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

参考链接

go testing: http://docs.studygolang.com/pkg/testing/

goconvey: https://github.com/smartystreets/goconvey

goconvey 文档: https://github.com/smartystreets/goconvey/wiki/Documentation

goconvey 标准断言: https://github.com/smartystreets/goconvey/wiki/Assertions

thumb_up

转载|出处:http://t.cn/RnvsFRp

Golang技术交流群:426582602

转载于:https://www.cnblogs.com/reboot51/p/8669200.html

golang 单元测试相关推荐

  1. ​手把手教你如何进行 Golang 单元测试

    作者:stevennzhou,腾讯 PCG 前端开发工程师 本篇是对单元测试的一个总结,通过完整的单元测试手把手教学,能够让刚接触单元测试的开发者从整体上了解一个单元测试编写的全过程.最终通过两个问题 ...

  2. Golang单元测试坑盘点

    Golang单元测试坑盘点 最近在公司写单元测试,发现了不少坑.例如:monkey不支持inline函数,vscode单测有缓存,convey对切片.map等比较不可以直接使用类似于==进行.本节呢, ...

  3. Golang单元测试与覆盖率

    1 概述 C/C++和Java(以及大多数的主流编程语言)都有自己成熟的单元测试框架,前者如Check,后者如JUnit,但这些编程框架本质上仍是第三方产品,为了执行单元测试,我们不得不从头开始搭建测 ...

  4. VSCode配置Golang单元测试实例

    目录 前言 正文 一.导入testing工具包 二.单元测试文件命名规范 三.单元测试方法命名规范 四.执行单元测试 结尾 前言 说到代码的健壮性,单元测试是少不了的,基本上所有语言都有自己的单元测试 ...

  5. Golang 单元测试:有哪些误区和实践?

    简介:单元测试作为开发的有力武器,应该在软件开发的各个流程中发挥它的价值.原始的开发模式(开发完毕,交给测试团队进行端到端测试)的流程,应该逐步向 devops 的方向转变.本文是一个转型的具体实践过 ...

  6. Golang 单元测试详尽指引

    文末有彩蛋. 作者:yukkizhang,腾讯 CSIG 专项技术测试工程师 本篇文章站在测试的角度,旨在给行业平台乃至其他团队的开发同学,进行一定程度的单元测试指引,让其能够快速的明确单元测试的方式 ...

  7. golang 单元测试和性能测试

    单元测试 单元测试(Unit Tests, UT) 是一个优秀项目不可或缺的一部分,特别是在一些频繁变动和多人合作开发的项目中尤为重要.你或多或少都会有因为自己的提交,导致应用挂掉或服务宕机的经历.比 ...

  8. 一文说尽Golang单元测试实战的那些事儿

    导语 | 单元测试,通常是单独测试一个方法.类或函数,让开发者确信自己的代码在按预期运行,为确保代码可以测试且测试易于维护.腾讯后台开发工程师张力结合了公司级漏洞扫描系统洞犀在DevOps上探索的经验 ...

  9. GoLang 单元测试打桩和 mock

    目录 什么是 mock 变量打桩 接口方法/Redis 函数/方法打桩 包函数 成员方法 MySQL sqlmock sqlite mock gorm http mock 源码地址 单测基础 什么是 ...

最新文章

  1. (旧)走遍美国——(三、文化2)
  2. iphone查看删除的短信_手机资讯:iPhone手机可以批量删除短信吗如何操作
  3. java取邮箱前缀_java抓取网页或文件中的邮箱号码
  4. docker build Dockfile ---- RUN 中 cd 切换路径失败 的原因、解决
  5. ajax返回来总是html,ajax返回类型
  6. 【华为云技术分享】一行代码就能写一个日志打印组件,你信吗?为你揭晓LiteOS中日志打印组件的核心
  7. 吴立德机器学习笔记(转)
  8. 14.卷1(套接字联网API)---高级IO函数
  9. Jnotify文件监控的用法以及Jar文件导入的方法
  10. pip不是内部命令问题
  11. 提取数据_提取图表曲线数据的方法
  12. php爬虫大数据抓取_爬虫软件介绍?大数据抓取软件?
  13. 一个实用分数类Fraction的Java实现
  14. uni-app实现app内嵌微信文章
  15. cad调了比例因子没反应_大神们都在用的9个CAD制图技巧,你会用几个?
  16. 云服务器租金注意事项,租用服务器时的5个注意事项
  17. JS 实现别踩白块功能
  18. 2021芯片秋招总结
  19. Mybatis-plus:${ew.sqlselect}用法
  20. 使用http-server启本地服务

热门文章

  1. 【IT资讯】阿里新推出“阿里云网盘” 速度10MBs,百度网盘或迎来最强对手!
  2. 【STM32】定时器程序
  3. 【Tiny4412】EMMC启动Qt网络文件系统
  4. [Qt教程] 第12篇 2D绘图(二)渐变填充
  5. c语言键盘连续双击程序,编了个C语言的键盘程序有点问题,请指点下!
  6. .so是什么文件_安卓 so 文件解析详解
  7. 二叉树的链式结构的非递归遍历
  8. c++大作业迷宫游戏 规定时间内完成_小学生做作业磨蹭的7个原因及对策!太准了~...
  9. SpringBoot源码笔记分析
  10. sparksql(2)——dataframe的ap-printSchema、withColum、count、drop、describe、select