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()