Go 中进行单元测试非常方便,官方提供一套 UT 测试框架。
一般 UT 测试
测试方法
比如实现了某个代码”code1.go”,可以写一个测试文件”code1_test.go”。这里关键点是_test.go
这样的后缀会被执行自动测试,前面是什么文字无所谓。
例如,在”code1.go”中有如下代码:
// code1 is a function
func code1() {
}
// MyClass is a class
type MyClass struct {}
在”code1_test.go”中可以写如下代码:
// 测试代码,用Test开头
func TestCode1(t testing.T) {
// 这里写对code1中代码的调用、检测
t.Log("hello world") // 可以输出测试用log
t.Fail() // 标记次条fail
t.FailNow() // 标记fail并停止继续测试
}
// 基准测试代码,用Benchmark开头,可以查看程序每次测试时内存、CPU的使用情况
func BenchmarkCode1(b *testing.B) {
// 一些性能基准测试
for i := 0; i < b.N; i++ {
// ...
}
}
// 示例代码,用Example开头
func ExampleCode1() {
// here are some exmaples of using code1
}
// 对同一个对象的多个示例函数,用下划线分隔名称
func ExampleMyClass_use1() {
}
func ExampleMyClass_use2() {
}
测试命令
通常用go test ./...
递归当前目录及子目录全部测试
用go test -v -run TestCode1 code1_test.go -count=1
可以运行特定测试函数,-count=1
表示不要缓存要测试
-v
表示没有出错的测试过程也显示出来-failfast
遇到一个错误后就立即停止测试输出结果,默认会执行全部测试后再显示结果-list regexp
只列出匹配regexp
的 case 名称,不执行-run regexp
运行匹配regexp
的 case-cpu 1,2,4
指定使用 CPU 的数量,其实就是设置GOMAXPROCS
-parallel n
使用t.Parallel()
使测试转为并发时,指定最大并发数,默认为GOMAXPROCS
-timeout 1s/1m/1h
设置测试的整体限定时间,超过会停止-count=2
设置测试次数,默认为 1-json
将输出结果转为 json,以便其它程序进一步解析-o <file>
将测试编译成可执行的二进制文件-
-args
对测试进行编译时,携带的编译参数 -bench
同时运行 Benchmark 测试,默认 Benchmark 不会执行-bench regexp
测试符合regexp
的性能测试 case-benchmem
性能测试时,同时打印每个操作分配内存数和分配对象数
benchmark 测试
pprof 性能 log 输出
程序崩溃的捕获方法
Go 程序崩溃时,会在 std-out 输出调用栈和崩溃位置信息,所以只需要收集这个 log 就可以分析。