golang项目中Test的用法
一、文件名必须是xxx_test.go格式
满足此格式时,运行go test命令,会自动去识别该文件,并执行。(也可以使用go test -v 查看详细信息)
建议比如test的目标函数是main.go中的函数,则新建test文件名称为main_test.go
二、test文件中必须import testing包
三、test文件下的每一个test case(函数)均必须以Test开头并且符合TestXxx形式,负责go test会直接跳过不执行。
比如 main.go中需要测试的函数是Pringt123,那么test文件中的test 函数名则建议为 TestPrint123
四、test case的入参为 t *testing.T或者b *testing.B
五、t.Errorf为打印错误信息,并且当前test case会被跳过
六、t.SkipNow()为跳过当前test,并且会直接按Pass处理继续下一个test。要生效时,必须写在第一行。
main.go
func Print1to20() int { res := 0 for i := 0; i <= 20; i++{ res += i } return res }
main_test.go
func TestPrint1to20(t *testing.T) {
res := Print1to20()
fmt.Println("Hey")
if res != 210{
t.Errorf("Wrong result of Print1to20")
}
}
七、注意要点
一个test文件中有多个test case时,如何控制执行顺序
1.使用t.Run来控制执行顺序和输出
func testPrint1to20(t *testing.T) { res := Print1to20() fmt.Println("Hey") if res != 210{ t.Errorf("Wrong result of Print1to20") } } func testPrint2(t *testing.T) { res := Print1to20() fmt.Println("Hey2") res ++ if res != 211{ t.Errorf("Wrong result of Print2") } }
#使用t.Run() func TestAll(t *testing.T) { t.Run("TestPrint1to20", testPrint1to20) t.Run("TestPrint2", testPrint2) }
2.使用TestMain作为初始化test,并且使用m.Run()来调用其他tests可以完成一些需要初始化操作的testing,比如数据库连接,文件打开等;
如果没有在TestMain()中调用m.Run()则除了TestMain()以外其他的tests都不会被执行
func TestMain(m *testing.M) { fmt.Println("tests begin") m.Run() }
八、benchmark函数
benchmark函数一般以Benchmark开头
benchmark的case一般会运行b.N次,每次执行都会如此
在执行过程中会根据实际case的执行时间是否稳定会增加b.N的次数以达到稳态
benchmark同样受m.Run()方法控制