当我们完成我们的正常代码逻辑编写以后,后续会涉及到各种需求的剔除,解决这些需求,我们就无法避免需要进行代码的更改,因此为了确保后续更改不会发生一些不可预料的问题,所以添加一些测试,从而保证代码的稳定性是必要的。
之前用python、perl的时候,经常都是自己凑数据,直接运行代码,也许作用类似,但是不可否认手动测试非常的繁琐,所以慢慢的向自动化测试的方向靠拢。在这里记录一下 使用go单元测试的效果。
go的单元测试有自己的命名约定(*_test.go
) 和对应的 Go 的 testing
包和go test
命令,您可以快速编写和执行测试。
当然前提时我们已经针对我们的业务需求,完成了相关代码的开发工作。
这里我们以 max.go
为例,代码如下:1
2
3
4
5
6
7
8
9package main
/* max函数返回两个数的最大值 */
func max(num1, num2 int) int {
if num1 > num2 {
return num1
} else {
return num2
}
}
创建测试代码
接下来我们构建我们的测试代码
- 首先我们在项目代码目录下,创建对应的测试代码
max_test.go
(测试代码文件名必须使用_test.go
为后缀才能被go test
识别,前缀不一定和go编码文件名一致) - 测试代码文件和项目代码文件在同一个目录下,应该属于相同的包。
- 撰写我们的测试函数,需要注意测试函数的命名规则,测试函数必须以
Test
开头,后面接测试函数名。(非TestName 格式的函数不会被执行) 代码中,我们可以构建相应的输入文件,执行对应的函数,然后对函数返回值进行校验,确定什么样的返回值测试通过(t.Log,或不做任何处理),什么样的返回值测试不通过(t.Error)。
测试代码示例(
clib_test.go
)如下:1
2
3
4
5
6
7
8
9
10
11
12
13package main // 注意这里需要和项目代码包名一致
import (
"testing"
)
// 自定义的测试函数 函数名称必须以 Test 开头
func TestClib(t *testing.T) {
if max(1, 2) == 2 {
t.Log("max(1,2)==2 pass")
} else {
t.Error("max(1,2)==2 fail")
}
}完成测试代码编写后,我们使用
go test
命令来运行我们的测试代码,
测试代码分析结果符合预期,返回结果如下1
2
3
4
5
6
7PS D:\Git_Repo\Work_temp\Go-test> go test -v
=== RUN TestClib
clib_test.go:9: max(1,2)==2 pass
--- PASS: TestClib (0.00s)
PASS
ok github.com/test 1.175s
PS D:\Git_Repo\Work_temp\Go-test>如果测试失败,示例如下(这里我们把测试代码的
max(1,2)==2
改成了max(1,2)==1
1
2
3
4
5
6
7
8PS D:\Git_Repo\Work_temp\Go-test> go test -v
=== RUN TestClib
clib_test.go:11: max(1,2)==1 fail
--- FAIL: TestClib (0.00s)
FAIL
exit status 1
FAIL github.com/test 0.431s
PS D:\Git_Repo\Work_temp\Go-test>
这样完成单元测试以后,后续我们需要对我们的代码进行验证时,就可以通过构建 *test.go 文件进行代码的单元测试啦。