Go工具链
常用命令
build compile packages and dependencies
最常用的go command之一,编译go文件
跨平台编译: env GOOS=linux GOARCH=amd64 go build
install compile and install packages and dependencies
也是编译,与build最大的区别是编译后会将输出文件打包成库放在pkg下
常用于本地打包编译的命令: go install
get download and install packages and dependencies
用于获取go的第三方包,通常会默认从git repo上pull最新的版本
常用命令如: go get -u github.com/go-sql-driver/mysql (从github上获取mysql的driver并安装到本地)
fmt gofmt (reformat) package sources
类似于C中的lint, 统一代码风格和排版
常用命令如: go fmt
test test packages
运行当前包目录下的tests
常用命令如: go test 或go test -v等
golang的test
main.go
main_test.go
- Go的test一般以xxx_test.go为文件名
- xxx的部分一般为xxx_test.go所要测试的代码文件名
- Go并没有特别要求xxx的部分必须是要测试的文件名
- go test -v
package main
import (
"testing"
"fmt"
)
func TestPrint(t *testing.T){
res := Print1to20()
fmt.Println("hey")
if res != 210{
t.Errorf("Wrong result of Print1to20")
}
}
2-2 golang项目中test的写法
Test的写法
- 每一个test文件必须import一个testing
- test文件下的每一个test case必须均以Test开头并且符合TestXxxx形式,否则go test会直接跳过测试不执行
- test case的入参为t *testing.T或者 b *testing.B
- t.Errorf为打印错误信息,并且当前test case会被跳过
- t.SkipNow()为跳过当前test,并且直接按PASS处理继续下一个test
- t.SkipNow() 写在等一行
Test注意要点
- Go的test不会保证多个TestXxx顺序执行,但是通常会按顺序执行
- 使用t.Run来执行subtests可以做到控制test输出以及test的顺序
// 顺序执行
func TestPrintSub(t *testing.T){
t.Run("a1",func(t *testing.T){fmt.Println("a1")})
t.Run("a2",func(t *testing.T){fmt.Println("a2")})
t.Run("a3",func(t *testing.T){fmt.Println("a3")})
}
- 使用TestMain作为初始化test,并且使用m.Run()来调用其他tests可以完成一些需要初始化操作的testing,
- 比如数据库连接,文件打开,Rest服务登录等
// TestMain
func TestMain(m *testing.M){
fmt.Println("test main first")
m.Run()
}
- 如果没有在TestMain中调用m.Run()则除了TestMain以外的其他tests都不好被执行
2-3 golang项目中benchmark的写法
Test之benchmark
- benchmark函数一般以Benchmark开头
- benchmark的case一般会跑b.N次,而且每次执行都会如此
- 在执行过程中会根据实际case的执行时间是否稳定会增加b.N的次数以达到稳态
// go test -bench=.
func BenchmarkAll(b *testing.B){
for n := 0; n < b.N; n++{
Print1to20()
}
}
- 执行命令 go test -bench=.
- 传参要保证函数稳态