Golang单元测试、性能测试笔记

前一段时间需要对自己的项目做性能测试,于是研究了一下Golang的testing包。testing包为Golang Package提供自动化测试的支持,通过go test命令可以执行如下形式的函数

func TestXxx(*testing.T)

需要注意的是Golang语言规范函数采取驼峰命名的方式,因此Xxx必须是以大写字母开头。

要编写一个新的测试脚本需要以"_test.go"结尾,该文件包含上述的TestXxxx函数,该文件应该和被测试的文件放在同一个包里,这些文件被排除在正常的package之外,运行"go test"命令将被包含。要了解详细信息可运行"go help test"和"go help testflag"了解。

Testing函数可以用来做单元测试,下面是一个样例函数:

func TestPing(t *testing.T) {
	m := make(map[string]int)
	m["a"] = 1
	b, ok := m["b"]
	assert.True(t, ok)
}

功能是测试相应的map里有没有b这个key。

  • assert为Golang中的测试提供一系列断言函数
  • T类型
    *testing.T类型用于管理测试状态并支持格式化测试日志。测试日志会在执行测试的过程中不断累积,并在测试完成时转储至标准输出。当一个测试的测试函数返回时,又或者当一个测试函数调用 FailNow、 Fatal、Fatalf、SkipNow、Skip 或者 Skipf 中的任意一个时,该测试即宣告结束。

运行"go test"我们可以看到
在这里插入图片描述

性能测试

性能测试用来检测函数的性能,编写方法和单元测试类似,在_test.go文件中,需要注意的是性能测试的函数以Benchmark开头。函数形如:

func BenchmarkXxx(*testing.B)

要运行性能测试需要执行明星 “go test -bench” 要了解更多的test命令行信息可以了解go testing flags。性能测试会按照顺序来执行。下面是一个样性能测试函数:

func BenchmarkPrinln(b *testing.B) {
	for i := 0; i < b.N; i++ {
		fmt.Printlnf("hello")
	}
}

B是传递给性能测试的类型,用来管理性能测试的时间和迭代次数。N是B的属性,表示迭代多少轮次,在性能测试期间会调整 b.N 直到测试函数持续足够长的时间。最后性能测试的输出如下:
在这里插入图片描述
表示一个轮次425333ns。

如果要了解哪个函数消耗的内存和CPU比较多可以设置CPU和mem的输出,执行该命令,则CPU的分析为cpu.out,内存消耗分析为mem.out

go test -bench=. -run=none -cpuprofile cpu.out -memprofile mem.out -count=5

可以使用go tool pprof对cpu和mem的耗时进行分析。go tool pprof是一个命令行工具,用来对CPU概要文件,内存概要文件和程序阻塞概要文件进行分析。 go tool pprof有很多有用的功能,利用生成CPU,MEM文件的火焰图等图形化分析文件,但是需要安装graphviz软件,大家可以安装这个软件再进行相关分析。

发布了115 篇原创文章 · 获赞 25 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/lion19930924/article/details/98618085