《go语言圣经》——测试

82 阅读2分钟

测试函数

  • 每个测试函数必须导入testing
  • 测试函数的名字必须以Test开头,可选的后缀名字必须以大写字母开头
  • 其中的t参数用于报告测试失败和附加的日志信息

对于word包下的函数:

package word

func IsPalindrome(s string) bool {
    for i := range s {
       if s[i] != s[len(s)-1-i] {
          return false
       }
    }
    return true
}

我们定义word_test文件,测试代码如下:

package word

import "testing"

func TestIsPalindrome(t *testing.T) {
    if !IsPalindrome("detartrated") {
       t.Error("IsPalindrome(detartrated) = false")
    }
    if !IsPalindrome("kayak") {
       t.Error("IsPalindrome(kayak) = false")
    }
}

func TestNonPalindrome(t *testing.T) {
    if IsPalindrome("palindrome") {
    }
    t.Error("IsPalindrome(palindrome) = true")
}

在命令行中直接执行:

//测试所有测试函数并输出详细的测试信息
go test -v
//只测试指定函数
go test -v -run [testFuncName]

为了测试函数方便扩展,我们可以使用表格驱动的方式来编写测试函数:

func TestIsPalindrome(t *testing.T) {
    var tests = []struct {
        input string
        want  bool
    }{
        {"", true},
        {"a", true},
        {"aa", true},
        {"ab", false},
        {"kayak", true},
        {"detartrated", true},
        {"A man, a plan, a canal: Panama", true},
        {"Evil I did dwell; lewd did I live.", true},
        {"Able was I ere I saw Elba", true},
        {"été", true},
        {"Et se resservir, ivresse reste.", true},
        {"palindrome", false}, // non-palindrome
        {"desserts", false},   // semi-palindrome
    }
    for _, test := range tests {
        if got := IsPalindrome(test.input); got != test.want {
            t.Errorf("IsPalindrome(%q) = %v", test.input, got)
        }
    }
}

基准测试

基准测试是测量一个程序在固定负载下的性能。在Go语言中,基准测试和普通得测试函数写法类似,需要以Benchmark为前缀名,通过*testing.B参数中的N来控制循环次数。例如:

func BenchmarkIsPalindrome(b *testing.B) {
    for i := 0; i < b.N; i++ {
       IsPalindrome("palindrome")
    }
}

执行:

//不需要带前缀哦,需要注意
go test -bench=IsPalindrome

image.png

  • 基准测试函数名后的数字代表线程数目
  • 509393134 代表程序执行的次数
  • 2.145 ns 是平均执行一次耗时

性能分析

对不同的参数进行测试
go test -cpuprofile=cpu.out
go test -blockprofile=block.out
go tst -memprofile=men.out

go test -run=NONE -bench=xxx. -cpuprofile=cpu.out 
go tool pprof -text ./xxx cpu.log