Go单元测试方法

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 就可以分析。