go test

使用TestMain 或自定义Test* 为测试增加前置\后置方法调用

  • 自定义testFun1, testFun2..方法 , test的t是小写, 这样不会被默认调用
  • 自定义Test*方法, Test的T 大写, 这样可以被go test 工具识别
  • 在Test*方法中按顺序 编写 t.Run("fun_name", fun)
  • 编写TestMain方法 , 调用beforeInit, m.Run()(会调用其它Test*方法) afterClear

    不写TestMain方法, 直接在 Test*方法中调用也一样,
    有TestMain方法时, go test 只会识别 TestMain, 所以要显示调用 m.Run() 来调用其它测试方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package test
import (
"bytes"
"fmt"
"os/exec"
"testing"
)

// cmd.go (写在一个文件中方法读代码)
// 待测试方法,
func ExecShell(s string) (string, error) {
cmd := exec.Command("/bin/bash", "-c", s)
var out bytes.Buffer
cmd.Stdout = &out
err := cmd.Run()
if err != nil {
return "", err
}
return out.String(), nil
}

func testExecShell(t *testing.T) {
t.Log("testExecShell")
_, err := ExecShell("ls")
if err != nil {
t.Error(err)
}
}

func testFun1(t *testing.T) {
t.Log("testFun1")
}

func beforeInit() {
fmt.Println("beforeInit")
}

func afterClear() {
fmt.Println("afterClear")
}

func TestAll(t *testing.T) {
t.Run("testExec..", testExecShell)
t.Run("testfun1", testFun1)
}

// 在测试中增加前置/后置函数调用的方法, 思路: 自定义测试的新入口,
// 1 自定义testFun1, testFun2..方法 , test的t是小写, 这样不会被默认调用
// 2 自定义Test*方法, Test的T 大写, 这样可以被go test 工具识别
// 3 在Test*方法中按顺序 编写 t.Run("fun_name", fun)
// 4 编写TestMain 方法 , 调用beforeInit, m.Run()(会调用其它Test*方法) afterClear
// 当前不写TestMain方法, 直接在 Test*方法中调用也一样
func TestMain(m *testing.M) {
fmt.Println("TestMain")
beforeInit()
m.Run()
afterClear()
//m.Run()
}

输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// go test -v 
---------------------
TestMain
beforeInit
=== RUN TestAll
=== RUN TestAll/testExec..
cmd_test.go:25: testExecShell
=== RUN TestAll/testfun1
cmd_test.go:33: testFun1
--- PASS: TestAll (0.01s)
--- PASS: TestAll/testExec.. (0.01s)
--- PASS: TestAll/testfun1 (0.00s)
PASS
afterClear
ok com.huoli.saas-manager/src/common/util/test 0.022s