go test 单元测试

本文介绍了Go语言的单元测试工具`go test`的使用,包括各种标志参数、T类型普通测试用例的方法如Name、Parallel、Run,以及B类型基准测试的方法如ReportAllocs、RunParallel。还提到了测试覆盖率的计算和`-short`标志用于跳过特定测试用例。
摘要由CSDN通过智能技术生成

go test [flag] flag 有:

go help testflag 查看有那些 flag:

  • -args: 测试函数接收命令行参数,注意:该参数后所有参数会被当做命令行参数传递给测试用例,正确使用方式举例:go test -v -run TestFibOnce b_test.go -args "in 7" expected=13
  • -c: 将测试文件编译生成可执行函数, 加 -o 指定文件名(默认文件名test.test);
  • 编译:go test -c -o test_fib.test b_test.go
  • 使用二进制文件:./test_fib.test -test.v -test.run TestFibOnce "in=7" expected=13 测试用例同上;T
  • -i: 安装作为测试依赖项的软件包。不要运行测试。
  • -json: 以 json 格式输出。
  • -bench regexp:仅运行与正则表达式匹配的那些基准。多个正则表达式以 / 隔开
  • -benchtime t: 对每个基准运行足够的迭代,以 t 表示为 time.Duration(例如 -benchtime 1h30s)。
  • 默认值为1秒(1s)。
  • 特殊语法 Nx 意味着要运行基准测试N次(例如,-benchtime 100x)。
  • -count n: 运行每个测试和基准测试 n 次(默认为1)。如果设置了-cpu,则对每个 GOMAXPROCS 值运行n次。示例始终运行一次。
  • -cover: 覆盖率
  • -covermode set,count,atomic: 设置要测试的包装的覆盖率分析的模式。
  • -cpu: 指定应为其执行测试或基准的GOMAXPROCS值的列表。 默认值为GOMAXPROCS的当前值。
  • -failfast: 第一次测试失败后,请勿开始新的测试。
  • -list regexp: 列出 与正则匹配的测试用例列表,例如 go test -list Test . 列出名字以 Test 为开头的测试用例;
  • -parallel n: 调用t.Parallel的测试功能。并设置 并行运行的测试数量为n,n 默认为 GOMAXPROCS,请注意,-parallel仅适用于单个测试二进制文件。
  • -run regexp: 执行与正则表达式相匹配的测试用例;
  • -short: 一个快速测试的标记,在测试用例中可以使用 testing.Short() 来绕开一些测试,详细使用方法看 -short 的使用;
  • -timeout d: 如果测试用例的运行时间超过持续时间 d,则出现恐慌。如果 d 为 0,则禁用超时。默认值为 10分钟(10m);
  • -v: 显示详细测试信息,打印 t.Log()t.Logf() 输出;
  • -benchmem: 打印基准测试的内存分配统计信息。
  • -blockprofile block.out: 性能剖析, 记录 阻塞事件的分析数据 到 block.out,可以供给go tool pprof 使用。
  • 例如:
    go tool pprof test.test block.out 输入 web 会生成 svg 图像(需要安装 graphviz):
    在这里插入图片描述
  • -blockProfilerate n: 探查器每n纳秒中采样一个阻塞事件;
  • -coverprofile cover.out: 看覆盖率
  • -cpuprofile cpu.out: 性能剖析, 记录 cpu 性能刨析 到文件,可以供给 go tool pprof 使用
  • 例如:
    go tool pprof test.test cpu.out 输入 web 会生成 svg 图像(需要安装 graphviz):
    在这里插入图片描述
  • -memprofile mem.out: 性能剖析, 同上 记录内存使用数据到文件,可以供给 go tool pprof 使用
  • 例如:
    go tool pprof test.test mem.out 输入 web 会生成 svg 图像(需要安装 graphviz):
    mem

打印/报告

  1. 当我们遇到一个断言错误的时候,标识这个测试失败,会使用到:
Fail: 测试失败,测试继续,也就是之后的代码依然会执行
FailNow: 测试失败,测试中断

在 FailNow 方法实现的内部,是通过调用 runtime.Goexit() 来中断测试的。

  1. 当我们遇到一个断言错误,只希望跳过这个错误,但是不希望标识测试失败,会使用到:
SkipNow: 跳过测试,测试中断
在 SkipNow 方法实现的内部,是通过调用 `runtime.Goexit()` 来中断测试的。
  1. 当我们只希望打印信息,会用到 :
Log: 输出信息
Logf: 输出格式化的信息

注意:默认情况下,单元测试成功时,它们打印的信息不会输出,可以通过加上 -v` 选项,输出这些信息。但对于基准测试,它们总是会被输出。

  1. 当我们希望跳过这个测试,并且打印出信息,会用到:
Skip: 相当于 Log + SkipNow
Skipf: 相当于 Logf + SkipNow
  1. 当我们希望断言失败的时候,标识测试失败,并打印出必要的信息,但是测试继续,会用到:
Error: 相当于 Log + Fail
Errorf: 相当于 Logf + Fail
  1. 当我们希望断言失败的时候,标识测试失败,打印出必要的信息,但中断测试,会用到:
Fatal: 相当于 Log + FailNow
Fatalf: 相当于 Logf + FailNow

T 类型 普通测试用例

T 类型用于管理测试状态并支持格式化测试日志。测试日志会在执行测试的过程中不断累积,并在测试完成时转储至标准输出。测试用例以 Test 开头:

// 被测试的函数
func Fib(n int) int {
   
    if n < 2 {
   
            return n
    }
    return Fib(n-1) + Fib(n-2)
}
// 执行测试
func TestFib(t *testing.T) {
   
    var fibTests = []struct {
   
        in       int // input
        expected int // expected result
    }{
   
        {
   1, 1},
        {
   2, 1},
        {
   3, 2},
        {
   4, 3},
        {
   5, 5},
        {
   6, 8},
        {
   7, 13},
    }

    for _, tt := range fibTests {
   
        actual := Fib(tt.in)
        if actual != tt.expected {
         // 断言结果是否和预期相等
            t.Errorf("Fib(%d) = %d; expected %d", tt.in, actual, tt.expected)
        }
    }
}
/* go test -v -run TestFib b_test.go
# 参数说明: 
    -v  打印详细信息
    -run 运行执行测试用例函数
    后跟用例寻找范围,文件名 或 "."(代表当前目录下所有文件)
# 输出:
=== RUN   TestFib
--- PASS: TestFib (0.00s)
PASS
ok      command-line-arguments  0.002s
*/
除了打印报告的方法外还有:方法:
Name 返回当前测试用例名称
func (t *T
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值