Go语言中的测试框架(testing)用法简单入门
Go语言中的测试
单元测试Unit Testing
是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。go语言中提供了单元测试的功能。通过在Go语言包testing
提供自动化测试功能的接口,达到功能测试和性能测试的目的。
一、测试文件的基本结构
- 一个基本的测试文件如下
// helloWorld_test.go package test import "testing" func TestHello(t *testing.T){ t.Log("Hello World") }
- Go语言中区分测试代码与普通源程序代码的在于:
- 文件名:test测试文件明明以
_test.go
结尾,例如,我们可以将命名为helloWorld_test.go
。之后在终端输入go test
,编译器会自动将其编译成可执行文件,输出信息类似如下(其中-v是打印详细信息的参数)[wangjunhuan@localhost test]$ go test -v === RUN TestHello --- PASS: TestHello (0.00s) hello_test.go:6: Hello World PASS ok github.com/user/test 0.007s
- 代码中必须
import testing
(但是package test
不是必须的,只是包命名时凑巧叫这个名字), testing包里为我们提供了测试中所需要的函数接口,例如打印日志,输出错误信息,基准测试所用变量等。 - 一个文件内可以有多个测试用例(函数),函数名必须是
Test[ functionName]
。上述代码中,函数参数的类型为*testing.T
,在单元测试中可以为我们打印日志信息等,像上面的使用test.T中的Log()方法打印字符串。类似的参数类型还有*testing.B
,用于基准测试。不过函数参数不是必须的,可以为空。我们还发现测试文件里不需要main()
函数
- 文件名:test测试文件明明以
二、运行单元测试
正如前面所说的只要在终端中输入go test
,_test.go
内的Test[ functionName]
就会被执行。默认情况下,我们可以不加参数,这样子所有test文件都会被测试,并且打印简单的运行结果。
和需要打印详细信息会用到-v一样,有许多参数是十分利于我们的测试的:
- -run regexp:只运行与正则表达式regexp相匹配的函数,例如
-run=print
,那么就会执行包含有print开头的函数 - -v:打印测试的详细命令
- -bench:执行对应的benchmarks,例如
go test -bench=. benchmark_test.go
表示运行benchmark_test.go下的所有的基准测试。(有关基准测试的内容在后面在细讲) - -cover:开启测试覆盖率
testing.T中常用的打印日志的方法,以下方法只是打印日志类型的不同,起到打印不同种类的信息的作用。在Error()和Fatal()后程序会被自动标记为Fail,但是不会强行结束程序。
方法 | 备注 |
---|---|
Log() | 打印日志 |
Logf() | 格式化打印日志 |
Error() | 打印错误日志 |
Errorf() | 格式化打印错误日志 |
Fatal() | 打印致命日志 |
Fatalf() | 格式化打印致命日志 |
如果只是想标记错误信息,可以使用Fail()
函数,如果想标记并强制退出,可以使用FailNow()
函数。
三、基准测试(性能测试)
基准测试的例子
package code11_3
import "testing"
func Benchmark_Add(b *testing.B) {
var n int
for i := 0; i < b.N; i {
n
}
}
- 留意到函数是以Benchmark_开头的,参数使用testing.B类型。我们可以看到函数内部使用了b.N,也是为何能进行基准测试的原因。
- 基准测试框架对一个测试用例的默认测试时间是 1 秒。开始测试时,当以 Benchmark 开头的基准测试用例函数返回时还不到 1 秒,那么 testing.B 中的 N 值将按 1、2、5、10、20、50……递增,同时以递增后的值重新调用基准测试用例函数。
测试结果
$ go test -v -bench=. benchmark_test.go
goos: linux
goarch: amd64
Benchmark_Add-4 20000000 0.33 ns/op
PASS
ok command-line-arguments 0.700s
可以看到与上述结果的区别在于行4:首先显示基准测试名称,2000000000 表示测试的次数,也就是 testing.B 结构中提供给程序使用的 N。“0.33 ns/op”表示每一个操作耗费多少时间(纳秒)。
参考资料:
go test命令(Go语言测试命令)完全攻略
您可能感兴趣的文章:
Go语言中的测试框架(testing)用法简单入门
go语言——测试
go语言代码测试
Go语言测试——TDD
想系统学习GO语言(Golang
golang 示例测试example_Golang基础入门11 | Testing
Go语言发展历史、核心、特性及学习路线
【七天从零实现ORM框架】Day02:database/sql基础
20 个有用的 Go 语言微服务开发框架
Go之开发小功能集合(viper获取配置信息,test编写测试单元,用户目录获取,JWT安全校验,字符串去重,Swag...