前言:
go开发集成工具满足开发过程中单元测试、性能测试、代码格式化、代码规范检测需求。
单元测试:
测试文件以_test.go结尾,项目中默认每一个.go文件同级目录都会有一个对应的_test.go文件。
测试文件需要导入testing包,单元测试函数需要以Test
为前缀,格式为:
func TestXxx(*testing.T)
以下为示例:
// util.go文件内容
package util
func AddInt(a, b int) int {
return a + b
}
func addString(a, b string) string{
return a
}
//util_test.go
package util
import "testing"
func TestAdd(t *testing.T) {
num := AddInt(1, 2)
if num != 1+2 {
t.Errorf("1+2error, value %v", num)
}
}
func TestString(t *testing.T) {
str := addString("123", "456")
if str != "123456" {
t.Errorf("123+456 error, value %v", str)
}
}
func TestMoreAdd(t *testing.T) {
// 便于添加测试数据
cases := []struct {
Name string
A, B, Expected int
}{
{"t1", 1, 2, 3},
{"t2", 2, 3, 5},
{"t3", 1, 2, 31},
}
for _, c := range cases {
t.Run(c.Name, func(t *testing.T) {
if ans := AddInt(c.A, c.B); ans != c.Expected {
t.Fatalf("%v + %v expected %v, but %v got",
c.A, c.B, c.Expected, ans)
}
})
}
}
在当前路径下运行 go test -v 命令可以查看每个用例的测试结果:
PS D:\Programme\study\golang\util> go test -v
=== RUN TestAdd
--- PASS: TestAdd (0.00s)
=== RUN TestString
--- FAIL: TestString (0.00s)
util_test.go:15: 123+456 error, value 123
=== RUN TestMoreAdd
=== RUN TestMoreAdd/t1
=== RUN TestMoreAdd/t2
=== RUN TestMoreAdd/t3
--- FAIL: TestMoreAdd (0.00s)
--- PASS: TestMoreAdd/t1 (0.00s)
--- PASS: TestMoreAdd/t2 (0.00s)
--- FAIL: TestMoreAdd/t3 (0.00s)
util_test.go:33: 1 + 2 expected 31, but 3 got
FAIL
exit status 1
FAIL _/D_/Programme/study/golang/util 1.392s
如果想运行特定的测试用例可以运行 go test -v -run TestAdd
PS D:\Programme\study\golang\util> go test -v -run TestAdd
=== RUN TestAdd
--- PASS: TestAdd (0.00s)
PASS
ok _/D_/Programme/study/golang/util 2.023s
如果想查看单元测试用例的代码覆盖率可以运行 go test -cover
PS D:\Programme\study\golang\util> go test -cover
--- FAIL: TestString (0.00s)
util_test.go:15: 123+456 error, value 123
--- FAIL: TestMoreAdd (0.00s)
--- FAIL: TestMoreAdd/t3 (0.00s)
util_test.go:33: 1 + 2 expected 31, but 3 got
FAIL
coverage: 100.0% of statements
exit status 1
FAIL _/D_/Programme/study/golang/util 1.646s
性能测试(基准测试):
性能测试函数以Benchmark开头,格式为:
func BenchmarkXxx(*testing.B)
测试用例如下:
//util_test.go
package util
import (
"testing"
"fmt"
)
func BenchmarkSprintf(b *testing.B) {
// 重置计时器
b.ResetTimer()
// 停止计时器
b.StopTimer()
// 开始计时器
b.StartTimer()
for i := 0; i < b.N; i++ {
AddInt(i, i)
}
}
func TestFoo(t *testing.T) {
// <setup code>
t.Run("A=1", func(t *testing.T) { fmt.Println("A=1") })
t.Run("A=2", func(t *testing.T) { fmt.Println("A=2") })
t.Run("B=1", func(t *testing.T) { fmt.Println("B=1") })
// <tear-down code>
}
运行命令 go test -bench=. -benchmem -run=none可以查看排除单元测试的性能测试和内存使用情况
[root@VM-0-10-centos util]# go test -bench=. -benchmem -run=none
goos: linux
goarch: amd64
BenchmarkSprintf 1000000000 0.359 ns/op 0 B/op 0 allocs/op
PASS
ok _/root/study/golang/util 0.403s
代码格式化:
可以在当前包路径运行go fmt 命令自动对索引.go文件进行代码的格式化。
go fmt默认对当前路径下的所有go文件进行代码格式化,你也可以指定一个文件或者目录进行代码格式化 。
go fmt -s会开启代码简化功能:
1:简化不必要的类型声明
2:去除数组切片操作时不必要的索引指定
3:去除循环时非必要的变量赋值
代码规范检测:
Golint作为代码规范检测,会对代码做以下几个方面检查
package注释 必须按照 “Package xxx 开头”
package命名 不能有大写字母、下划线等特殊字符
struct、interface等注释 必须按照指定格式开头
struct、interface等命名
变量注释、命名
函数注释、命名
各种语法规范校验等
安装方式:
链接:https://pan.baidu.com/s/1_MmqBqpwrwv8W8v6CSxJtg
提取码:ycw8
下载压缩包,解压到$GOPATH/src文件夹下,进入$GOPATH\src\golang.org\x\lint下运行go install即可安装golint工具