1. 环境
- p4环境,sde docker
- go语言环境,1.19
2. 什么是单元测试
单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验
证。至于“单元”的大小或范围,并没有一个明确的标准,“单元”可以是一个函
数、方法、类、功能模块或者子系统。
Go 语言的单元测试默认采用官方自带的测试框架,通过引入 testing 包以及
执行 `go test` 命令来实现单元测试功能。
在源代码包目录内,所有以 `_test.go` 为后缀名的源文件会被 `go
test` 认定为单元测试的文件,这些单元测试的文件不会包含在 `go
build` 的源代码构建中,而是单独通过 go test 来编译并执行。
3. 单元测试编写流程
3.1. 测试用例的形式:
- 测试函数的函数名必须以大写的 Test 开头,后面紧跟的函数名,要么是大
写开头,要么就是下划线,比如 `func TestName(t *testing.T)` 或
者 `func Test_name(t *testing.T)` 都是 ok 的, 但是 `func
Testname(t *testing.T)`不会被检测到- TestXxxx(t *testing.T) // testing 包 T-普通测试用例
- T 结构内部是继承自 common 结构, common 结构提供集中方法
- 常用的方法:
- 打印信息: log/logf
- 测试用例失败,打印信息,但是测试用例继续:error/errorf
- 测试用例失败,打印信息,测试用例中断:fatal/fatalf
- 通常情况下,需要将测试文件和源代码放在同一个包内。一般测试文件的命
名,都是 `{source_filename}_test.go`,比如我们的源代码文件是
cntl.go ,那么就会在 cntl.go 的相同目录下,再建立一个 cntl_test.go
的单元测试文件去测试 cntl.go 文件里的相关方法。
3.2. 对测试接口需要用到的用例进行初始化
- 用于测试的用例需要多样化,能够覆盖到接口中的所有会发生的状况
3.3. 调用被测试的接口,做好 err 检查
3.4. 对调用接口的结果进行 assert 判断
"github.com/stretchr/testify/assert"
- assert.Equal(t, a, b),检查a和b是否相同- assert.Error(t, err),测试特殊用力如需要返回error的情况,判断err
是否为error
- 如果需要判断返回string的内容,可以使用strings.Contains和
assert.equal配合使用,利用fmt指定string中特定的参数
3.5 需要的时候使用 gomonkey 对测试接口进行打桩
"github.com/agiledragon/gomonkey/v2"
- gomonkey 是 golang 的一款打桩框架,目标是让用户在单元测试中低成本
的完成打桩,从而将精力聚焦于业务功能的开发。
- 调用applyFunc对指定接口进行打桩,修改指定接口的返回值
- writeEntries 接口的返回值已经变更为0,fmt.Errorf(stubErrStr),可
以对其进行测试
-在测试完之后,一定要对patch进行reset
- ApplyPrivateMethod 可以为私有方法打桩
3.6 单项单元测试的最后必须要把所有添加的用例删除,释放内存
3.7 go test -cover XXXX 进行测试(XXXX为文件名,例:cntl_test.go)