Go commands (build, test, vet)

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 库了。

注:在 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 调用参数。

https://pkg.go.dev/cmd/link

  • -s 去除符号表和调试信息。
  • -w 去除 DWRAF 符号表。
  • -X importpath.name=value 改变变量值。仅两种情况下有效:
    1. 预定义未赋值字符串:var name string
    2. 预定义已赋值常量字符串:var name = "constant string"

go build -asmflags #

传送至 go tool asm 调用参数。

https://pkg.go.dev/cmd/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 有两种模式:

  1. 本地目录模式(local directory mode):在没有包名调用时,则进入本地目录模式(如 go testgo test -v )。此时 go test 会编译在当前目录中所能找到的所有包并运行测试,且该模式下测试结果不会被缓存。
  2. 包列表模式(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