Go单元测试

go单元测试 #

go语言的源代码文件扩展名为.go
go单元测试文件以 _test.go 结尾

go test命令 #

go test命令:遍历所有以*_test.go结尾的文件(即执行测试代码)
所有以 _test.go为后缀名的源文件在执行go build时不会被构建成包的一部分,它们仅是go test测试的一部分

go test 【工程名|工程名/包名即目录名】
    如: go test jellygo  执行jellygo工程下所有单元测试文件
或者cd到工程目录下执行go test,如:
    cd  ~/go/src/jellygo/
    go test -v  其中-v参数打印详情
    单元测试匹配的方法名,增加-run参数,如:go test -run="French|Canal" -v
执行显示测试覆盖率,用-cover参数: go test -cover
把测试覆盖结果保存到c.out文件:go test -cover -coverprofile=c.out
把c.out覆盖结果转成html文件:go tool cover -html=c.out

_test.go文件编写格式 #

1. 在*_test.go文件中,有三种类型的函数:测试函数、基准测试(benchmark)函数、示例函数
2. 测试函数(功能测试):
    函数名以Test开头,紧跟的方法名首字母也大写,驼峰式,且必须导入testing包,如:import "testing",
          测试方法固定参数:t *testing.T ,testing包的T结构体(即接收T结构体指针对象)
          testing.T结构体继承了testing.common结构体
    格式:
       func Test方法名(t *testing.T) {//方法名首字母大写,大驼峰式
           //测试代码,且无返回值
       }
    示例:func TestSay(t *testing.T)  { }
3. 基准测试函数(性能测试):
    函数名以Benchmark开头,固定参数为b *testing.B(即为testing包的B结构体指针对象)
        testing.B结构体继承了testing.common结构体
    格式:
        func Benchmark方法名(b *testing.B) {//方法名首字母大写,大驼峰式

        }
    执行基准测试函数,加一个参数-bench=.
4. 示例函数(为文档提供示例文档): 函数名以Example开头,无参无返回值
    格式:
        func Example方法名() {//方法名首字母大写,大驼峰式,无参也无返回值

        }

代码示例 #

my.go源代码文件内容如下:
    package main

    //返回一个拼接了"hi,"前缀的字符串
    func Say(str string) string {
        return "hi," + str
    }

my_test.go文件内容如下-单元测试用例:
    package main

    import (
    	"fmt"
    	"strings"
    	"testing"  //测试包
    )

    func TestSay(t *testing.T)  {
    	if Say("jelly")=="hi,jelly" {
            fmt.Println(t.Name())  //TestSay
            t.Log("打印了一下log,单元测试方法名:" + t.Name()) //my_test.go:15: 打印了一下log,单元测试方法名:TestSay
        } else {
            t.Error("发生了错误,单元测试方法名:" + t.Name())  //my_test.go:17: 发生了错误,单元测试方法名:TestSay
            t.Errorf("Say(%#v) != hi,jelly", 123)//my_test.go:18: Say(123) != hi,jelly
        }
    }

    func TestSplit(t *testing.T) {
    	words := strings.Split("a:b:c:d", ":")
    	assertEqual(len(words), 3)  //调用私有方法
    }

    //自定义私有方法-断言
    func assertEqual(x, y int) {
    	if x != y {
    		panic(fmt.Sprintf("%d != %d", x, y))
    	}
    }

testing.T结构体类常用方法总结 #

t.Name() 获取单元测试方法名
t.Log("日志内容") 打印日志内容且在内容前自动追加文件名和代码行数
t.Error("自定义的错误信息")  打印错误信息,并标记单元测试失败
t.Errorf("错误信息,字符串格式", 值1,值N) 按格式拼接,打印字符串 如:t.Errorf("Say(%q) != hi,jelly", 123)
    底层调用的是fmt.Sprintf("字符串格式", 参数变量...)
t.Fail() 标记单元测试失败
t.FailNow()
Build by Loppo 0.6.15