Go中的单元测试和基准测试
单元测试:测试程序在各种数据下的准确性
基准测试(压力测试):测试程序的速度及弹性
testing包被专门用来进行自动化测试,日志和错误报告。并且还包含一些基准测试函数的功能
测试文件必须满足 *_test.go这种格式*代表源文件的名字(测试代码和业务代码分开了)
_test程序不会被普通的Go编译器编译。只有gotest会编译所有的程序(普通和测试)
测试文件(测试源代码)中必须导入import testiong
测试函数必须以TestZzz为格式(Zzz是函数名,如TestAdd(t *testing.T))
T是传给测试函数的结构类型,用来管理测试状态,支持格式化测试日志,t.Log,t.Error,t.ErrorF
以下函数用来通知测试失败:
func (t *T)Fail()//标记为失败,并继续执行
func (t *T) FailNow()//标记为失败并终止此文件的执行,继续下一个文件
func (t *T) Log(args ...interface{})//args 被用默认的格式格式化并打印到错误日志。
func (t *T) Fatal(args ...interface{})//先执行第三个,在执行第二个(上面两个的综合)
go test来编译测试程序,并执行程序中所有的TestZzz函数,所有的测试都通过会打印出PASS
gotest可以接收多个go文件作为参数,并指定选项。结合 --chatty或-v选项,每个执行的测试函数以及测试状态会被打印。
例如 go test fmt_test.go --chatty
testing包中有一些类型和函数可以用来做简单的基准测试:测试代码中必须包含BenchmarkZzz
以Benchmark开头,并接收一个 *testing.B的类型的参数
go test -test.bench=.* 会运行所有的基准测试函数。(代码中的函数会被调用N次,并展示N的值和函数执行的平均时间,单位为ns。如果使用testing.Benchmark调用这些函数,只会直接运行)
package even
import "testing"
func TestEven(t *testing.T){
for num := 0;num <=100 ;num++ {
if Even(num){
t.Log("is a Even")
}else {
t.FailNow()
}
}
}
func TestOdd(t *testing.T){
for num := 0;num<= 100 ;num++{
if Odd(num){
t.Log("is a odd")
}else {
t.Log("is.t a odd")
}
}
}
package even
func Even(i int)bool{
if i%2 == 0 {
return true
} else {
return false
}
}
func Odd(i int)bool{
if i%2 == 0{
return false
}else {
return true
}
}
单元测试:
对于测试程序来说,go test 包名 会直接运行包内所有的_test.go文件,以及这些文件各自所含有的TestXxx函数。(注意是自动执行,相当于执行主函数一样,执行结束之后转而执行下一个。类似于主函数吧。并在控制台打印函数里要打印的。注意,不需要主函数,这是个测试框架testing)
基准测试:
func BenchmarkEven(b *testing.B){
for num := 0;num <=100 ;num++ {
num := 101
Even(num)
fmt.Println("asdf")
}
}
func BenchmarkOdd(b *testing.B){
num := 100
Odd(num)
fmt.Println("asdfasdf")
}