go单元测试实践

最近在做go的单元测试,简单的梳理一下知识点

1、框架选型

goconvey+gomonkey应该是最好的组合方案,goconvey是作为外层框架,gomonkey可以为函数、方法等进行打桩。

2、go monkey

项目地址:https://github.com/agiledragon/gomonkey
gomonkey 是 golang 的一款打桩框架,目标是让用户在单元测试中低成本的完成打桩,从而将精力聚焦于业务功能的开发。gomonkey 接口友好,功能强大,目前已被很多项目使用,用户遍及世界多个国家。gomonkey特性列表如下:

  • 支持为一个函数打一个桩
  • 支持为一个成员方法打一个桩
  • 支持为一个全局变量打一个桩
  • 支持为一个函数变量打一个桩
  • 支持为一个函数打一个特定的桩序列
  • 支持为一个成员方法打一个特定的桩序列
  • 支持为一个函数变量打一个特定的桩序列
  • table-driven的方式定义一系列stub

3、go covey

项目地址:https://github.com/smartystreets/goconvey.git
goconvey是一款针对 golang 的测试框架,可以管理和运行测试用例,同时提供了丰富的断言函数,并支持很多 Web 界面特性。可以简洁的编写单元测试代码

4、单测执行

4.1 go test 命令(快速看结果建议使用)

go test 命令后面不加任何参数,只会运行当前目录下的测试文件,不会遍历子文件夹
go单元测试实践_第1张图片

4.2 go test xxx.test.go xxx.go(不建议使用)

go test 命令后面指定运行当前目录下的某一个测试文件,而不是全部文件
go单元测试实践_第2张图片
但是这种情况通常会出现 undefined错误,go默认将源码文件和测试文件编译成一个临时执行文件,函数只能在这个临时文件中寻找。如果临时文件中没有找到函数或者变量,就会出现undefined错误,解决办法就是将需要引用的所有源码文件添加进来,如下所示:
在这里插入图片描述
这种方式运行起来耗时且费力,所以不建议。

4.3 go test 包名(建议使用)

go test 后面接包名参数,这里包名就是import 导入名。
在这里插入图片描述
go test 后面也可以接多个包名,如下所示:
在这里插入图片描述
当然,最建议使用是这种模式 go test ./...。运行当前目录下所有包的测试文件,可以遍历更深的目录
在这里插入图片描述

4.4 覆盖率(统计出来的数据以包为单位)

go test -coverprofile=cover.out 包名 会统计该包下的所有函数的覆盖情况
go tool cover -html=cover.out -o coverage.html利用覆盖率文件和原代码生成html
go tool cover -func=$profile -o cover.txt 利用覆盖率文件和原代码生成函数覆盖率

首先我们通过 go test -coverprofile=cover.out 包名 生成cover.out文件,如下图所示:
在这里插入图片描述
生成的code_verify_utils.cover.out如下,我们可以发现文件中存储了code_verify_utils包下的所有文件的覆盖信息
go单元测试实践_第3张图片
利用 go tool cover -html=cover.out -o coverage.html利用覆盖率文件和原代码生成html,如下图所示:
go单元测试实践_第4张图片
该html文件记录了该包下所有文件的覆盖率,并且通过绿色和红色进行高亮显示,绿色代表已经覆盖,红色代表未覆盖。

go tool cover -func=$profile -o cover.txt 利用覆盖率文件和原代码生成函数覆盖率,如下图所示:
go单元测试实践_第5张图片
可以看到通过该命令统计出来了该包下的所有文件的所有函数的覆盖情况,并且给出了总体的语句覆盖率。

5 注意点

5.1 多个包覆盖率

低版本的go不支持go test -coverpkg=./... ./...,所以需要挨个跑完单元测试然自己来合并覆盖率的结果,参考文章http://singlecool.com/2017/06/11/golang-test/,高版本的go已经支持该语法。可以使用如下命令对多个包的覆盖率进行统计

go test $(go list ./... | grep -v xxx) -coverprofile "$profile"

参考文章

1、https://studygolang.com/articles/15034
2、https://blog.csdn.net/wslyk606/article/details/81938777
3、http://singlecool.com/2017/06/11/golang-test/
4、https://brantou.github.io/2017/05/24/go-cover-story/
5、https://blog.csdn.net/xiaosongluo/article/details/80292894
6、https://www.coder.work/article/1022901

你可能感兴趣的:(软件测试)