Go 单元测试和基准测试

go 默认以 _test.go 后缀代表测试文件,比如源文件 upload.go, 测试文件为 upload_test.go。必须导入 testing 包,不需要 main 函数。

  1. 单元测试方法名称以 Test 开头,参数为 t *testing.T
  2. 基准测试方法名称以 Benchmark 开头,参数为 t *testing.B

常用测试方法有:

  • Fail() 失败,继续测试
  • FailNow(): 失败,终止测试
  • Log(): 输出错误信息
  • Error(): 失败并且输出日志,不终止运行
  • Fatal(): 失败并且输出日志,终止运行
  • Skip(): 跳过当前测试

单元测试示例:

package go_test

import (
    "testing"
)

func TestUpload(t *testing.T) {

  t.Log("输出错误信息")
  // t.Error("失败并且输出日志,不终止运行")
  // t.Fatal("失败并且输出日志,终止运行")
  // t.FailNow("失败,终止测试")
  // t.Fail("失败,继续测试")
  // t.Skip("跳过测试")

}

相关命令:

  • go test 运行所有单元测试,不含基准测试
  • go test -v 测试并输出详细信息
  • go test -v upload_test.go -run TestUpload 指定文件和指定方法测试
  • go test -v upload_test.go -run TestU 指定文件和匹配 U 开头方法测试

-run 参数进行正则匹配

-v 输出信息

基准测试示例:

测试不同方法把 int 转字符串的性能。

package go_test

import (
    "fmt"
    "strconv"
    "testing"
)

func BenchmarkSprintf(b *testing.B) {
    num := 10
    b.ResetTimer()
    for i := 0; i < b.N; i++ {
        fmt.Sprintf("%d", num)
      }
}

func BenchmarkFormat(b *testing.B) {
    num := int64(10)
    b.ResetTimer()
    for i := 0; i < b.N; i++ {
        strconv.FormatInt(num, 10)
    }
}

func BenchmarkItoa(b *testing.B) {
    num := 10
    b.ResetTimer()
    for i := 0; i < b.N; i++ {
        strconv.Itoa(num)
    }
}

相关命令

  • go test -bench=. -v -run=none 运行所有基准测试,不运行单元测试
  • go test -bench=. -benchtime=3s -v 指定运行时间为 3 秒
  • go test -bench=BenchmarkItoa 指定运行某个测试

-bench 匹配基准测试

-benchtime 指定基准测试运行时间

-benchmem 查看使用内存

参考资料:https://golang.org/pkg/testing/

打赏作者

您将是第一位评论人!

提醒
avatar