Go测试

Go测试

go test子命令是Go语言包的测试驱动程序。在一个包目录中, 以_test.go结尾的文件不是go build命令的编译目标, 而是go test的编译目标

*_test.go文件中, 有三种测试相关的函数是需要区别对待的, 分别是: 功能测试函数、基准测试函数、示例函数.

  • 功能测试函数: 以Test为函数命名前缀, 主要用来检测程序逻辑的正确性. test报告结果是PASS还是FAIL
  • 基准测试函数: 以Benchmark为函数命名前缀, 主要用来测试某些操做的性能. test汇报操做的平均执行时间
  • 示例函数: 以Example为函数命名前缀, 用来提供机器检查过的文档

测试命令

Go测试命令格式如下:

go test [...options]

options有如下选项:

  • -v : 输出每个测试用例的名称和执行时间: go test -v
  • -run="args": args是一个正则表达式, test只运行与args正则匹配的函数

测试类型

go在testing包中提供的测试方法中提供了两种类型以供测试:TB。两种类型分别用于不同的测试场景,其中T类型主要用于单元测试、集成测试等。B类型主要用于性能测试

T类型

T类型用于管理测试状态并支持格式化测试日志,测试日志会在执行测试的过程中不断累积,并在测试完成时转储至标准输出。单元测试中,传递给测试函数的参数是 *testing.T 类型。当一个测试的测试函数返回时,又或者当一个测试函数调用 FailNowFatalFatalfSkipNowSkip 或者 Skipf 中的任意一个时,该测试即宣告结束,跟 Parallel 方法一样,以上提到的这些方法只能在运行测试函数的 goroutine 中调用。至于其他报告方法,比如 Log 以及 Error 的变种, 则可以在多个 goroutine 中同时进行调用。T 类型内嵌了 common 类型,common 提供这一系列方法,经常用到的如下:

  1. 基础测试报告方法

    • 当遇到断言错误,标志测试失败时:

      Fail:测试失败,测试继续。测试代码会继续执行,并不会中断测试

      FailNow:测试失败,中断测试

    • 当遇到断言错误,只希望跳过这个错误并不标识失败时:

      SkipNow:跳过当前测试,中断测试。内部使用runtime.Goexit()来中断测试

    • 当只希望打印信息时会用到:

      Log:输出日志

      Logf:格式化日志输出

    • 当希望跳过这个测试,并且打印信息时:

      Error:相当于Log + Fail

      Errorf:相当于Logf + Fail

    • 当断言失败,希望标识测试失败,打印出必要信息且终端测试时:

      Fatal:相当于Log + FailNow

      Fatalf:相当于Log + FailNow

  2. Parallel并行测试

    Parallel方法调用之后表示当前测试只会与其他带有Parallel方法的测试并行进行测试。通常用于测试锁、channel读写等。如果代码能够并行测试,写测试时尽量加上Parallel,这样可以测出一些可能的问题


最后修改于 2023-10-08