测试函数
- 每个测试函数必须导入
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
- 基准测试函数名后的数字代表线程数目
- 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