Go语言实战流媒体视频网站(2.2)

1,415 阅读1分钟

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注意要点:

  1. 每个test文件必须import一个testing
  2. test文件下的每一个test case均须以Test开头并且符合TestXxx形式,否则go test会直接跳过测试不执行
  3. test case的入参为t *testing.T或者b *testing.B
  4. t.Errorf为打印错误信息,并且当前test case会被跳过
  5. 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!")
  }
}
  1. Go的test不会保证多个TestXxx是顺序执行,但是通常会顺序执行

  2. 使用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")})  
}
  1. 使用TestMain作为初始化test,并且使用m.Run()来调用其它tests可以完成一些需要初始化操作的testing,毕业数据库连接,文件打开,REST服务登陆等,例子如下:
func TestMain(m *testing.M){
	fmt.Println("test main first")
	m.Run()
}
  1. 如果没有在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() // 注释本行后会如何?动手试一下吧~
}