Golang笔记之testing

Go工具链

常用命令

  • build
build           compile packages and dependencies

最常用的go command之一,编译go文件
跨平台编译: env GOOS=linux GOARCH=amd64 go build
  • install
install             compile and install packages and dependencies

也是编译,与build最大的区别是编译后会将输出文件打包成库放在pkg下
常用于本地打包编译的命令: go install

  • get
get             download and install packages and dependencies

用于获取go的第三方包,通常会默认从git repo上pull最新的版本
常用命令如: go get -u github.com/go-sql-driver/mysql (从github上获取mysql的driver并安装到本地)
  • fmt
fmt             gofmt (reformat) package sources

类似于C中的lint, 统一代码风格和排版
常用命令如: go fmt

  • test
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=.
  • 传参要保证函数稳态
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值