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()方法控制

 

你可能感兴趣的:(golang项目中Test的用法)