GoProject-单元测试/性能测试/Profiling

  1. Go语言的单元测试
  2. Go语言的性能测试
  3. Go Profiling

Go语言的单元测试

假设你在一个package中, 写了很多函数, 现在, 你要对这些函数写UnitTest.

你可以在项目的任意位置单独创建一个文件写UnitTest, 但是这个文件的名称必须是XXX_test.go.

在这个文件中, package的名称必须要和你要测的函数的名称一样.

然后, 在这个文件的开头导入:

import "testing"

然后, 测试函数的格式必须是如下:

func TestXXX(t *testing.T) {

}

然后函数中写你自己的逻辑, 如果测试不通过, 你可以调用这样一个函数:

t.Errorf(占位符, 参数)

来标注错误信息.

一种比较优雅的测试用例的写法如下:

testcases := []struct {
  // 这里写一个测试用例所需要的数据
        /* ID for this bytecode opcode */
        op Opcode
        /* operand value */
        operands []int
        /* Combine opcode and operand, the final generated bytecode */
        expected []byte
    }{
      // 这里构造结构体写具体的测试用例
        /* Testcase 1 */
        { OpConstant, []int{ 65534 }, []byte{ byte(OpConstant), 255, 254 } },
    }

// 然后遍历去写逻辑
for _, testcase := range testcases {
  // 
}

写完了测试用例之后, 执行的命令的格式如下:

go test -v <单元测试文件所在的目录> -run=<你要运行哪个测试函数> -count=1
  • -v: 如果你在单元测试函数中, 用到了Print, 那么加上-v的话就会输出在终端, 如果不加-v就不会输出.
  • 一般来说, 所有单元测试文件都会放到一个目录里面.
  • -run后面指定的是正则表达式, 匹配到的测试函数会被运行.
  • -count=1: 单元测试编译后的结果禁止缓存.

Go语言的性能测试

假设现在你要看你写的Go函数的性能如何.

你可以在项目的任意位置创建一个文件, 但是这个文件的名称必须叫XXX_test.go.

在这个文件中, package的名称必须要和你要测的函数的名称一样.

然后在这个文件开头加上:

import "testing"

测试函数的格式必须是:

func BenchmarkXXX(b *testing.B) {
  for i := 0; i < b.N; i ++ {
    /* 这里写你要测试的函数 */
  }
}

执行的命令的格式如下:

go test -v <性能测试所在目录> -bench=<你要运行哪个benchmark> -count=1 -benchmem -benchtime=<benchmark运行的时间>
  • -bench: 后面指定的是benchmark函数的正则表达式.
  • -benchmem: 表示输出内存消耗.
  • -benchtime: 表示你要运行的每个benchmark函数要跑多长时间, 如果是1秒就用1s.

Go Profiling

Go语言可以进行性能调优, 在运行Benchmark函数的时候, 在go test命令中需要加上这样两个选项:

  • -memprofile=<Mem-Profiling输出文件的路径>
  • -cpuprofile=<CPU-Profiling输出文件的路径>

之后, 用如下命令:

go tool pprof <Profiling文件>

就可以进入Profiling模式, 进入到这个模式后, 就可以用一些命令去查看函数中哪些语句的cost最多等.