golang项目中test的写法
main_test.go文件
package main
import (
"testing"
"fmt"
)
func TestPrint(t *testing.T){
res := Print1to20()
fmt.Println("testing")
if res != 210{
t.Errorf("Result Worng!")
}
}
Test注意要点:
- 每个test文件必须import一个testing
- test文件下的每一个test case均须以Test开头并且符合TestXxx形式,否则go test会直接跳过测试不执行
- test case的入参为t *testing.T或者b *testing.B
- t.Errorf为打印错误信息,并且当前test case会被跳过
- t.SkipNow()为跳过当前test,并且直接按PASS处理继续下一个test,例子如下:
package main
import (
"testing"
"fmt"
)
func TestPrint(t *testing.T){
t.SkipNow()
res := Print1to20()
fmt.Println("testing")
if res != 210{
t.Errorf("Result Worng!")
}
}
-
Go的test不会保证多个TestXxx是顺序执行,但是通常会顺序执行
-
使用t.Run来执行subtest可以做到控制test输出已经test的顺序,例子如下:
package main
import (
"testing"
"fmt"
)
func TestPrint(t *testing.T){
t.run("a1", func(t *testing.T){fmt.Println("a1")})
t.run("a2", func(t *testing.T){fmt.Println("a2")})
t.run("a3", func(t *testing.T){fmt.Println("a3")})
}
- 使用TestMain作为初始化test,并且使用m.Run()来调用其它tests可以完成一些需要初始化操作的testing,毕业数据库连接,文件打开,REST服务登陆等,例子如下:
func TestMain(m *testing.M){
fmt.Println("test main first")
m.Run()
}
- 如果没有在TestMain中调用m.Run()则除了TestMain以外的其它tests都不会执行
下面来看一个控制test顺序和TestMain的例子:
package main
import (
"testing"
"fmt"
)
func testPrint(t *testing.T){
res := Print1to20()
fmt.Println("testing")
if res != 210{
t.Errorf("Result Worng!")
}
}
func testPrint2(t *testing.T){
res := Print1to20()
fmt.Println("testing")
if res != 220{
t.Errorf("TestPrint2 Worng!")
}
}
func TestAll(t *testing.T){
t.Run("TestPrint", testPrint)
t.Run("TestPrint2", testPrint2)
}
func TestMain(m *testing.M){
fmt.Println("TestMain runing...")
m.Run() // 注释本行后会如何?动手试一下吧~
}