Go commands (build, test, vet) #
go vet
#
https://pkg.go.dev/cmd/go#hdr-Report_likely_mistakes_in_packages
可以认为是 Go 的静态检查工具,如测试无法访问到的死代码等。
自从 Go 1.12 以后,就不允许使用 go tool vet
来直接调用 vet
库了。
- https://pkg.go.dev/cmd/[email protected]#hdr-Using_vet_directly
- https://pkg.go.dev/cmd/[email protected]#pkg-overview
注:在 Go 1.12 版本之前,go tool vet
才能遍历目录,go vet
不支持递归检测。
go build
#
https://pkg.go.dev/cmd/go#hdr-Compile_packages_and_dependencies
go build -ldflags
#
传送至 go tool link
调用参数。
-s
去除符号表和调试信息。-w
去除 DWRAF 符号表。-X
importpath.name=value
改变变量值。仅两种情况下有效:- 预定义未赋值字符串:
var name string
。 - 预定义已赋值常量字符串:
var name = "constant string"
。
- 预定义未赋值字符串:
go build -asmflags
#
传送至 go tool asm
调用参数。
go build -gcflags
#
传送至 go tool compile
调用参数。
https://pkg.go.dev/cmd/compile
go test
#
https://pkg.go.dev/cmd/go#hdr-Test_packages https://pkg.go.dev/cmd/go/internal/test
匹配文件名为 *_test.go
的测试代码文件,若文件名开头为 _
或 .
则会被忽略。
测试文件中应声明所属包名为 *_test
。
go test
有两种模式:
- 本地目录模式(local directory mode):在没有包名调用时,则进入本地目录模式(如
go test
或go test -v
)。此时go test
会编译在当前目录中所能找到的所有包并运行测试,且该模式下测试结果不会被缓存。 - 包列表模式(package list mode):若向
go test
传入包名参数,则会进入此模式(如go test <pkg_name>
,go test ./...
或go test .
。此模式下会缓存测试结果。
go test -bench
#
运行基准测试,参数是正则表达式,层级用 /
来分隔,如 -bench=X/Y
。则顶层需要匹配 X
,子层需要匹配 Y
。
基准测试结果解读(启用内存统计):
BenchmarkAddBig-8 1000000000 0.3173 ns/op 0 B/op 0 allocs/op
BenchmarkAddBig
:基准测试用例名。8
:基准测试的GOMAXPROCS
的值(Processor 的个数)。1000000000
:基准测试的总迭代次数b.N
。0.3173 ns/op
:平均每次迭代所消耗的纳秒值。0 B/op
:平均每次迭代内存所分配的字节数。0 allocs/op
:平均每次迭代内存的分配次数。
go test -benchtime
#
运行每个基准测试的时间,默认为 1s。
go test -count
#
运行每个测试的次数,默认为 1。如果设置了 -cpu
值,则为每个指定的 Processor ,一个用例跑 n 次。
go test -cover
#
开启覆盖率分析。
go test -covermode
#
设置覆盖率分析模式:
set
模式:判断语句是否运行。count
模式:记录语句运行次数。atomic
模式:同语句运行次数,线程安全。
go test -coverpkg
#
指定包开启覆盖率分析。形式为:-coverpkg pattern1,pattern2,pattern3
,仅对匹配到模式的包开启覆盖率分析。
go test -coverprofile
#
设置覆盖率分析输出文件。形式为 -coverprofile=cover.out
。
为了将覆盖率展示出来,需要使用 go tool cover
工具:https://pkg.go.dev/cmd/cover 。只需这样就可以轻松可视化覆盖率:go tool cover -html=cover.out
。
go test -list
#
形式为 -list regexp
,列出给定测试名表达式的下所有满足的测试。仅会列出当前层级的测试,不会列出子级测试(不支持层级)。
go test -run
#
形式为 -run regexp
,参数是正则表达式,层级用 /
来分隔。如 -run=X/Y
会运行所有顶层匹配到 X
且子层匹配到 Y
或仅有 X
没有子测试的测试。
样例
package test_test
import (
"fmt"
"testing"
)
func TestAdd1(t *testing.T) {
t.Run("Add1", func(t *testing.T) {
fmt.Println("TestAdd1/Add1")
})
t.Run("Add2", func(t *testing.T) {
fmt.Println("TestAdd1/Add2")
})
}
func TestAdd2(t *testing.T) {
t.Run("Add1", func(t *testing.T) {
fmt.Println("TestAdd2/Add1")
})
t.Run("Add2", func(t *testing.T) {
fmt.Println("TestAdd2/Add2")
})
}
func TestAdd3(t *testing.T) {
for i := 1; i <= 2; i++ {
t.Run(fmt.Sprintf("Add%d", i), func(t *testing.T) {
fmt.Println(fmt.Sprintf("TestAdd3/Add%d", i))
})
}
}
func TestAdd4(t *testing.T) {
// no sub-tests
fmt.Println("TestAdd4")
}
运行命令:
$ go test -run=Add/Add2
TestAdd1/Add2
TestAdd2/Add2
TestAdd3/Add2
TestAdd4
PASS
ok test 0.006s